首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用AccessKeyId / SecretAccessKey访问AWS服务

使用AccessKeyId / SecretAccessKey访问AWS服务
EN

Stack Overflow用户
提问于 2017-01-28 11:20:37
回答 1查看 4.5K关注 0票数 2

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

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

代码语言:javascript
运行
复制
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
  • secretAccessKey
  • sessionToken

到目前一切尚好。

我认为accessKeyIdsecretAccessKey将是临时的(有时间限制的) AWS凭据,可用于代表该用户访问服务。

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

代码语言:javascript
运行
复制
{ [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访问密钥不被认为是有效的密钥?

EN

回答 1

Stack Overflow用户

发布于 2017-01-28 16:24:40

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

临时凭据(通常,AccessKeyId以ASIA而不是熟悉的AKIA开头--我相信我在某个地方读到了S的意思是“会话”,K的意思是“密钥”)完全不被服务API识别,除非在每个请求中伴随会话令牌。

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

猜测:

当引入临时凭据时,它们不是在AccessKeyId (/^AKIA/ vs /^ASIA/)上作为模式匹配实现的,而是作为某种“钩子”实现的,它将服务API端点上的身份验证/授权转移到另一个代码路径,在请求处理的早期.但是,只有在请求中存在会话令牌时才会发生这种情况。(在线路上,它以x-amz-security-token的形式发送。)

如果不是这样的话,请求会传递到标准代码路径,凭据就会被验证,就好像它们是普通凭据一样--因此错误消息来自验证标准凭据的代码路径--对于该系统,访问密钥id确实不存在。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41909174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档