在 NestJs 中验证 Google JWT

Posted

技术标签:

【中文标题】在 NestJs 中验证 Google JWT【英文标题】:Authenticate Google JWT in NestJs 【发布时间】:2021-02-09 20:54:58 【问题描述】:

我有一个前端应用程序(角度)。 我正在对 nestjs 后端进行休息调用。

这个休息调用需要一个不记名令牌。 我有来自谷歌的不记名令牌。

但是当我使用它时,我得到了未经授权。

据我了解,我需要获取 google 的密钥。 我读到我从 .well-known 获得了密钥,但我不知道这是哪里。

以下是我的护照策略,我遇到并尝试了一些变化。

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) 

  constructor(
    @InjectRepository(UserRepository)
    private userRepository: UserRepository,
    private configService: ConfigService)

super(
      secretOrKeyProvider: passportJwtSecret(
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: '.well=known URI (I think)',
      ),

      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      issuer: 'https://accounts.google.com',
      algorithms: ['RS256'],
    );
  

  async validate(payload) 
    console.log(payload)
    const  email  = payload;
    const user = await this.userRepository.findOne( email );

    if(!user || !user.isActive) 
      throw new UnauthorizedException();
    

    return user;
  

请帮忙。

谢谢。

【问题讨论】:

【参考方案1】:

我解决了这个问题。由于某种原因,它在我使用的克隆存储库中不起作用,但重新克隆后,它起作用了。

下面是实现。

->'KEYS_URI':这将是一个 uri,其中包含您用来验证令牌的密钥。例如:谷歌-https://www.googleapis.com/oauth2/v3/certs

->'Issuer':这将是发行者的 uri。例如:谷歌-https://accounts.google.com

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) 

  constructor(
    @InjectRepository(UserRepository)
    private userRepository: UserRepository,
    private configService: ConfigService)

    super(
      secretOrKeyProvider: passportJwtSecret(
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: 'KEYS_URI',
      ),
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      issuer: 'Issuer',
      algorithms: ['RS256'],
    );
  

  async validate(payload: JwtPayloadInterface) 

    const  email  = payload;
    const user = await this.userRepository.findOne( email );

    if(!user || !user.isActive) 
      throw new UnauthorizedException();
    

    return user;
  

【讨论】:

以上是关于在 NestJs 中验证 Google JWT的主要内容,如果未能解决你的问题,请参考以下文章

使用passport-jwt在nestJs框架中进行角色验证

NestJS jwt-passport 身份验证

NestJS 在 e2e 测试中模拟 JWT 身份验证

NestJs JWT 身份验证返回 401

NestJS:使用 JWT 向 AuthGuard 添加验证选项

NestJs 使用 jwt 和私钥和公钥进行身份验证