Javascript AWS JS SDK、IAM和DynamoDB问题

Javascript AWS JS SDK、IAM和DynamoDB问题,javascript,amazon-web-services,amazon-dynamodb,Javascript,Amazon Web Services,Amazon Dynamodb,使用AWS JS SDK+DynamoDB时出现此错误: AccessDeniedException:用户:arn:aws:its::[accnt id]:未授权假定角色/dynamointRole/web标识在资源上执行:dynamodb:PutItem:arn:aws:dynamodb:us-west-2:[accnt id]:表/websiteTest 这是我使用过的HTML/JS: 在此处插入标题 登录 var-fbUserId; var dynamodb=null; var-appI

使用AWS JS SDK+DynamoDB时出现此错误:

AccessDeniedException:用户:arn:aws:its::[accnt id]:未授权假定角色/dynamointRole/web标识在资源上执行:dynamodb:PutItem:arn:aws:dynamodb:us-west-2:[accnt id]:表/websiteTest

这是我使用过的HTML/JS:

在此处插入标题
登录
var-fbUserId;
var dynamodb=null;
var-appId='120636118298132'//来自facebook
var roleArn='arn:aws:iam::[my account id deleted]:role/dynamoIntroRole'//来自AWS IAM
window.fbAsyninit=函数(){
FB.init({appId:appId});
document.getElementById('login')。onclick=function(){
FB.登录(功能(响应)
{
if(response.authResponse)
{
AWS.config.credentials=新的AWS.WebIdentityCredentials({//WIF
罗兰:罗兰,
ProviderId:'graph.facebook.com',
WebIdentityToken:response.authResponse.accessToken
});
var dynamodb=新的AWS.dynamodb({地区:'us-west-2'});
var docClient=new AWS.DynamoDB.DocumentClient({service:DynamoDB});
log(“您现在已登录。”);
变量参数={
TableName:“websiteTest”,
项目:{
项目ID:'LKJLJLKJLKJLKJLKJLKJJ',
f2:'KJHKJHKJHKJHKJHKJHKJHKJH'
} 
};
docClient.put(参数、函数(错误、数据){
if(err)console.log(err);
else console.log(数据);
});
}
其他的
{
console.log(“发布登录”);
}
});//结束fb登录
};
};
//异步加载FBJSSDK
(功能(d、s、id){
var js,fjs=d.getElementsByTagName[0];
if(d.getElementById(id)){return;}
js=d.createElement;js.id=id;
js.src=“//connect.facebook.net/en_US/all.js”;
fjs.parentNode.insertBefore(js,fjs);
}(文档“脚本”、“facebook jssdk”);

我已经测试了您的HTML代码,它正在工作。IAM策略的设置方式可能是导致
AccessDeniedException
的原因。我建议遵循AWS SDK for JavaScript在浏览器中规定的格式>创建IAM角色以分配通过Facebook登录的用户 (). 这对我有用。我希望有帮助

我的IAM政策是:

{
“版本”:“2012-10-17”,
“声明”:[
{
“行动”:[
“s3:PutObject”,
“s3:PutObjectAcl”
],
“资源”:[
“arn:aws:s3:::bookdashjs/facebook-${graph.facebook.com:id}/*”
],
“效果”:“允许”
},
{
“行动”:[
“s3:ListBucket”
],
“资源”:[
“arn:aws:s3:::bookdashjs”
],
“效果”:“允许”,
“条件”:{
“StringEquals”:{
“s3:前缀”:“facebook-${graph.facebook.com:id}”
}
}
}
]

}
您遇到的问题与IAM策略中指定的条件有关。它当前指定了细粒度的访问控制

"Condition": {
            "ForAllValues:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "${graph.facebook.com:id}"
                ]
            }
        }
该条件要求分区键与使用的Facebook id匹配。如果您没有指定的分区键,那么它将抛出AccessDeniedException


因此,您需要创建一个表,将Facebook id作为分区键,或者从IAM策略中删除该条件。还要注意,分区键必须是字符串才能使用细粒度访问控制

"Condition": {
            "ForAllValues:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "${graph.facebook.com:id}"
                ]
            }
        }
资源:


你说得对,迈奥。条件子句在被删除或修改时,会改变您向表中插入新数据的能力。“因此,您需要使用Facebook id创建一个表”。此分区键必须命名为“id”或“userid”。我很困惑。我称之为Userid,我传递了从facebook返回的facebook id,但仍然不适用于我