将 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 集成的主要内容,如果未能解决你的问题,请参考以下文章
将Amazon Cognito与Ionic集成以进行离线同步
创建 AWS Cognito 用户池时出现 Terraform 错误
如何将 Amazon Cognito 与适用于 Android 的 Google Plus 集成?