Guard 不在 NestJs 中执行护照策略

Posted

技术标签:

【中文标题】Guard 不在 NestJs 中执行护照策略【英文标题】:Guard doesn't execute passport startegy in nestJs 【发布时间】:2019-07-01 13:14:36 【问题描述】:

我正在使用 nestjs,但在使用守卫对请求进行身份验证时遇到问题。

Gist (full code)

import  PassportStrategy  from '@nestjs/passport';
import  Injectable, UnauthorizedException, HttpStatus, Logger  from '@nestjs/common';
import  Strategy  from 'passport-localapikey-update';
import  size  from 'lodash';

import  AuthService  from './auth.service';

@Injectable()
export class ApiKeyStrategy extends PassportStrategy(Strategy, 'localapikey') 
    constructor(private readonly authService: AuthService) 
        super();
    

    async validate(token: string) 
        Logger.log('HERE!!!!!!!!!!!!!!', 'ApiKeyStrategy');  // Not printed
        const data = await this.authService.authenticateClient(token);
        if (!size(data)) 
            throw new UnauthorizedException('Unauthorized');
        
        return data;
    

@UseGuards(AuthGuard('localapikey')) 不执行并抛出 401 错误。

不打印任何日志。

【问题讨论】:

【参考方案1】:

您必须在护照策略的super 构造函数中传递验证函数。

constructor(private readonly authService: AuthService) 
  super((token, done) => done(null, this.validate(token)));


您也可以将选项对象作为第一个参数传递:

constructor(private readonly authService: AuthService) 
  super(apiKeyField: 'myapikeyfield', (token, done) => done(null, this.validate(token)));


顺便说一句:我建议使用Logger 的实例而不是静态访问它,请参阅this thread。

【讨论】:

我注意到当我在“apiKey”键下的标题中传递 api 键时它工作正常。 localapikey 策略允许通过执行“const strat = new LocalApiKeySStrategy(options)”来改变它。我怎么能在这里做到这一点,因为 PassportStrategy 需要对象而不是实例。 我已将您的附加问题的答案添加为编辑。 我查看了nest.js的代码和passport-localapikey-update库。我认为没有文档。 :-|

以上是关于Guard 不在 NestJs 中执行护照策略的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 错误:未知的身份验证策略“本地”

NestJS:如何在从 JWT AuthGuard 扩展的 GraphQL 自定义 Guard 中从请求中获取用户

使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401

在 NestJs 中验证 Google JWT

Nestjs 单元测试 - 模拟方法守卫

在没有 AuthGuard 的路由上获取 nestjs 中的当前用户