node.js - 我在我的 nestJS 应用程序(使用 authGuard)中使用 passport-jwt 身份验证策略,如何访问我的 Controller 中的 token 有效负载?

标签 node.js typescript jwt nestjs passport-jwt

我正在尝试访问受 AuthGuard 保护的路由中的 jwt 负载。

我正在使用 passport-jwt, token 负载是用户的电子邮件。

我可以通过运行下面的代码来实现:

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。此方法的返回值将附加到请求中(默认情况下在属性 user 下)。因此,您可以在此处从有效负载中返回所需的任何内容:

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};
}

然后通过注入(inject)请求在你的 Controller 中访问它:

@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;
});

然后注入(inject)@User而不是@Req

关于node.js - 我在我的 nestJS 应用程序(使用 authGuard)中使用 passport-jwt 身份验证策略,如何访问我的 Controller 中的 token 有效负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570009/

相关文章:

node.js - 当将代码拆分到 Nodejs 中的自定义模块时,尝试将变量传递给另一个模块时,它会变得未定义

node.js - 如何预热 Heroku Node.js 服务器?

javascript - Node : short alias for process. stdout.write

javascript - 是否可以在不使用 Promise 的情况下从异步函数中的回调返回值?

typescript - 在Typescript中,如何导入json并通过key动态查找?

reactjs - useAuth0().user 不显示用户角色

file - 具有文件查询功能的 NodeJS 库

没有子标签的从子到父的 Angular 传递数据

Azure AD B2C 使用电子邮件邀请注册不显示注册页面

validation - 如何共享 OAuth2 JWT 验证的公钥?