我是AWS初学者,一直在研究Cognito。
我已成功创建了一个非常简单的S3 + cognito + lambda(通过API网关)系统,其中authtoken用于对lambda的API调用的标头中(在作为cognito用户有效登录之后)。
现在我正在使用没有lambda的S3 + cognito + dynamodb流程,其中javascript(在浏览器中)直接访问dynamodb(在作为cognito用户有效登录之后)。
this AWS reference 给了我很多帮助,但我仍然无法成功......
这是我的代码:
var cognitoUser =userPool.getCurrentUser();
AWS.config.region = _config.cognito.region;
cognitoUser.getSession(function(err,result) {
if (result) {
var UserPoolId = _config.cognito.userPoolId;
console.log("you are now logged in to userpool:"+UserPoolId);
var provider ='cognitoidp.'+_config.cognito.region+'.amazonaws.com/'+UserPoolId;
console.log('provider:'+provider);
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: _config.cognito.IdentityPoolId,
Logins: {
provider: result.getIdToken().getJwtToken()
}
});
}
});
AWS.config.credentials.get(function(err) {
if (!err) {
console.log("Cognito Identify Id: " + AWS.config.credentials.identityId);
}
else {
console.log(err, err.stack);
}
});
... dynamodb operation..
控制台日志(通过chrome开发人员工具)显示,
view.js:78 you are now logged in to userpool:ap-northeast-1_XXXXXXXXX
view.js:81 provider:cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX
cognito-identity.ap-northeast-1.amazonaws.com/:1 POST https://cognito-identity.ap-northeast-1.amazonaws.com/ 400 (Bad Request)
view.js:101 Error: Invalid login token. Issuer doesn't match providerName
at constructor.i (aws-sdk-2.226.1.min.js:49)
at constructor.callListeners (aws-sdk-2.226.1.min.js:50)
at constructor.emit (aws-sdk-2.226.1.min.js:50)
at constructor.emitEvent (aws-sdk-2.226.1.min.js:50)
at constructor.e (aws-sdk-2.226.1.min.js:49)
at a.runTo (aws-sdk-2.226.1.min.js:51)
at aws-sdk-2.226.1.min.js:51
at constructor.<anonymous> (aws-sdk-2.226.1.min.js:49)
at constructor.<anonymous> (aws-sdk-2.226.1.min.js:50)
at constructor.callListeners (aws-sdk-2.226.1.min.js:50)
"NotAuthorizedException: Invalid login token. Issuer doesn't match providerName
没有&#34;登录&#34; AWS.CognitoIdentityCredentials的参数,没关系。 (&#34; Cognito Identify Id:&#34;显示返回的Id)。但这是&#34;未经认证的&#34;。因此,为了允许dynamoDB访问,我必须将所需的策略附加到在联合身份mgmt期间自动创建的Cognito_myIDPoolName_UnauthRole。 我想避免将这种额外的政策附加到未经身份验证的用户身上。 任何建议将受到高度赞赏。
答案 0 :(得分:0)
在一年后发出声音,是因为我为解决同一个问题感到头疼,您的问题是您将“ provider
”作为关键,而不是提供者的变量:
Logins: {
[provider]: result.getIdToken().getJwtToken()
}
希望这可以帮助其他人将来碰到同样的屁!