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

时间:2015-07-20 16:19:26

标签: amazon-web-services amazon-cognito

我使用来自cognito的亚马逊开放ID令牌兑换的凭据收到Invalid access key错误

这就是我正在做的事情

  1. 获取开发人员身份验证的开放ID令牌

    cognito.getOpenIdTokenForDeveloperIdentity(params,function(err,data){

    openIdToken = data.credentials });

  2. 兑换开放式ID令牌以获取安全凭据,我将params设置为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.]错误

  5. *使用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的扩展名(代码取自此链接{{3然后使用该标识上传到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);
    

1 个答案:

答案 0 :(得分:2)

很抱歉这些问题。您似乎正在使用JavaScript SDK。使用此流时,您可以使用AWS.CognitoIdentityCredentials中提到的标准cognito-identity.amazonaws.com对象,使用getOpenIdTokenForDeveloperIdentity的密钥,并将值作为AWS.CognitoIdentityCredentials调用返回的OpenId Connect令牌

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

更新2015-07-21: SDK中存在一个小问题,不幸的是会阻止AWS.CognitoIdentityCredentials按照我的描述工作。我们正在努力减轻这个问题。

更新2015-07-24:您应该能够使用以下内容将AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'MY_IDENTITY_POOL', IdentityId: data.IdentityId, Logins: { 'cognito-identity.amazonaws.com': data.Token } }); 与您的开发人员身份验证标识一起使用:

GetOpenIdTokenForDeveloperIdentity

数据是来自F1:: Gui, Show, center center h500 w500, Just a window return F2:: MsgBox, 0, F2, You have pressed F2 inside the F1 hotkey return return 的回复。