无法使用Facebook AssumeRoleWithWebIdentity凭据访问AWS

本文关键字:访问 AWS AssumeRoleWithWebIdentity Facebook | 更新日期: 2023-09-27 18:20:37

短版本

作为Facebook用户登录,我使用我的oAuth令牌在AWS上扮演IAM角色。它返回看起来有效的凭据,例如,有一个AccessKeyId、SecretAccessKey的长度与我们的主密钥相似。

当我尝试使用这些凭据访问DynamoDB表时,我会得到两个例外之一:

  1. "The remote server returned an error: (400) Bad Request.";或
  2. 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"
    }
  ]
}

如何获取凭据:

  1. 用户使用oAuth登录Facebook
  2. 使用访问令牌,我使用带有请求的AmazonSecurityTokenServiceClient.AssumeRoleWithWebIdentity来承担IAM角色
  3. 这会返回看起来有效的凭据,例如与我们的主密钥长度相似的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。

有人能提供任何关于问题的见解吗?或者我如何进一步调试它?

无法使用Facebook AssumeRoleWithWebIdentity凭据访问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"
    }
  ]
}