我目前正在制作我的第一个 Next.js 应用程序,但我遇到了身份验证问题。我正在为我的 API 使用 expressjs,并且我的登录路由将刷新令牌设置为 cookie 并返回一个访问令牌。
登录:
res.cookie(
'zis',
sign(payload, REFRESH_TOKEN_SECRET, {
expiresIn: '24h',
}),
{
expires: new Date(Date.now() + 24 * 3600000),
httpOnly: true,
secure: process.env.NODE_ENV !== 'development',
sameSite: 'strict',
}
);
res.json({
accessToken: sign(payload, ACCESS_TOKEN_SECRET, {
expiresIn: '15m',
}),
});
我有另一个路由 /resfresh-token
用于获取新的访问令牌。我的所有其他路由都通过验证访问令牌的中间件 isAuth
进行保护。
到目前为止,我可以从我的下一个 js 页面 signin.js
设置和获取 cookie,并且还通过上下文我使用 getServerSideProps() 将 cookie 传递给其他受保护的页面以获得新的访问权限令牌并验证它。
下一个JS页面:
export async function getServerSideProps(context) {
const cookie = context.req.headers.cookie;
const resRefreshToken = await fetch(
`http://localhost:5000/auth/refresh-token`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
cookie: cookie,
},
}
);
const refreshToken = await resRefreshToken.json();
var bearer = 'bearer ' + refreshToken.accessToken;
const res2 = await fetch(`http://localhost:5000/api/users`, {
headers: {
authorization: bearer,
},
});
const users = await res2.json();
return {
props: { users },
};
}
我的问题首先是,我的方法或逻辑是否错误,有没有办法在每个请求上调用 /refresh-token
而不是在每个页面上重复相同的逻辑。我已经在 getInitialProps
中尝试过 _app.js
但我必须将返回的访问令牌作为 prop 传递并在 DOM 中公开它,我不确定它是否安全。 注意:此应用是一个仪表板,仅供 2 个用户使用。
谢谢