【问题标题】:Using Cognito AccessKeyId / SecretAccessKey to access AWS services使用 Cognito AccessKeyId / SecretAccessKey 访问 AWS 服务
【发布时间】:2017-06-14 00:46:35
【问题描述】:

这可能是一个人为的例子,但我试图理解为什么通过 Cognito 识别检索的临时 AccessKeyId / SecretAccessKey 不允许我访问像 S3 这样的 AWS 服务。

从节点应用程序中,我正在像这样对用户进行身份验证(如 https://github.com/aws/amazon-cognito-identity-js 中所述):

var authenticationData = {
            Username : params.Username,
            Password : params.Password,
        };
        var authenticationDetails = new AWSCognito.AuthenticationDetails(authenticationData);
        var poolData = {
            UserPoolId : params.UserPoolId,
            ClientId : params.ClientId
        };
        var userPool = new AWSCognito.CognitoUserPool(poolData);
        var userData = {
            Username : params.Username,
            Pool : userPool
        };
        var cognitoUser = new AWSCognito.CognitoUser(userData);

        cognitoUser.authenticateUser(authenticationDetails, {
            onSuccess: function (result) {    
                cognitoUserPoolLoginProvider = 'cognito-idp.' + params.AWSRegion +  '.amazonaws.com/' + params.UserPoolId;
                var logins = {};
                logins[cognitoUserPoolLoginProvider] = result.getIdToken().getJwtToken();

                AWS.config.credentials = new AWS.CognitoIdentityCredentials({
                    IdentityPoolId : params.IdentityPoolId, 
                    Logins : logins
                });

                AWS.config.update({region: params.AWSRegion});

                AWS.config.credentials.get(function(err) {
                    if (err) {
                        callback(err, null);
                        console.log(AWS.config.credentials);
                    } else {
                        var creds = {
                            AccessKeyId: AWS.config.credentials.accessKeyId,
                            SecretAccessKey: AWS.config.credentials.secretAccessKey,
                            SessionToken: AWS.config.credentials.sessionToken,
                        }

                        callback(null, creds);
                    }
                });
            },

            onFailure: function(err) {
                callback(err, null);
            },

        });

在我的身份池中提供用户的有效用户名/密码时,我会得到:

  • accessKeyId
  • 秘密访问密钥
  • 会话令牌

到目前为止一切顺利。

我假设accessKeyIdsecretAccessKey 将是可用于代表该用户访问服务的临时(有时间限制的)AWS 凭证。

但是,当我将 AWS CLI (aws configure) 配置为访问 AWS 服务时,出现以下错误:

{ [InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.]
  message: 'The AWS Access Key Id you provided does not exist in our records.',
  code: 'InvalidAccessKeyId',
  region: null,
  time: Sat Jan 28 2017 11:52:10 GMT+0100 (CET),
  requestId: '68BB8C46F7BC195D',
  extendedRequestId: '4Z6d+MCRIiZ1CtApQfphbkWPBCO/jpI0DXqyfK5/5yKaYqwDj/OAhCgy6UJdACyuIs5UxqLPfZk=',
  cfId: undefined,
  statusCode: 403,
  retryable: false,
  retryDelay: 90.96230010036379 }

为什么这个 AWS 访问密钥不被视为有效密钥?

【问题讨论】:

    标签: security amazon-web-services amazon-cognito


    【解决方案1】:

    您也需要将 SessionToken 传递给服务。

    临时凭证(通常,AccessKeyId 以 ASIA 开头,而不是熟悉的 AKIA ——我相信我在某处读到了 S 表示“会话”,K 表示“密钥”)完全除非在每个请求中附带会话令牌,否则服务 API 无法识别。

    那为什么错误信息不这么说呢?!

    推测:

    当引入临时凭证时,它们并未实现为 AccessKeyId 上的模式匹配(/^AKIA//^ASIA/),而是实现为某种“挂钩”,转移了服务的身份验证/授权API端点到备用代码路径,在请求处理的早期......但这仅在请求中存在会话令牌时发生。 (在网络上,它以x-amz-security-token 发送。)

    如果不是这种情况,则请求会进入标准代码路径,并且凭据会像普通凭据一样被验证 - 因此错误消息来自验证标准凭据的代码路径 - 并且对于那个系统,access key id确实不存在。

    【讨论】:

    • 关于's'和'k'的知识很有用。但是,即使提供了会话令牌,它也会给出相同的错误。
    • @SHIKHARSINGH 它不应该给出完全相同的错误。如果我没记错的话,如果令牌有问题,您应该会看到类似 The provided token is malformed or otherwise invalid 的内容。您使用的是哪种 AWS 服务以及哪种语言/SDK?
    • 语言是 java springboot 框架来生成临时 crfedentials 并响应运行它。这是我收到的确切错误 - 错误:您提供的 AWS 访问密钥 ID 不存在于我们的记录中。
    • 调用看起来像 AWS.config.update({ accessKeyId: "ASIA........", secretAccessKey: "95h+3KSDbSnO.......", sessionToken: "FQoDYXdzEEUaDEIl8YIyFGLx71VypCKrAUShgBBUSbUPTCPPitY9+mOPWZxt7KT2eTNI+7oHAwmetBBnYYZ2/uSwon9plXExMrqlp1ABid5PihM6Nml98SQPjBz...... ................................C5JEWX2uy3j6q0aeLoiXI2cu339rZG0HcojWItwpgM61I5s7CeocoPPtiiOnOjZBQ==", });
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2020-05-09
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2018-02-27
    相关资源
    最近更新 更多