如何将AWS Cognito的JWT转为不透明对称令牌并自定义授权流?
解决AWS Cognito适配谷歌智能家居的令牌问题及自定义授权流方法
一、替换JWT访问令牌为不透明令牌
谷歌智能家居套件要求使用不透明对称加密的访问令牌,而AWS Cognito默认返回JWT格式令牌,需通过中间层转换解决:
实现步骤:
- 搭建API Gateway代理层:将谷歌的令牌请求导向自定义API Gateway端点,而非直接调用Cognito的token端点。
- 转换令牌并存储:用户完成OAuth授权后,API Gateway接收Cognito返回的JWT access token,生成随机UUID作为不透明令牌,将该令牌与JWT、过期时间等关联信息存入DynamoDB(或Redis缓存提升性能)。
- 返回不透明令牌:将生成的不透明令牌返回给谷歌智能家居服务。
- 实现令牌验证端点:谷歌调用验证端点时,传入不透明令牌,从存储中取出对应的JWT,调用Cognito的
GetUser或VerifyToken接口验证JWT有效性,将验证结果返回给谷歌。
注意:需确保不透明令牌的过期时间与原JWT一致,验证时先检查令牌是否过期,避免无效请求。
二、自定义AWS Cognito授权流
要自定义Cognito的授权流程,核心是利用Lambda触发器和API Gateway扩展OAuth流程:
1. 启用Cognito自定义授权触发器
- 在Cognito用户池的「触发器」设置中,为自定义授权关联Lambda函数。
- 编写Lambda函数处理授权逻辑:比如添加额外的用户属性校验、对接第三方身份系统验证、自定义令牌生成规则等。该函数可拦截授权请求,自定义处理后再调用Cognito原生逻辑,或直接生成符合要求的令牌。
2. 自定义OAuth端点(进阶)
如果需要完全掌控授权流程,可在API Gateway上搭建独立的OAuth授权端点:
- 对接Cognito的authorize端点获取授权码,自定义处理授权码验证逻辑。
- 自行生成不透明令牌(而非使用Cognito的JWT),并将令牌与用户身份信息关联存储。
- 确保端点符合OAuth 2.0 authorization code flow规范,适配谷歌智能家居的OAuth要求。
3. 整合令牌验证逻辑
自定义授权流中,需同步实现令牌验证端点,确保谷歌能正确验证不透明令牌的有效性,验证逻辑需包含:令牌存在性检查、过期时间校验、关联用户身份有效性验证等。
内容的提问来源于stack exchange,提问作者Divyanshu Agrawal
相关产品推荐
相关产品推荐

