【问题标题】:Cognito authorization with two user pool具有两个用户池的 Cognito 授权
【发布时间】:2021-10-08 17:13:55
【问题描述】:
我有一个 API 网关和两个用户池,我想在支持这两个用户池的端点上实现 Cognito。
我的想法是创建一个 lambda 授权,它将作为输入:access_token 并在/oauth2/userInfo 上执行
两个用户池中的一个,知道如果令牌有效,则只有一个用户池才能满足请求。我的 lambda 返回了
- 祝你好 ->
"Effect": "Allow",
- 为 Get Ko ->
"Effect": "Deny"
喜欢在这里解释:link
问题
- 还有其他方法可以支持对两个池进行授权吗?
- 使用 access_token 管理授权是否正常?
- 如果我的 lambda 将 id_token 而不是 access_token 作为输入,我如何验证 id_token 是由我的用户池之一生成的
谢谢!
【问题讨论】:
标签:
python-3.x
oauth-2.0
authorization
amazon-cognito
aws-userpools
【解决方案1】:
标准行为
您的应用应该有一个单独的授权服务器 (AS) 与之通信。可以出于高级目的对用户进行分区,例如 multi-tenancy 或将个人身份信息 (PII) 存储在每个区域的不同数据库中。
第一季度
Cognito 用户池是一个完整的授权服务器 - 如果可能,我的目标是只使用一个,因为这将使您的应用程序中的代码保持简单。
如果您必须使用多个用户池继续使用单个应用程序,请让 API 客户端向您发送一个提示,使您能够知道正在使用哪一个 - 可能通过 API 请求期间自定义标头中的值:
- x-mycompany-user-region:欧盟
- x-mycompany-partner-id: ABC
这将使您能够实现一种基本的基于内容的路由。这种类型的标头仅用于路由,不应用于安全性。
也可以在 Cognito 前面放置 reverse proxy 来执行此类工作 - 请参阅此 Curity article 了解有关此类方法的详细信息,其中声明用于路由请求。
第二季度
是 - 使用包含或引用范围和声明的访问令牌。请注意,Cognito 可能不允许您自定义访问令牌 JWT 内容。
获取自定义声明的一种方法是将访问令牌发送到用户信息端点,然后将结果缓存在授权方中,就像您正在做的那样。如果有帮助,另请参阅 this code of mine。
第三季度
ID 令牌是提供给 UI 的可数字验证的断言,作为身份验证的证明。它不应该用于 API 中的授权。可能是 Cognito 对自定义 ID 令牌有更好的支持 - 但它在 OAuth 术语中是不正确的(例如,到期时间太长/不支持范围)。