next.js 下次身份验证刷新令牌策略

lyr7nygr  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(163)

使用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
    }
zqdjd7g9

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

gjmwrych

gjmwrych2#

我认为您需要return await refreshAccessToken(token),我在代码中这样做了,它工作正常

相关问题