AWS Cognito 与 ADFS:发行者与提供者名称不匹配

Rav*_*sai 2 amazon-cognito aws-lambda

我正在尝试在无服务器 lambda(在 REST 端点中运行)中设置 AWS.config.credentials。登录来自使用 ADFS 作为联合身份的 Cognito 用户池。我还有一个 Cognito 身份池。

我的 lambda 处理程序具有如下所示的事件、上下文和回调参数:

    Exports.handler = (事件, 上下文, 回调) {
       ...
    }

event.headers.Authorization 具有一个有效的 JWT(来自 id_token),当在 HTML 客户端上执行对 REST 端点的 POST 调用时,该 JWT 被放置在 Authorization 标头中。我在这里亲自验证了 JWT: https: //jwt.io。此外, context.authorizer 对象看起来也有效,表明我已登录,它具有我的电子邮件和用户名信息以及有效的颁发和到期日期。简而言之,我很确定我已经获得了有效的登录信息。

但是,当我尝试执行以下命令时,出现错误“NotAuthorizedException:无效的登录令牌。颁发者与提供者名称不匹配”

    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('信用错误:', err);
        }
     });

当然,my-identity-pool-id 和 myUserPoolId 会替换为其实际值。我已经看到有关此主题的许多其他帖子表明错误制定的登录对象会产生此错误,但我已经在这段代码中多次讨论过这个问题 - 并让其他人也帮我检查过。我不认为我把那部分弄错了。就错误文本而言,它实际上是正确的。如果我查看解码后的 JWT,就会发现颁发者和提供者名称是不同的:

    {
      "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”,
      “身份”:[
        {
          “用户ID”:“拉维”,
          "providerName": "ge2cadmin2-saml-idp",
          “providerType”:“SAML”,
          “发行人”:“http://adfs.careevolution.com/adfs/services/trust”,
          “主要”:“真实”,
          “创建日期”:“1590770196859”
        }
      ],
      “token_use”:“id”,
      “验证时间”:1591118267,
      “经验”:1591126227,
      “iat”:1591122627,
      “电子邮件”:“ravi@careevolution.com”
    }

如您所见,在 identities[] 部分中,颁发者为http://adfs.careevolution.com/adfs/services/trust,providerName为 ge2cadmin2-saml-idp。但我认为在这种情况下,这是可以预料的。但是,如果问题确实是这种差异(而不是其他地方的一些错误配置),我该如何设置才能使 AWS.CognitoIdentityCredentials 可以接受与providerName 不同的发行者?

Rav*_*sai 5

答案其实很简单。魔术字符串:“cognito-idp:us-east-1.amazonaws.com/us-east-1_myUserPoolId”不正确。相反,我应该使用:“cognito-idp.us-east-1.amazonaws.com/us-east-1_myUserPoolId”(在cognito-idp后面加一个点而不是冒号)。虽然错误消息很糟糕且具有误导性,但事实证明该错误只是简单的用户错误。

我在此发布此信息是为了帮助任何搜索相同误导性错误消息的人。

  • 遇到了完全相同的问题,它让我发疯,因为它在具有相同设置的另一个环境中工作(减去复制/粘贴错误) - 谢谢! (2认同)