自定义对 jwt 策略 NestJs 验证失败的响应
Customise the response on verification failure for a jwt Strategy NestJs
我使用 nestJs 成功实现了 jwt 身份验证策略。
下面是jwt策略的代码
import { ServerResponse } from './../helpers/serverResponse.helper';
import { Injectable, UnauthorizedException, HttpStatus } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { config as env } from 'dotenv';
import { Bugsnag } from '../helpers/bugsnag.helper';
env();
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
constructor(
private readonly logger: Bugsnag,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET_KEY,
passReqToCallback: true,
});
}
async validate(payload, done: Function) {
try {
const validClaims = await this.authService.verifyTokenClaims(payload);
if (!validClaims)
return done(new UnauthorizedException('invalid token claims'), false);
done(null, payload);
} catch (err) {
this.logger.notify(err);
return ServerResponse.throwError({
success: false,
status: HttpStatus.INTERNAL_SERVER_ERROR,
message: 'JwtStrategy class, validate function',
errors: [err],
});
}
}
}
我看到 here 只有在请求中提供有效令牌时才会调用验证函数 headers,我同意这一点。但是,我想知道是否可以自定义在这种情况下发送的响应 object(提供的令牌无效)。
如果是,我该怎么做?
您可以使用 exception filter 捕获 UnauthorizedException
并根据需要修改那里的响应。另一种选择是扩展 AuthGuard('jwt')
mixin class 并在 try/catch
周围为 super.canActivate(context)
添加一些逻辑,然后在错误中读取原因并抛出一个具体 UnauthorizedException
使用您的自定义消息
您可以使用 AuthGuard('jwt')
的 handleRequest
方法在 JWT 验证失败时抛出任何异常。
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
handleRequest(err: any, user: any, info: any, context: any, status: any) {
if (info instanceof JsonWebTokenError) {
throw new UnauthorizedException('Invalid Token!');
}
return super.handleRequest(err, user, info, context, status);
}
}
JsonWebTokenError
来自 jsonwebtoken
库,passport 内部使用。
我使用 nestJs 成功实现了 jwt 身份验证策略。
下面是jwt策略的代码
import { ServerResponse } from './../helpers/serverResponse.helper';
import { Injectable, UnauthorizedException, HttpStatus } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { config as env } from 'dotenv';
import { Bugsnag } from '../helpers/bugsnag.helper';
env();
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
constructor(
private readonly logger: Bugsnag,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET_KEY,
passReqToCallback: true,
});
}
async validate(payload, done: Function) {
try {
const validClaims = await this.authService.verifyTokenClaims(payload);
if (!validClaims)
return done(new UnauthorizedException('invalid token claims'), false);
done(null, payload);
} catch (err) {
this.logger.notify(err);
return ServerResponse.throwError({
success: false,
status: HttpStatus.INTERNAL_SERVER_ERROR,
message: 'JwtStrategy class, validate function',
errors: [err],
});
}
}
}
我看到 here 只有在请求中提供有效令牌时才会调用验证函数 headers,我同意这一点。但是,我想知道是否可以自定义在这种情况下发送的响应 object(提供的令牌无效)。
如果是,我该怎么做?
您可以使用 exception filter 捕获 UnauthorizedException
并根据需要修改那里的响应。另一种选择是扩展 AuthGuard('jwt')
mixin class 并在 try/catch
周围为 super.canActivate(context)
添加一些逻辑,然后在错误中读取原因并抛出一个具体 UnauthorizedException
使用您的自定义消息
您可以使用 AuthGuard('jwt')
的 handleRequest
方法在 JWT 验证失败时抛出任何异常。
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
handleRequest(err: any, user: any, info: any, context: any, status: any) {
if (info instanceof JsonWebTokenError) {
throw new UnauthorizedException('Invalid Token!');
}
return super.handleRequest(err, user, info, context, status);
}
}
JsonWebTokenError
来自 jsonwebtoken
库,passport 内部使用。