Nestjs Passport-jwt 更好的未授权策略
Nestjs Passport-jwt better Unauthorized strategy
只是浏览有关 NestJS 身份验证的文档:docs.nestjs.com
代码如下:
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
根据文档,当请求包含 jwt 并且 jwt 有效时调用验证方法。
我想知道当请求 header 中缺少 jwt 或 jwt 无效或过期时,是否有回调方法。我想 return 响应错误并向客户发送他们的令牌已过期或丢失的消息...
谢谢
您可以实施自定义策略并根据需要检查 headers 或 cookie。这是我在我的应用程序中使用的(缩短的)示例。
import { JwtService } from '@nestjs/jwt';
import { Strategy } from 'passport-custom';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'custom-jwt') {
constructor(private readonly jwtService: JwtService) {
super();
}
async validate(req: Request): Promise<any> {
const token = req.cookies.auth ?? req.headers.authorization;
if (!token) {
throw new UnauthorizedException();
}
const user = this.jwtService.decode(token, {
json: true
});
if (!user) {
throw new UnauthorizedException();
}
if (this.isExpired(user)) {
throw new UnauthorizedException();
}
return user;
}
private isExpired(user: JwtUserDto): boolean {
// ...
}
}
此代码检查“auth”-cookie 或“授权”-header 中的 jwt 令牌,并通过返回用户,将解码后的用户(如果有效)附加到请求。
要使用它:export class JwtAuthGuard extends AuthGuard('custom-jwt')
这只是一个例子,看看它是如何工作的。您可能需要对其进行调整以满足您的需要。
只是浏览有关 NestJS 身份验证的文档:docs.nestjs.com
代码如下:
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
根据文档,当请求包含 jwt 并且 jwt 有效时调用验证方法。 我想知道当请求 header 中缺少 jwt 或 jwt 无效或过期时,是否有回调方法。我想 return 响应错误并向客户发送他们的令牌已过期或丢失的消息...
谢谢
您可以实施自定义策略并根据需要检查 headers 或 cookie。这是我在我的应用程序中使用的(缩短的)示例。
import { JwtService } from '@nestjs/jwt';
import { Strategy } from 'passport-custom';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'custom-jwt') {
constructor(private readonly jwtService: JwtService) {
super();
}
async validate(req: Request): Promise<any> {
const token = req.cookies.auth ?? req.headers.authorization;
if (!token) {
throw new UnauthorizedException();
}
const user = this.jwtService.decode(token, {
json: true
});
if (!user) {
throw new UnauthorizedException();
}
if (this.isExpired(user)) {
throw new UnauthorizedException();
}
return user;
}
private isExpired(user: JwtUserDto): boolean {
// ...
}
}
此代码检查“auth”-cookie 或“授权”-header 中的 jwt 令牌,并通过返回用户,将解码后的用户(如果有效)附加到请求。
要使用它:export class JwtAuthGuard extends AuthGuard('custom-jwt')
这只是一个例子,看看它是如何工作的。您可能需要对其进行调整以满足您的需要。