首页 > 解决方案 > 带有 ADFS 的 AWS Cognito:颁发者与 providerName 不匹配

问题描述

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

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

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

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

但是当我尝试执行以下命令时,我收到一条错误消息“NotAuthorizedException:无效的登录令牌。颁发者与 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 不同的情况下可以?

标签: aws-lambdaamazon-cognito

解决方案


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

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


推荐阅读