通过ALB+Cognito认证获取临时凭证遇阻求助
问题解答
首先明确两个核心结论:
- 你当前的代码无法直接使用访问令牌获取身份池临时凭证,因为Cognito身份池的
GetId和GetCredentialsForIdentity接口要求传入ID令牌,而非访问令牌——ID令牌用于标识用户身份,访问令牌仅用于授权访问Cognito资源,二者用途不同。 - 不能直接用请求头中的访问令牌访问身份池,身份池不支持将Cognito访问令牌作为
Logins参数的有效值。
可行解决方案
既然ALB只传递访问令牌,你可以通过以下步骤间接获取身份池临时凭证:
用访问令牌获取用户身份信息
调用Cognito用户池的GetUser接口,传入访问令牌,获取用户的用户名、用户ID等核心身份信息。用开发者身份换取身份池令牌
将Cognito用户池作为开发者身份源,调用身份池的GetOpenIdTokenForDeveloperIdentity接口,传入获取到的用户身份信息,拿到OpenID令牌。获取临时凭证
使用拿到的OpenID令牌调用GetCredentialsForIdentity接口,最终获取临时凭证。
代码示例
import boto3 # 初始化客户端 region = "your-region" cognito_idp_client = boto3.client("cognito-idp", region_name=region) cognito_identity_client = boto3.client("cognito-identity", region_name=region) # 从请求头中提取ALB传递的访问令牌 access_token = "从请求头中获取的访问令牌" identity_pool_id = "你的身份池ID" user_pool_id = "你的用户池ID" developer_provider_name = f"cognito-idp.{region}.amazonaws.com/{user_pool_id}" # 步骤1:通过访问令牌获取用户信息 get_user_response = cognito_idp_client.get_user(AccessToken=access_token) username = get_user_response["Username"] # 步骤2:获取开发者身份对应的OpenID令牌 get_open_id_token_response = cognito_identity_client.get_open_id_token_for_developer_identity( IdentityPoolId=identity_pool_id, Logins={ developer_provider_name: username } ) identity_id = get_open_id_token_response["IdentityId"] open_id_token = get_open_id_token_response["Token"] # 步骤3:获取临时凭证 get_credentials_response = cognito_identity_client.get_credentials_for_identity( IdentityId=identity_id, Logins={ "cognito-identity.amazonaws.com": open_id_token } ) credentials = get_credentials_response["Credentials"]
注意事项
- 需确保你的身份池已启用开发者身份认证,并配置对应的提供商名称。
- 后端服务的IAM角色需要具备
cognito-idp:GetUser、cognito-identity:GetOpenIdTokenForDeveloperIdentity和cognito-identity:GetCredentialsForIdentity的调用权限。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

