You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest.js设置的Refresh Token Cookie在Next.js页面刷新/关闭后无法持久化的问题求助

Nest.js设置的Refresh Token Cookie在Next.js页面刷新/关闭后无法持久化的问题求助

大家好,我遇到一个头疼的问题:用户登录后,我的Nest.js后端会把refresh token作为Cookie返回,但这个Cookie在Next.js页面刷新或者关闭后就消失了,导致后续无法调用refresh接口获取新的access token。

我是在服务器端设置的这个refresh token Cookie,本以为配置是安全有效的,但就是没法持久化。下面是我的相关代码和配置,麻烦各位帮忙看看哪里出问题了🙏

后端Nest.js的登录与刷新接口逻辑

@Post('/login')
@UsePipes(new ZodValidationPipe(authenticateBodySchema))
async login(
  @Body() body: AuthenticateBodySchema,
  @Res({ passthrough: true }) response: Response,
) {
  const { email, password } = body

  const user = await this.authService.validateUser(email, password)

  const { senha, ...userWithoutPassword } = user

  const token = this.authService.generateAccessToken(user.id)

  const refreshToken = this.authService.generateRefreshToken(user.id)

  response.cookie('refreshToken', refreshToken, {
    path: '/',
    httpOnly: true,
    secure: this.configService.getOrThrow('ENVIRONMENT') === 'PRODUCTION',
    sameSite: true,
    maxAge: 7 * 24 * 60 * 60 * 1000,
  })

  return { token, user: userWithoutPassword }
}

@Post('/refresh')
async refresh(
  @Req() request: Request,
  @Res({ passthrough: true }) response: Response,
) {
  const refreshToken = request.cookies.refreshToken

  const { sub, user } =
    await this.authService.validateRefreshToken(refreshToken)

  const generatedAccessToken = this.authService.generateAccessToken(sub)

  const generatedRefreshToken = this.authService.generateRefreshToken(sub)

  const { senha, ...userWithoutPassword } = user

  response.cookie('refreshToken', generatedRefreshToken, {
    path: '/',
    httpOnly: true,
    secure: this.configService.getOrThrow('ENVIRONMENT') === 'PRODUCTION',
    sameSite: false,
    maxAge: 7 * 24 * 60 * 60 * 1000,
  })

  return { token: generatedAccessToken, user: userWithoutPassword }
}

Nest.js主文件(Main.js)配置

import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { ConfigService } from '@nestjs/config'
import { Env } from './env'
import * as cookieParser from 'cookie-parser'

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    cors: {
      origin: ['http://localhost:3001', 'https://mywebsite.vercel.app'],
      credentials: true,
    },
  })

  app.use(cookieParser())

  const configService: ConfigService<Env, true> = app.get(ConfigService)

  const port = configService.get('PORT', { infer: true })

  await app.listen(port)
}
bootstrap()

前端Next.js的登录逻辑

const signIn = async (email: string, password: string) => {
  const response = await AuthService.login(email, password)

  const decodedToken = jwtDecode(response.token)

  if (!decodedToken.exp) {
    toast('Erro ao fazer login')
    return
  }

  destroyCookie(undefined, 'mywebsite-token')

  const tokenExpiration = (decodedToken?.exp * 1000 - Date.now()) / 1000

  setCookie(undefined, 'mywebsite-token', response.token, {
    maxAge: tokenExpiration,
  })

  http.defaults.headers.Authorization = `Bearer ${response.token}`

  setUser(response.user)

  router.replace('/receitas')
}

现象说明

登录成功后,我能在浏览器的开发者工具里看到后端返回的refreshToken Cookie,但是一旦刷新页面或者关闭浏览器重新打开,这个refreshToken就不见了,导致无法调用refresh接口更新access token。

备注:内容来源于stack exchange,提问作者Nilton Schumacher F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:24:34