我是AWS新手,所以请放轻松:) 我已经设置了概念证明,以证明由lambda支持的具有以下组件的经过身份验证的API。
API网关->由Lambda支持 由AWS Cognito UserPool支持的联合身份 我在API网关中设置了授权者设置,以使用联合身份验证池提供的IAM角色。
我可以看到来自https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference的身份(ap-southeast-2:<GUID>
)进入网关(在集成请求映射模板"$context.identity.cognitoIdentityId"
中使用此身份)
如何从网关或lambda将'ap-southeast-2:<GUID>'
解析回位于用户池中的源身份。 (例如,从其中提取自定义属性之一)
其他相关信息,我正在使用Amplify-AWS来调用API网关的客户端。
TIA。
答案 0 :(得分:1)
您要注意,作为身份提供者的Cognito与作为用户池的Cognito不同。
联合身份提供了一种使某人获得对您的AWS资源的识别访问权的方法。身份提供者为您提供的identity_id
几乎可以被视为跟踪代码。 CIP(Congito [联合]身份提供程序)允许您通过任何数量的提供程序(不仅是用户池)登录,甚至根本不登录,从而获得身份ID。
用户池为您提供了一种管理应用程序用户(即一组用户名,电子邮件,密码等)的方式。
这是很难从identity_id
返回到用户池用户的原因(因为不能保证是用户池用户,很可能是来自Facebook的人)
不过,根据您所说的,identity_id
来自UserPool身份验证的假设是安全的。这意味着您有两个选择:
官方方法将是使用identity:GetOpenIdToken将identity_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