使用从亚马逊开放 ID 令牌兑换的凭证时出现无效访问密钥错误

Invalid access key error using credentials redeemed from an amazon open id token

我在使用从 Cognito 的亚马逊开放 ID 令牌兑换的凭据时遇到 Invalid access key 错误

这是我正在做的

  1. 获取开发者认证的 open id token

    cognito.getOpenIdTokenForDeveloperIdentity(参数,函数(错误,数据){

    openIdToken = data.credentials });

  2. 兑换安全凭证的开放 ID 令牌,我将参数设置为 congnito Auth 角色并设置任意角色会话名称。我使用步骤 1 中的令牌。没有地方可以设置步骤 1 中的身份 ID。

    it('should be able to exchange temporary open id token for auth credentials', function (done) {
    
        var sts = new AWS.STS();
        var params = {
            RoleArn: roleArn,
            RoleSessionName: 'photo-upload-session',
            WebIdentityToken: openIdToken.Token
        };
        sts.assumeRoleWithWebIdentity(params, function(err, data) {
            should.not.exist(err);
    
            should.exist(data.Credentials.AccessKeyId);
            should.exist(data.Credentials.SecretAccessKey);
            should.exist(data.Credentials.SessionToken);
            credentials = data.Credentials;
    
            done();
        });
    
    
    });
    
  3. 我更新当前凭证

    AWS.config.update({accessKeyId : credentials.AccessKeyId, secretAccessKey:credentials.SecretAccessKey});

  4. 我将文件上传到 s3 并收到 [InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.] 错误

*使用 Bob Kinney 的建议进行编辑我尝试了两种方法 - 设置 sessionToken(有效)和使用 Congito 凭据,它给出了 TypeError 而不是缓冲区错误。 CognitoIdentityCredentials 示例如下。

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
       IdentityPoolId:config.get('aws_identity_pool_id'),
       Logins: {
         'cognito-identity.amazonaws.com': openIdToken.Token
       }
    });

    var body = fs.createReadStream(__dirname + '/test_photo.jpg');

    var s3obj = new AWS.S3({params: {Bucket: 'test-uploads', Key: 'test'}});

    s3obj.upload({Body: body}).
        on('httpUploadProgress', function(evt) { console.log(evt); }).
        send(function(err, data) {
            should.not.exist(err);
            done();

        });

** 更新

因此回到 java 客户端错误,我们正在使用 openid 令牌(经测试可与 sts.assumeRoleWithWebIdentity 一起正常工作)并将该令牌传递到 AWSAbstractCognitoIdentityProvider 的扩展(代码取自 link http://docs.aws.amazon.com/cognito/devguide/identity/developer-authenticated-identities/) - 然后使用该身份上传到 s3 得到错误

CustomAwsIdentityProvider provider = CustomAwsIdentityProvider.newInstance(this, BuildConfig.AWS_COGNITO_POOL_ID, Regions.US_EAST_1);

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(this, provider, Regions.US_EAST_1);

TransferManager tm = new TransferManager(credentialsProvider);
tm.upload("my-upload", uuid.toString(), file);

抱歉出现问题。看来您正在使用 JavaScript SDK。使用此流程时,您可以使用 developer guide 中提到的标准 AWS.CognitoIdentityCredentials 对象,使用 cognito-identity.amazonaws.com 的键和值作为从 getOpenIdTokenForDeveloperIdentity 调用返回的 OpenId Connect 令牌.

您看到错误的原因是您没有包括 STS 结果中的 sessionToken。使用 AWS.CognitoIdentityCredentials 对象应该可以为您解决这个问题。

2015-07-21 更新: SDK 中存在一个小问题,不幸的是,它会阻止 AWS.CognitoIdentityCredentials 像我描述的那样工作。我们正在努力缓解此问题。

2015 年 7 月 24 日更新: 您应该能够使用以下方法将 AWS.CognitoIdentityCredentials 与您的开发人员身份验证一起使用:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'MY_IDENTITY_POOL',
  IdentityId: data.IdentityId,
  Logins: {
    'cognito-identity.amazonaws.com': data.Token
  }
});

其中数据是来自 GetOpenIdTokenForDeveloperIdentity 的响应。