Next Auth google OAuth 带有自定义后端的访问令牌和刷新令牌

Two*_*ses 6 javascript authentication next.js nestjs next-auth

我有一个 NestJS 后端,它公开以下 API:

   @Post('sign-in-with-google-account')
   async signInWithGoogleAccount(
     @Body body: { idToken: string }, 
     @Res({ passthrough: true }) response: Response
   ) {
     const user = await getUserFromGoogleIdToken(body.idToken)
     const tokens = await generateAccessAndRefreshTokensForUser(user)

     response.cookie('refreshToken', tokens.refreshToken, {
         httpOnly: true,
         expires: new Date(tokenExpirationDate),
         secure: true,
         sameSite: 'none'
     })

     return { accessToken: tokens.accessToken }
   }
Run Code Online (Sandbox Code Playgroud)

它从 google oauth 接收 id 令牌,在数据库中查找用户并签署 JWT 访问令牌和刷新令牌。刷新令牌存储为httpOnlycookie,并返回访问令牌。

现在,在我配置的 next.js 应用程序中,next-auth我有以下内容:

import GoogleProvider from "next-auth/providers/google";

...
providers: [
  GoogleProvider({
    clientId: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET
  })
]
...

Run Code Online (Sandbox Code Playgroud)

问题是next-auth生成自己的代币。但我想next-auth使用我自己的 NestJS 后端的访问和刷新令牌,我该怎么做?

另外,在 NestJS 中,我有一个 API 可以刷新访问令牌,如下所示:

@Get('refresh-access-token')
async refreshAccessToken(@Req() request: Request) {
  const accessToken = await getNewAccessTokenFromRefreshToken(request.cookies.refreshToken)
  return { accessToken } 
}
Run Code Online (Sandbox Code Playgroud)

我如何知道每 10 分钟(访问令牌到期日期)next-auth使用 API 刷新一次访问令牌?refresh-access-token

小智 0

我认为你需要将之前的时间保存到本地存储,然后与当前时间进行比较来调用api。您可以使用moment.unix()moment.diff()来执行此操作。