我在我的 nestJS 应用程序(使用 authGuard)中使用 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?
I'm using a passport-jwt auth strategy in my nestJS app (with authGuard), how to get access to the token payload in my controller?
我正在尝试访问受 AuthGuard
.
保护的路由中的 jwt 负载
我正在使用 passport-jwt
,令牌负载是用户的电子邮件。
我可以通过运行以下代码来实现:
import {
Controller,
Headers,
Post,
UseGuards,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthGuard } from '@nestjs/passport';
@Post()
@UseGuards(AuthGuard())
async create(@Headers() headers: any) {
Logger.log(this.jwtService.decode(headers.authorization.split(' ')[1]));
}
想知道有没有更好的方法?
您的 JwtStrategy
有一个 validate
方法。在这里您可以访问JwtPayload
。此方法的 return 值将附加到请求中(默认在 属性 user
下)。所以你可以 return 从这里的有效载荷中得到你需要的任何东西:
async validate(payload: JwtPayload) {
// You can fetch additional information if needed
const user = await this.userService.findUser(payload);
if (!user) {
throw new UnauthorizedException();
}
return {user, email: payload.email};
}
然后通过注入请求在您的控制器中访问它:
@Post()
@UseGuards(AuthGuard())
async create(@Req() request) {
Logger.log(req.user.email);
}
您可以通过创建自定义装饰器使这更方便:
import { createParamDecorator } from '@nestjs/common';
export const User = createParamDecorator((data, req) => {
return req.user;
});
然后注入 @User
而不是 @Req
.
我正在尝试访问受 AuthGuard
.
我正在使用 passport-jwt
,令牌负载是用户的电子邮件。
我可以通过运行以下代码来实现:
import {
Controller,
Headers,
Post,
UseGuards,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthGuard } from '@nestjs/passport';
@Post()
@UseGuards(AuthGuard())
async create(@Headers() headers: any) {
Logger.log(this.jwtService.decode(headers.authorization.split(' ')[1]));
}
想知道有没有更好的方法?
您的 JwtStrategy
有一个 validate
方法。在这里您可以访问JwtPayload
。此方法的 return 值将附加到请求中(默认在 属性 user
下)。所以你可以 return 从这里的有效载荷中得到你需要的任何东西:
async validate(payload: JwtPayload) {
// You can fetch additional information if needed
const user = await this.userService.findUser(payload);
if (!user) {
throw new UnauthorizedException();
}
return {user, email: payload.email};
}
然后通过注入请求在您的控制器中访问它:
@Post()
@UseGuards(AuthGuard())
async create(@Req() request) {
Logger.log(req.user.email);
}
您可以通过创建自定义装饰器使这更方便:
import { createParamDecorator } from '@nestjs/common';
export const User = createParamDecorator((data, req) => {
return req.user;
});
然后注入 @User
而不是 @Req
.