如何使用 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(我正在使用的),方法可以在文档中找到:
- 要设置 cookie,请使用
request.res.cookie()
。
- 要清除 cookie,请使用
request.res.clearCookie()
。
所以,我正常设置了 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(我正在使用的),方法可以在文档中找到:
- 要设置 cookie,请使用
request.res.cookie()
。 - 要清除 cookie,请使用
request.res.clearCookie()
。