React admin authProvider.login 未定义

问题描述

我正在尝试将 React 管理应用程序与 OIDC 集成。从带有代码 (http://react.admin:3000/redirect?code=3d88b9c9-fb31-4165-bad3-28905fddeae2&state=ca3b7d0e0d6d4151ba5a5eb9890c4415) 的身份验证服务器返回时,我会转到重定向页面(我在 Customroutes 中定义了该页面)。这个页面/组件如下:

export default () => {
    const query = new URLSearchParams(useLocation().search);
    const code = query.get('code');
    const state = query.get('state');

    const credentials = { code,state }

    const login = useLogin();
    login(credentials);
    
    return(       
        <Box textAlign='center' paddingTop={5}>
            Login in ...
        </Box>      
    ); ;
}

使用 React Admin 的 useLogin 钩子,它应该执行我在 authProvider 中定义的以下代码

login: (credentials = {}) => {
    if ( credentials.code ) {
        
        userManager.signinRedirectCallback().then(() => {
            userManager.getUser().then((user) => {
                localStorage.setItem('auth',JSON.stringify({firstname: user.profile.name,lastname: user.profile.family_name}));
                return Promise.resolve();
            }).catch(() => { return Promise.reject() });
        }).catch(() => { return Promise.reject() });
    }

当我将 UserManager 日志切换到调试模式时,我看到正在调用 signinRedirectCallback 和 getUser。但是,在执行 UserManager 函数之前,我的 UI 会显示一条错误消息,说明:

TypeError: authProvider.login(...) is undefined

引用“登录(凭据);”这一行在 LoginRedirect 页面中...

我真的很难找到原因:

  1. 为什么我的 LoginRedirect 页面中没有显示消息“登录 ...”
  2. 为什么它声明 authProvider.login 函数是未定义的,因为它调用了其中的 userManager 函数......

欢迎任何建议......

非常感谢 - C

更正 - 4 月 22 日 我终于找到了问题所在。它需要返回一个承诺,因此它的工作原理如下:

    if ( credentials.code ) {
        return userManager.signinRedirectCallback().
            then(result => userManager.getUser(result)).
            then (user => {
                localStorage.setItem('auth',lastname: user.profile.family_name}));
            }).then(result => Promise.resolve()).catch(result => Promise.reject());
    }

在组件页面中:

login(credentials).then(()=>{return}).catch(()=>{return});

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)