我最近一直在后端/前端工作。 我正在构建一个简单的笔记应用程序,我对登录过程有疑问。
我正在使用 next.js 应用程序目录,并且我正在尝试使用 google oauth 登录和 next-auth。 我想知道如何在这个过程中管理令牌。
在其他博客中,您多次提到“cookie”和“本地存储”。 但我在后端使用express,并且我想将access_token存储在数据库中。
这是代码
export const authOptions: NextAuthOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID ?? '',
clientSecret: process.env.GOOGLE_SECRET ?? '',
}),
],
session: {
strategy: 'jwt',
maxAge: 30 * 24 * 60 * 60, // 30 days
updateAge: 24 * 60 * 60, // 24 hours
},
secret: process.env.NEXTAUTH_SECRET,
callbacks: {
async signIn({ user, account }) {
const dataToSend = {
user: {
...user,
accessToken: account?.access_token,
expires: account?.expires_at,
},
};
const res = await fetch(
`${process.env.NEXT_PUBLIC_SERVER_URL}/api/user`,
{
method: 'POST',
body: JSON.stringify(dataToSend),
},
);
if (!res.ok) {
console.error('error!');
return false;
}
return true;
},
async jwt({ token, account }) {
if (account) {
token.accessToken = account.access_token;
}
return token;
},
async session({ session, token }) {
session.user = token as any;
return session;
},
},
};
这里我们使用 jwt 和 session 通过“useSession hooks”从客户端或服务器获取 access_token。 我还可以在登录时将 access_token 放入服务器数据库中。
当我们发送请求时,我们将“session.user.access_Token”放入带有授权的标头中。
但是我有一个问题,我不知道如何处理刷新令牌,每当我登录时,都会发送令牌并且过期时间不断更新,即每当我登录时,令牌都会不断更新。
这是正确的做法吗?如果还有其他方法请告诉我。
此外,当我使用 next-auth 时,看起来我有一个 prisma 适配器。
登录时使用prisma适配器将数据直接保存到数据库后,
当需要accessToken时,客户端通过useSession hook获取token,后端将其与DB中存储的token进行比较并授权请求?
回复我写的。 我在我的 Express 服务器上使用 DB,但我将其更改为不在 DB 中存储令牌。
相反,我也在express上安装了next-auth作为一个包。 当客户端请求 API 时,如果您查看 cookie,它会发送下一个身份验证令牌。
并且快递服务器解密该令牌。 为此,我们使用 getToken 函数。这可以从 next-auth 库导入。
希望您不必像我一样经历同样的尝试和错误。