我正在尝试了解如何使用next-auth(4.22.1)和nextjs(13.4.5)保存自定义cookie。我的auth-flow的概要:
1.用户在next-auth上使用社交提供程序进行身份验证。
1.在成功认证后,使用signIn回调调用自定义后端API(让我们称之为login)。
- login将在Authorization头中返回access_token,在set_cookie中返回refresh_token。
1.当UI收到来自login API的成功响应时,它允许用户前进。
在这个流程中,我可以将access_token保存在会话中,然后在客户端或服务器端使用它,但是刷新令牌没有保存为cookie,这是可以理解的,因为下一个认证代码正在服务器端执行。**我的问题是,当我需要一个新的access_token时,我如何保存refresh_token,然后将其传递到我的后端?这里的首选方法是在会话中也保存刷新令牌,还是因为没有设置cookie而明显丢失了某些内容?**我的理解是,理想情况下,刷新令牌保存为http_only cookie,以便默认情况下包含在API调用中。
这是我的下一个验证码。我没有改变任何配置它使用的默认值。
import NextAuth from "next-auth/next";
import GithubProvider from "next-auth/providers/github";
import {User, Account, Profile } from "next-auth";
import type { NextApiRequest, NextApiResponse } from "next"
async function auth(req: NextApiRequest, res: NextApiResponse) {
return await NextAuth(req, res, {
providers: [
GithubProvider({
clientId: process.env.GITHUB_CLIENT_ID || '',
clientSecret: process.env.GITHUB_CLIENT_SECRET || '',
}),
],
callbacks: {
async signIn(params: { user: User | undefined; account: Account | null; profile?: Profile | undefined; email?: { verificationRequest?: boolean } | undefined; credentials?: Record<string, any> | undefined }) {
//console.log('signIn', user, account, profile);
const { user, account, profile } = params;
console.log(account?.access_token)
try {
const res = await fetch('http://127.0.0.1:8080/login/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
credentials: 'include',
},
body: JSON.stringify({ token: account?.access_token }),
});
if (res.ok && res.headers && res.headers.get('authorization') && account) {
const test_access_token = res.headers.get('authorization')?.split(' ')[1];
const test_refresh_token = res.headers.get('Set-Cookie');
account.test_access_token = test_access_token;
//account.test_refresh_token = test_refresh_token;
return true;
}
} catch (error) {
console.log(error);
}
return false;
},
async jwt({ token, account, profile }) {
// Persist the OAuth access_token and the user id to the token right after signin
if (account) {
token.test_access_token = account.test_access_token
//token.test_refresh_token = account.test_refresh_token
token.id = profile?.name
}
return token
},
async session({ session, token, user }) {
// Send properties to the client, like an access_token and user id from a provider.
if (token) {
session.test_access_token = token.test_access_token
//session.test_refresh_token = token.test_refresh_token
session.user.id = token.id
}
return session
},
}
});
}
export { auth as GET, auth as POST };
1条答案
按热度按时间3vpjnl9f1#
NextAuth代码在服务器端运行。所以
cookies
不能设置,因为它不是浏览器。我是通过在登录时从重定向路由的客户端重新登录到自定义后端(使用useEffect
)来实现的。