使用next.js auth(next auth)我正在创建CredentialsProvider,尝试将其连接到django后端。除了刷新令牌策略之外,一切都很好:在获得新的访问令牌后,访问令牌和过期日期没有保存。所以下一个认证是发送刷新令牌每个请求。我不知道为什么,但我不能更新令牌数据后,"第一次令牌创建"。
下面是代码:
async function refreshAccessToken(token) {
console.log('UPDATE')
const refresh = await axios
.post('/token/refresh/', {
refresh: token.refreshToken
})
.catch((error) => {
console.log(error)
})
if (refresh && refresh.status === 200 && refresh.data.access) {
return {
...token,
accessToken: refresh.data.access,
expiresAt: Date.now() + 10 * 1000
}
}
return {
...token,
error: 'RefreshAccessTokenError'
}
}
export default NextAuth({
providers: [
CredentialsProvider({
id: 'credentials',
name: 'my-project',
async authorize(credentials) {
const auth = await axios
.post('/token/', {
username: credentials.username,
password: credentials.password
})
.catch((error) => {
console.log(error)
})
if (auth.status === 200 && auth.data.access) {
const profile = await axios
.get('/v1/profile/', {
headers: {
Authorization: `Bearer ${auth.data.access}`
}
})
.catch((error) => {
console.log(error)
})
if (profile.status === 200 && profile.data) {
return {
...profile.data,
tokens: auth.data
}
}
}
return null
}
})
],
pages: {
signIn: '/login'
},
callbacks: {
jwt: async ({ token, user, account }) => {
if (account && user) {
return {
// works normally
accessToken: user.tokens.access,
refreshToken: user.tokens.refresh,
expiresAt: Date.now() + 10 * 1000,
user
}
}
if (Date.now() < token.expiresAt) {
return token
}
// token is obtaining in refreshAccessToken but not saved...
// next request refreshAccessToken will be called again...
return refreshAccessToken(token)
},
session: async ({ session, token }) => {
session.user = token.user
session.token = token.accessToken
return session
}
},
debug: true
})
任何帮助请。这里是简化的例子:
jwt: async ({ token, user, account }) => {
console.log(token.expiresAt)
// here token.expiresAt will NEVER be equals 'hey'
if (account && user) {
return {
accessToken: user.tokens.access,
refreshToken: user.tokens.refresh,
expiresAt: Date.now() + 10 * 1000,
user
}
}
if (Date.now() < token.expiresAt) {
return token
}
token.expiresAt = 'hey'
return token
}
2条答案
按热度按时间zqdjd7g91#
我不知道这是否会完全涵盖您的用例,因为我认为它更适合内置的OAuth提供程序,但在他们的文档站点上有一个如何处理刷新令牌的教程。
参见:https://next-auth.js.org/tutorials/refresh-token-rotation
我也使用我的NextAuth在一个简单的项目中实现了类似的东西,请在这里查看:www.example.comhttps://github.com/ndom91/newtelco-tab/blob/3f4153c7aa94c7f6cfeeb3778be3cdb1ec6ee243/src/pages/api/auth/%5B...nextauth%5D.ts#L32
gjmwrych2#
我认为您需要
return await refreshAccessToken(token)
,我在代码中这样做了,它工作正常