通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户

Posted

技术标签:

【中文标题】通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户【英文标题】:Identify user within AWS Lambda from authorization token generated via Cognito 【发布时间】:2020-01-10 11:01:29 【问题描述】:

我们使用API Gateway 来公开位于AWS Lambdas 前面的API。作为授权方,Cognito 用户池已在 API 网关中用于对用户进行身份验证并保护受保护的端点。因此,一般流程是,用户通过 API 网关端点 (/grantToken) 传递以下信息以从 cognito 获取访问令牌:

1. App client id
2. App client secret
3. username
4. password

在获得access_token 后,用户在访问受保护的端点时在标头中传递此授权令牌。 Cognito 自动授权用户,并将请求重定向到特定的 AWS Lambda。这一切都很好。

我想知道的是,在 lambda 中,来自授权令牌(在标头中传递) - 我如何确定传递了哪个用户的令牌?还有其他方法可以确定授权用户的身份吗? AWS Cognito 在这种情况下有什么用吗?

注意:如果我可以从传递的授权令牌中获得App client id,它将达到我的目的。

【问题讨论】:

如果您对我的回答满意,请采纳。 【参考方案1】:

回答您的问题:

1.如何确定传递了哪个用户的令牌?

您可以使用任何 JWT 令牌解码器,例如 jsonwebtoken

例如:

var jwt = require('jsonwebtoken'); // you can use import
var decoded = jwt.verify(token, secret);
console.log(decoded) // bar

2。有没有其他方法可以确定授权用户的身份?

您可以使用访问令牌通过 GetUser 方法从 cognito 获取用户详细信息。

参考:https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html

3.如果我可以从传递的授权令牌中获取 App 客户端 ID,它将达到我的目的。

无法从授权令牌中获取应用客户端 ID。

通常,您在 AWS 管理控制台的“用户池”部分中为 aws Cognito 创建应用程序时收到的客户端应用程序 ID。

用户池访问令牌包含有关经过身份验证的用户的声明,但与 ID 令牌不同,它不包含身份信息。访问令牌的主要目的是在用户池中的用户上下文中授权 API 操作。

参考:https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html#amazon-cognito-user-pools-using-the-access-token

正确的做法:

您应该在 nodejs .env 文件中存储相同的 App 客户端 ID、机密信息,并在需要时访问它。 此网址将帮助您找到应用程序客户端 ID:https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html

【讨论】:

【参考方案2】:

您可以使用GetUser API 将 access_token 交换为包括用户名在内的用户详细信息。只需更新您的 lambda 代码即可进行此调用。

【讨论】:

【参考方案3】:

对于 Google 员工:

如果您想在 Lambda 中访问 JWT 声明,请在授权者完成其工作后,在 event 参数下找到它们,这是传递给您的 Lambda 的第一个参数。

这对于带有 JWT 授权器(Cognito 支持)的 HTTP API 是正确的,也应该在其他情况下工作。

文档再次混淆使用$context,这不是HTTP API + Lambda + JWT Authorizer的要求。

【讨论】:

以上是关于通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AWS cognito 授权代码获取访问和刷新令牌

AWS Cognito:处理令牌过期时间

如何配置 AWS 用户 cognito 身份验证流程以在 Java sdk 后端生成身份令牌、访问令牌?

AWS Cognito:生成令牌并在使用 amazon-cognito-identity-js SDK 刷新后

从查询字符串中的令牌授权 AWS API Gateway 请求

AWS Cognito 网络流量相关问题