用于身份验证的 PrivateRoute 组件

Posted

技术标签:

【中文标题】用于身份验证的 PrivateRoute 组件【英文标题】:PrivateRoute component for authentification 【发布时间】:2020-06-01 13:17:33 【问题描述】:

我正在开发一个 Reactjs-nodejs 应用程序。我想做一个 JWT 认证。当我们登录时,我给用户一个唯一的令牌。然后,多亏了这个令牌,如果它有效,我允许用户浏览我的路由器。我的私人路线组件是这样的: PrivateRoute

我的函数getId是这样的:

异步函数 getId() 让 res = await axios('_/api/users/me',config).catch(err => console.log(err));

返回 res+1;

最后配置组件是存储在 localStorage 中的令牌:

常量配置 = 标头:授权:$window.localStorage.getItem("token") ;

GetId() 如果登录则返回用户的id,否则为null。

现在的问题是我的 privateRoute 总是重定向到“/”路径。我认为这是因为 axios(promise) 给我 userId 太晚了。如果你理解得很好,如果你有解决方案,请告诉我。 谢谢你

【问题讨论】:

欢迎来到*** :) 请将链接图像中的相关代码移至您的问题中。 【参考方案1】:

如果您使用的是 redux,您可以进行以下操作:

减速器:

case LOGIN_ADMIN_SUCCESS:
            localStorage.setItem("token", action.payload.token);
            return 
                ...state,
                user: action.payload,
                isSignedIn: true,
                loadingSignIn: false,
                token: action.payload.token,
            ;

然后在您的私有路由器中,您必须检查这些值,例如

const PrivateRoute = ( component: Component, admin, ...rest ) => (
    <Route
        ...rest
        render=(props) => 
            if (admin.loadingSignIn) 
                return <h3>Loading...</h3>;
             else if (!admin.isSignedIn) 
                return <Redirect to="/login" />;
             else 
                return <Component ...props />;
            
        
    />
);

【讨论】:

你好,我不是,而且我的水平还不够了解redux的一切。无论如何感谢您的回答【参考方案2】:

你可以像这样创建私有路由。

const PrivateRoute = ( component: Component, ...props ) => 
  return (
    <Route
      ...props
      render=innerProps =>
        localStorage.getItem("Token") ? (
          <Component ...innerProps />
        ) : (
          <Redirect
            to=
              pathname: "/",
              state:  from: props.location 
            
          />
        )
      
    />
  );
;

那么你可以使用

<PrivateRoute path="/" component=FIlname />

【讨论】:

你好,问题是如果我在本地存储中手动创建值令牌,我可以访问页面,所以它可能不是正确的解决方案:/

以上是关于用于身份验证的 PrivateRoute 组件的主要内容,如果未能解决你的问题,请参考以下文章

从共享组件库导出`react-router`重定向

React.js身份验证在每次刷新时重定向到登录名

Firebase 身份验证。更新所有项目文件

用于 Web 用户身份验证的 Java 选项

用于 Web 用户身份验证的 Java 选项

Nativescript Vue + Firebase 身份验证:检查用户是不是在每个组件中进行身份验证的最佳方法?