如何使用 NestJS 在 Passport-JS AuthGuard 中操作 cookie?

How to manipulate cookies in Passport-JS AuthGuard with NestJS?

所以,我正常设置了 Local 和 JWT 策略,它们运行得非常好。我通过登录路由设置 JWT cookie。我还想设置刷新 cookie 令牌,然后能够通过 JWT AuthGuard 删除和重置 JWT 令牌,手动刷新它并将 ignoreExpiration 标志设置为 true。

我希望能够通过 JWT AuthGuard 操作 cookie。我已经可以查看它们,但我似乎无法设置它们。有办法做到这一点吗?

/************************
 * auth.controller.ts
 ************************/
import { Controller, Request, Get, Post, UseGuards } from '@nestjs/common';
import { AuthGuard }                                 from '@nestjs/passport';
import { AuthService }                from './auth/auth.service';
import { SetCookies, CookieSettings } from '@ivorpad/nestjs-cookies-fastify';
import { ConfigService }              from '@nestjs/config';


@Controller('auth')
export class AuthController {
    constructor(
        private readonly authService: AuthService,
        private readonly configService: ConfigService,
    ) {}

    @UseGuards(AuthGuard('local'))
    @Post('login')
    @SetCookies()
    async login(@Request() request) {
        const jwtCookieSettings = this.configService.get<CookieSettings>('shared.auth.jwtCookieSettings');
        request._cookies = [{
            name   : jwtCookieSettings.name,
            value  : await this.authService.signJWT(request.user),
            options: jwtCookieSettings.options,
        }];
    }


    @UseGuards(AuthGuard('jwt'))
    @Get('profile')
    async getProfile(@Request() req) {
        return req.user;
    }
}

/************************
 * jwt.strategy.ts
 ************************/
import { Strategy, StrategyOptions } from 'passport-jwt';
import { PassportStrategy }          from '@nestjs/passport';
import { Injectable, Request }       from '@nestjs/common';
import { ConfigService }             from '@nestjs/config';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor(private readonly configService: ConfigService) {
        super(configService.get<StrategyOptions>('shared.auth.strategy.jwt.strategyOptions'));
    }
    
    async validate(@Request() request, payload: any) {
        return payload;
    }
}

根据Passport JWT Guard Configuration Docs,我们可以设置将请求传递给回调,这样我们就可以使用validate方法来控制它(这个选项可以与其他策略也一样)。完成后,您可以查看如何按照 Express(或 Fastify)操作 cookie。

对于Express(我正在使用的),方法可以在文档中找到: