无法使用Facebook AssumeRoleWithWebIdentity凭据访问AWS
本文关键字:访问 AWS AssumeRoleWithWebIdentity Facebook | 更新日期: 2023-09-27 18:20:37
短版本
作为Facebook用户登录,我使用我的oAuth令牌在AWS上扮演IAM角色。它返回看起来有效的凭据,例如,有一个AccessKeyId、SecretAccessKey的长度与我们的主密钥相似。
当我尝试使用这些凭据访问DynamoDB表时,我会得到两个例外之一:
"The remote server returned an error: (400) Bad Request."
;或- CCD_ 2
我使用的是AWS C#SDK 1.5.25.0版
长版本
如上所述,我正试图使用Facebook Identity授权的AmazonSecurityTokenServiceClient
提供的凭据访问AWS上的DynamoDB表,如本AWS指南所述。
我创建的IAM角色的策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Sid": "Stmt1372350145000",
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
如何获取凭据:
- 用户使用oAuth登录Facebook
- 使用访问令牌,我使用带有请求的
AmazonSecurityTokenServiceClient.AssumeRoleWithWebIdentity
来承担IAM角色 这会返回看起来有效的凭据,例如与我们的主密钥长度相似的AccessKeyId、SecretAccessKey。
using (var tokenServiceClient = new AmazonSecurityTokenServiceClient(RegionEndpoint.USEast1)) { var request = new AssumeRoleWithWebIdentityRequest { DurationSeconds = (int)TimeSpan.FromHours(1).TotalSeconds, ProviderId = "graph.facebook.com", RoleArn = "arn:aws:iam::193557284355:role/Facebook-OAuth", RoleSessionName = result.id, WebIdentityToken = FBClient.AccessToken }; var response = tokenServiceClient.AssumeRoleWithWebIdentity(request); AWSAssumedRoleUser = response.AssumeRoleWithWebIdentityResult.AssumedRoleUser; AWSCredentials = response.AssumeRoleWithWebIdentityResult.Credentials; }
我如何使用这些凭据:
使用返回的凭据,我尝试访问AWS DynamoDB资源。
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, AWSCredentials.SessionToken, RegionEndpoint.USEast1))
{
var context = new DynamoDBContext(client);
var data = context.Scan<SomeData>();
}
这将在尝试Scan
表时返回"The remote server returned an error: (400) Bad Request."
。
这就是异常消息的变化所在;如果我从上面的AmazonDynamoDBClient
中省略AWSCredentials.SessionToken
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, RegionEndpoint.USEast1))
{
var context = new DynamoDBContext(client);
var data = context.Scan<SomeData>();
}
这将在尝试Scan
表时返回"The security token included in the request is invalid."
。
问题
在这一点上,我无法判断出什么是错误的,证书是否无效,或者我没有将所需的一切都传递给AWS。
有人能提供任何关于问题的见解吗?或者我如何进一步调试它?
我在AWS论坛上交叉发布了我的问题,并收到了亚马逊工程师的回答。
https://forums.aws.amazon.com/message.jspa?messageID=465057
DynamoDBContext
对象调用目标表上的DescribeTable
(并缓存这些数据,因此为了获得最佳性能,您希望尽可能长时间地保留上下文对象,因此每个目标表只执行一次此调用)。修改您的政策如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:DescribeTable"
],
"Sid": "Stmt1372350145000",
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}