1

短縮版

Facebook ユーザーとしてログインし、oAuth トークンを使用して AWS で IAM ロールを引き受けます。有効な認証情報と思われるものを返します。たとえば、マスター キーと同じ長さの AccessKeyId、SecretAccessKey があります。

これらの資格情報を使用して DynamoDB テーブルにアクセスしようとすると、次の 2 つの例外のいずれかが発生します。

  1. "The remote server returned an error: (400) Bad Request."; また
  2. "The security token included in the request is invalid.".

AWS C# SDK バージョン 1.5.25.0 を使用しています

ロングバージョン

上で述べたように、この AWS ガイドAmazonSecurityTokenServiceClientで説明されているように、Facebook ID によって承認された資格情報を使用して、AWS の DynamoDB テーブルにアクセスしようとしています。

私が作成した 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>();    
}

"The remote server returned an error: (400) Bad Request."これは、テーブルにアクセスしようとすると返されScanます。

これが、例外メッセージのバリエーションです。AWSCredentials.SessionToken上記を省略した場合AmazonDynamoDBClient

using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, RegionEndpoint.USEast1))
{
    var context = new DynamoDBContext(client);
    var data = context.Scan<SomeData>();
}

"The security token included in the request is invalid."これは、テーブルにアクセスしようとすると返されScanます。

質問

この時点では、何が問題なのか、資格情報が無効なのか、AWS に必要なすべてを渡していないのかわかりません。

何が間違っているのか、またはこれをさらにデバッグする方法について誰かが洞察を提供できますか?

4

1 に答える 1

2

AWS フォーラムに質問をクロス投稿したところ、Amazon のエンジニアから回答がありました。

https://forums.aws.amazon.com/message.jspa?messageID=465057


DynamoDBContextオブジェクトがDescribeTableターゲット テーブルで呼び出されます (そしてこのデータがキャッシュされるため、最適なパフォーマンスを得るには、コンテキスト オブジェクトをできるだけ長く保持する必要があるため、この呼び出しはターゲット テーブルごとに 1 回だけ実行されます)。ポリシーを次のように変更します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:DescribeTable"        
      ],
      "Sid": "Stmt1372350145000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}
于 2013-07-02T09:44:49.143 に答える