【发布时间】:2020-09-21 10:35:54
【问题描述】:
我正在尝试在无服务器 lambda 中设置 AWS.config.credentials(在 REST 端点中运行)。登录来自使用 ADFS 作为联合身份的 Cognito 用户池。我还有一个 Cognito Identlty Pool。
我的 lambda 处理程序具有如下事件、上下文和回调参数:
export.handler =(事件,上下文,回调){ ... }event.headers.Authorization 有一个有效的 JWT(来自 id_token),当 HTML 客户端对 REST 端点执行 POST 调用时,该 JWT 被放置在 Authorization 标头中。我在这里自己验证了 JWT:https://jwt.io。此外,context.authorizer 对象看起来也是有效的,表明我已登录,它包含我的电子邮件和用户名信息以及有效的发行和到期日期。简而言之,我很确定我有一个有效的登录。
但是当我尝试执行以下命令时,我收到一条错误消息“NotAuthorizedException: Invalid login token. Issuer doesn't match providerName”
AWS.config.credentials = 新 AWS.CognitoIdentityCredentials({ IdentityPoolId: 'us-east-1:my-identity-pool-id', 登录:{ “cognito-idp:us-east-1.amazonaws.com/us-east-1_myUserPoolId”:event.headers.Authorization } }); AWS.config.credentials.get(err => { 如果(!错误){ var id = AWS.config.credentials.identityId; console.log('Cognito 身份 ID '+ id); } 别的 { console.log('cred error: ', err); } });当然,my-identity-pool-id 和 myUserPoolId 被替换为它们的实际值。我已经看到有关此主题的许多其他帖子表明错误地制定了 Logins 对象会产生此错误,但我在这段代码中已经经历了几次 - 并且让其他人也为我检查了它。我不认为我弄错了那部分。就错误文本而言,它实际上是正确的。如果我查看我解码的 JWT,issuer 和 providerName 是不同的:
{ "at_hash": "pciSj0Hcjk1Pp9noJIj4GQ", “子”:“e41500b1-d987-49be-81c0-8fbc36a59ce1”, “email_verified”:假, "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxx", “cognito:用户名”:“ge2cadmin2-saml-idp_ravi”, “认知:角色”:[ “我的幻想角色” ], "aud": "7r7v0ren5fm3m6vmjgj6nasr79", “身份”:[ { "userId": "ravi", "providerName": "ge2cadmin2-saml-idp", "providerType": "SAML", "发行人": "http://adfs.careevolution.com/adfs/services/trust", “主要”:“真实”, “创建日期”:“1590770196859” } ], "token_use": "id", “auth_time”:1591118267, “exp”:1591126227, “iat”:1591122627, “电子邮件”:“ravi@careevolution.com” }如您所见,在 identities[] 部分中,发行者是http://adfs.careevolution.com/adfs/services/trust,提供者名称是 ge2cadmin2-saml-idp。但我认为在这种情况下,这是可以预料的。但是,如果问题确实是这种差异(而不是其他地方的一些错误配置),我该如何设置,以便 AWS.CognitoIdentityCredentials 在发行者与 providerName 不同的情况下可以?
【问题讨论】: