0

我是 AWS 新手,所以请放轻松 :) 我已经设置了一个概念证明来证明由 lambda 支持的经过身份验证的 API 以及以下组件。

API Gateway -> 由 AWS Cognito UserPool 支持的 Lambda 联合身份支持我在 API 网关中设置了授权方,以使用联合身份池提供的 IAM 角色。

我可以从https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference看到身份 ( ap-southeast-2:<GUID>) 进入网关(在我的集成请求映射模板中使用它) .html#context-variable-reference"$context.identity.cognitoIdentityId"

我如何从网关或 lambda 解析'ap-southeast-2:<GUID>'回驻留在用户池中的源身份。(例如从中提取自定义属性之一)

其他相关信息,我正在使用 Amplify-AWS 来调用 API 网关的客户端。

TIA。

4

1 回答 1

1

正如您所注意到的,作为身份提供者的 Cognito 与作为用户池的 Cognito 不同。

  • Federated Identities 提供了一种方法,可让已识别的人访问您的 AWS 资源。identity_id身份提供者给你的几乎可以被认为是一个跟踪代码。CIP(Congito [Federated] Identity Provider)允许您通过通过任意数量的提供者(不仅仅是用户池)登录,甚至根本不登录来获取身份 ID。

  • 用户池为您提供了一种管理应用程序用户的方式(即一组用户名、电子邮件、密码等)。

这就是从identity_id用户池用户返回很难的原因(因为不能保证它用户池用户,很可能是 Facebook 的某个人)。

但是,从您所说的来看,identity_id来自 UserPool 身份验证的假设是安全的。这意味着您有两个选择:

官方的方法是使用identity:GetOpenIdTokenidentity_id(您可以忽略logins请求的一部分)转换为 OpenId 令牌。然后,您可以针对userpools:GetUser端点使用此令牌。这里有一些陷阱,例如确保您使用允许您查看所有您关心的属性的范围进行身份验证。

然而,奇怪的是, 的值cognitoAuthenticationProvider不是不透明的,并且可以(非官方)被解码:

  // Cognito authentication provider looks like:
  // cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr
  // Where us-east-1_aaaaaaaaa is the User Pool id
  // And qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr is the User Pool User Id

上面的示例,以及有关如何将其与userpools 一起使用的更多详细信息:AdminGetUser可以在此处找到:https ://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id .html

于 2018-10-28T11:02:13.180 回答