AWS Cognito:无法获取凭据

时间:2017-10-17 07:25:21

标签: javascript amazon-web-services aws-cognito aws-iot

我无法获得CognitoIdentity的凭据。用户成功通过身份验证后,需要获取Identity才能访问其他AWS服务。在我的案例中,这是AWS IoT。但不知何故,我无法获得任何凭据。

这是错误讯息:

  

检索凭据时出错:NotAuthorizedException:访问权限   身份&eu-central-1:XXXXXXXXXX'是   禁止的。

我的代码几乎与Github上的教程完全相同:

 var cognitoUser = new AWSCognito.CognitoUser(userData);
  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
      console.log("Logged in");
      console.log('access token + ' + result.getAccessToken().getJwtToken());
      //    window.location.href = "index.html";
      AWS.config.region = AWSConfiguration.region;

      AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: AWSConfiguration.IdPoolId,
        Logins : {
          'cognito-idp.eu-central-1.amazonaws.com/eu-central-1_XXXX' : result.getIdToken().getJwtToken()
        }
      });
      var cognitoIdentity = new AWS.CognitoIdentity();
      AWS.config.credentials.get(function(err, data) {
        if (!err) {
          console.log('retrieved identity: ' + AWS.config.credentials.identityId);
          var params = {
            IdentityId: AWS.config.credentials.identityId
          };
          cognitoIdentity.getCredentialsForIdentity(params, function(err, data) {
            if (!err) {
              thingShadows.updateWebSocketCredentials(data.credentials.AccessKeyId,
                                                 data.credentials.SecretKey,
                                                 data.credentials.SessionToken);
            }
            else {
              console.log('error retrieving credentials: ' + err);
            }
          });
        }
        else {
          console.log('error retrieving identity:' + err);
        }
      });
    }
  });  

请注意,我跳过了不相关的代码。 经过身份验证的用户可以完全访问我正在使用的所有AWS服务。

1 个答案:

答案 0 :(得分:2)

我认为您不需要致电cognitoIdentity.getCredentialsForIdentity()。当您致电AWS.config.credentials时,您的IAM密钥应放入AWS.config.credentials.get()对象。您可以在调用时直接在回调中访问它们。

换句话说,当您将retrieved identity:注销到控制台时,凭据对象应该已经包含您的密钥,访问密钥ID和会话令牌。

所有这些(给予或采取大括号):

 var params = {
    IdentityId: AWS.config.credentials.identityId
  };
  cognitoIdentity.getCredentialsForIdentity(params, function(err, data) {
    if (!err) {
      thingShadows.updateWebSocketCredentials(data.credentials.AccessKeyId,
                                         data.credentials.SecretKey,
                                         data.credentials.SessionToken);
    }
    else {
      console.log('error retrieving credentials: ' + err);
    }
  });

可能会被这样的东西取代:

thingShadows.updateWebSocketCredentials(AWS.config.credentials.accessKeyId,
                                        AWS.config.credentials.secretKey,
                                        AWS.config.credentials.sessionToken);

如果您传入Logins地图中包含用户池ID和访问令牌,则getCredentialsForIdentity()调用可能成功;我没有测试它。我还没遇到需要使用这个特殊API的用例,我怀疑你也不需要它。

来源:我使用100%的javascript应用程序,该应用程序使用经过身份验证和未经身份验证的Cognito身份。我们无法在任何地方拨打getCredentialsForIdentity(),尝试插入它会产生您遇到的同样错误。