Nestjs 身份验证章节和19身份验证示例存在问题

Nestjs 身份验证章节和19身份验证示例存在问题,nestjs,Nestjs,我下载了19 auth示例并向其中添加了一些console.log调试代码,然后发现了一些问题 JwtAuthGuard中的代码从未执行:“2222222”未在以下代码中打印到控制台: canActivate(context: ExecutionContext) { console.log('22222222222'); // add your custom authentication logic here // for example, call super.logIn(request) t

我下载了19 auth示例并向其中添加了一些console.log调试代码,然后发现了一些问题

JwtAuthGuard中的代码从未执行:“2222222”未在以下代码中打印到控制台:

canActivate(context: ExecutionContext) {
console.log('22222222222');
// add your custom authentication logic here
// for example, call super.logIn(request) to establish a session.
return super.canActivate(context);
}
当我在AuthController中将保护更改为JwtAuthGuard时:

@get('data')
@UseGuards(JwtAuthGuard)
findAll(@Req() req) {
return req.user;
// this route is restricted by AuthGuard
// JWT strategy
}
调用了JwtAuthGuard中的代码,但在canActivate函数中,我无法从请求中获取用户信息。而canActivate函数是在JWT策略之前调用的

有人能解释一下auth模块的代码是如何执行的,以及如何在JwtAuthGuard中获取用户信息吗

将最新代码和控制台日志粘贴到此处:

JWT战略

JwtAuthGuard

我想要的是从定制AuthGuard(如JwtAuthGuard)的激活中的请求中获取用户信息,我同意19 auth示例有点令人困惑。这主要是因为它包含JWTAuthGuard作为构建自定义保护的参考,但它从未实际使用过。相反,plain AuthGuard的最初用途已经设置为提供JWT功能。然而,两个守卫都利用JWT策略。如果您想更好地理解这一点,可以尝试更新AuthController:

@get('data')
@UseGuards(JwtAuthGuard)
findAll(@Req() req) {
return req.user;
// this route is restricted by AuthGuard
// JWT strategy
}
重要的一点是,为了通过任何一个保护,必须将授权头正确设置为从令牌端点返回的令牌发送请求

例如:授权:持有人eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJLBWFPFBCI6INRLC3RAZW1HAWWUY29


我发现使用诸如Postman或失眠之类的工具来构造请求和设置头等是最容易的,但您也可以使用CURL。使用有效令牌设置授权标头后,您将能够访问两个受保护的端点。如果您在JWTStrategy中添加一个console.log,您将看到两个防护程序最终都使用validate方法来正确检索用户。

我有一个适合我的解决方案。 在我自己的逻辑之前调用super.canActivate。 似乎是由它触发的req.user的填充。 例如:

import { ExecutionContext, Injectable } from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";
import { Request } from "express";

@Injectable()
export class AuthGuardWithAllowSentry extends AuthGuard("jwt") {
  public async canActivate(context: ExecutionContext) {
    // that code will call the passport jwt
    const origCanActivate = await super.canActivate(context);
    // now we have request.user!


    const http = context.switchToHttp();
    const request = http.getRequest<Request>();

    console.log(request.user)

    if (request.header("X-Sentry-Token") === "blablabla") {
      if (request.method === "GET" && request.path.endsWith(".map")) {
        return true;
      }
    }

    // some random logic
    return request.user.roles.includes("admin")
  }
}

对我来说,这更像是一种解决方法,而不是一件真正的事情。

我按照您的建议更新了代码,但我仍然无法从JwtAuthGuard的函数canActivatecontext:ExecutionContext中的请求中获取用户信息。
canActivate executed 111111111111111111

[Nest] 14080   - 2019-04-01 11:19   [JwtStrategy] payload is {"userName":"fanliang","id":"1","iat":1553772641,"exp":1554377441} +2286ms
it seems that the canActivate() function of JwtAuthGuard executed before the validate() function of JwtStrategy, but the user info was attached to the request after JwtStrategy validate().
  @Get('data')
  @UseGuards(AuthGuard())
  findAll() {
    // this route is restricted by AuthGuard
    // JWT strategy
    return {
      message: 'Successfully passed AuthGuard',
    };
  }

  @Get('custom-jwt')
  @UseGuards(new JwtAuthGuard())
  // this route is restricted by JWTAuthGuard custom
  // JWT strategy
  customJwt() {
    return {
      message: 'Successfully passed JWTAuthGuard',
    };
  }
import { ExecutionContext, Injectable } from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";
import { Request } from "express";

@Injectable()
export class AuthGuardWithAllowSentry extends AuthGuard("jwt") {
  public async canActivate(context: ExecutionContext) {
    // that code will call the passport jwt
    const origCanActivate = await super.canActivate(context);
    // now we have request.user!


    const http = context.switchToHttp();
    const request = http.getRequest<Request>();

    console.log(request.user)

    if (request.header("X-Sentry-Token") === "blablabla") {
      if (request.method === "GET" && request.path.endsWith(".map")) {
        return true;
      }
    }

    // some random logic
    return request.user.roles.includes("admin")
  }
}