const withAuth = Component => {
const Auth = (props) => {
// Login data added to props via redux-store (or use react context for example)
const { isLoggedIn } = props;
// If user is not logged in, return login component
if (!isLoggedIn) {
return (
<Login />
);
}
// If user is logged in, return original component
return (
<Component {...props} />
);
};
// Copy getInitial props so it will run as well
if (Component.getInitialProps) {
Auth.getInitialProps = Component.getInitialProps;
}
return Auth;
};
export default withAuth;
import { NextComponentType } from "next";
function withAuth<T>(Component: NextComponentType<T>) {
const Auth = (props: T) => {
// Login data added to props via redux-store (or use react context for example)
const { isLoggedIn } = props;
// If user is not logged in, return login component
if (!isLoggedIn) {
return <Login />;
}
// If user is logged in, return original component
return <Component {...props} />;
};
// Copy getInitial props so it will run as well
if (Component.getInitialProps) {
Auth.getInitialProps = Component.getInitialProps;
}
return Auth;
}
export default withAuth;
const signIng = async() =>{
...
api.defaults.headers.someTokenName = token; //Here you can set something just to identify that there is something into someTokenName or your JWT token
...
}
6条答案
按热度按时间zmeyuzjn1#
我个人一直在使用HOC(高阶分量)。
以下是身份验证HOC示例:
您可以将此HOC用于任何页组件。以下是用法示例:
如果需要,您可以使用Auth HOC扩展角色检查,如public、regular user和admin。
nnvyjq4y2#
非常感谢@AleXius您的回答!我已经混合了您的解决方案和这个great article为那些谁想要使用这个特设与 typescript :
j5fpnvbx3#
我认为这取决于页面的类型。
对于静态生成的页面:
您可以像@AleXius建议的那样使用HOC进行身份验证。
对于服务器端呈现的页面:
您可以在
getServerSideProps
中执行身份验证逻辑。对于具有自定义服务器的服务器端呈现页面:
根据您选择的服务器,您可以选择不同的解决方案。对于Express,您可以使用auth中间件。如果您愿意,也可以在
getServerSideProps
中处理它。d8tt03nd4#
除了使用HOC的解决方案之外,您还可以使用next中的ssr方法,如getServerSideProps,在这种情况下,您必须修改您的signIn函数,以便在您的申请中设置一个标题(此标题将说明您是否已登录),如下所示:
然后在yout中使用Auth组件:
这样可以防止Web应用程序从未经身份验证的状态切换到已验证的状态
qv7cva1a5#
下面是一个如何在Next.js中创建私有路由的示例:
首先,创建一个高阶组件(HOC),它将在呈现受保护的路由组件之前检查用户是否经过身份验证:
然后,使用withAuth HOC Package 受保护的路由组件:
最后,在Next.js应用中使用受保护的路由组件,就像使用其他路由一样:
这只是在Next.js中实现私有路由的一种方法,但它应该给予您了解如何实现私有路由。
jxct1oxe6#
这是
typescript
版本,您可以将允许的权限传递给HOC,并将其与登录用户的现有权限进行比较。像这样使用它: