将 Nestjs 与 Cognito 集成

Posted

技术标签:

【中文标题】将 Nestjs 与 Cognito 集成【英文标题】:Integrating Nestjs with Cognito 【发布时间】:2020-08-16 22:31:23 【问题描述】:

我正在将来自 Cognito 的 JWT 授权集成到我的 Nestjs 应用程序中,我遇到了一种鸡与蛋的情况。

如果为我的 Cognito 客户端生成 clientSecret,我将收到以下错误:

“无法验证客户端 Client_Id 的秘密哈希”

如果我在 Cognito 中创建新客户端时取消选中 clientScret generation,我将在应用程序编译时收到以下错误:

[ExceptionHandler] JwtStrategy 需要密钥或密钥 +0ms

我一直按照本指南来实施它:https://brightinventions.pl/blog/using-cognito-with-nest-js/,但它并没有真正解决任何这些问题。

有人可以在这里提供一些指导吗?

【问题讨论】:

嗨,你在这方面取得了进展吗? 我还没有开始实现它,但是我被指出了这篇文章,它展示了如何在 JwtStrategy 构造函数中使用 secretOrKeyProvider 而不是 secretOrKey:auth0.com/blog/… 如果你是,请回帖成功,否则,如果我事先设法做到,我会在这里发布答案。 没问题...我想我会在周末处理它 【参考方案1】:

您分享的教程让后端处理用户注册、登录和退出。我想将访问令牌委托给 AWS Cognito。

对于请求受保护资源的用户,后端通过两种方式验证作为不记名令牌传递的访问令牌:

使用中间件:https://github.com/katesroad/Cognito-as-Authentication-Provider-for-NestJs/blob/main/backend/src/common/middlewares/auth.middleware.ts

另外,这个链接值得一读https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

如何验证 AWS Cognito 池生成的 jwt 令牌。

如果您不想访问其他用户信息,通过验证用户的访问令牌来验证用户就足够了。

如果要获取用户的其他信息(如邮箱和自定义属性),可以使用自己共享的版本或者通过JWT token中存储的用户子id获取用户信息。

谢谢,编码愉快。希望对您有所帮助。

【讨论】:

检查这个问题,用警卫验证仍然有一些问题github.com/nestjs/jwt/issues/235【参考方案2】:
import  ExtractJwt, Strategy  from 'passport-jwt';
import  PassportStrategy  from '@nestjs/passport';
import  Injectable, Logger, UnauthorizedException  from '@nestjs/common';
import  passportJwtSecret  from 'jwks-rsa';


@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) 
  constructor() 
    super(
      secretOrKeyProvider: passportJwtSecret(
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: https://cognito-idp.region.amazonaws.com/userPoolId/.well-known/jwks.json
      ),

      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      audience: 'client id',
      issuer: https://cognito-idp.<region>.amazonaws.com/<userpoolID>.
      algorithms: ['RS256'],
      
    );
  

  async validate(payload: any) 
    console.debug('JWT VALIDATION')
    return !!payload.sub;
  


【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于将 Nestjs 与 Cognito 集成的主要内容,如果未能解决你的问题,请参考以下文章

将用户从 cognito 用户池迁移到身份池

将Amazon Cognito与Ionic集成以进行离线同步

创建 AWS Cognito 用户池时出现 Terraform 错误

如何将 Amazon Cognito 与适用于 Android 的 Google Plus 集成?

有啥方法可以在 AWS Lambda 中获取 Cognito 用户名?

AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份