通过 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 身份验证流程以在 Java sdk 后端生成身份令牌、访问令牌?
AWS Cognito:生成令牌并在使用 amazon-cognito-identity-js SDK 刷新后