这可能是一个人为的例子,但我试图理解为什么通过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
和secretAccessKey
将是可用于代表该用户访问服务的临时(有时间限制)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 Access Key不被视为有效密钥?
答案 0 :(得分:3)
您也需要将SessionToken传递给服务。
临时凭证(通常,AccessKeyId以ASIA
而不是熟悉的AKIA
开头 - 我相信我在S
表示“会话”和{{1}的某处读到了除非在每个请求中附带会话令牌,否则服务API完全无法识别“key”)。
那么为什么错误信息不能说明??
推测:
当引入临时凭证时,它们并未实现为AccessKeyId(K
vs /^AKIA/
)上的模式匹配,而是实现为转移身份验证的某种“挂钩”/服务API端点上的授权到备用代码路径,在请求处理的早期......但这只发生在请求中存在会话令牌时。 (在线上,它以/^ASIA/
发送。)
如果不是这种情况,则请求会进入标准代码路径,并且凭据验证就像它们是普通凭证一样 - 因此错误消息来自验证标准凭据的代码路径 - 以及该系统,访问密钥ID确实不存在。