在NestJS中使用passport-jwt
策略来处理JWT(JSON Web Tokens)认证时,通常会在中间件或守卫中获取用户的JWT令牌。以下是如何在JWTStrategy
中获取用户JWT令牌的步骤:
JWT是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),这三部分之间用点(.
)分隔。
在NestJS中,你可以使用passport-jwt
策略来解析和验证JWT令牌。以下是一个简单的例子:
npm install passport passport-jwt @nestjs/passport @nestjs/jwt
// auth/jwt.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'your_jwt_secret', // 替换为你的JWT密钥
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
// auth/jwt.module.ts
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'your_jwt_secret', // 替换为你的JWT密阁
signOptions: { expiresIn: '1h' },
}),
],
providers: [JwtStrategy],
})
export class AuthModule {}
// some-route.guard.ts
import { Injectable } from '@nestjs/common';
import { CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { GqlExecutionContext } from '@nestjs/graphql';
import { PassportAuthenticationGuard } from './passport-authentication.guard';
@Injectable()
export class SomeRouteGuard extends PassportAuthenticationGuard implements CanActivate {
constructor(private reflector: Reflector) {
super();
}
canActivate(context: ExecutionContext): boolean | Promise<boolean> {
const ctx = GqlExecutionContext.create(context);
const request = ctx.getContext().req;
const token = this.reflector.get('auth', context.getHandler());
if (!token) {
throw new UnauthorizedException();
}
// 这里可以访问到JWT令牌
console.log('JWT Token:', request.headers.authorization.split(' ')[1]);
return super.canActivate(context);
}
}
问题:无法获取JWT令牌。
原因:
解决方法:
Authorization: Bearer <token>
。passport-jwt
策略配置是否正确。@UseGuards(SomeRouteGuard)
。通过以上步骤,你可以在NestJS的JWTStrategy
中成功获取用户的JWT令牌。
领取专属 10元无门槛券
手把手带您无忧上云