短縮版
Facebook ユーザーとしてログインし、oAuth トークンを使用して AWS で IAM ロールを引き受けます。有効な認証情報と思われるものを返します。たとえば、マスター キーと同じ長さの AccessKeyId、SecretAccessKey があります。
これらの資格情報を使用して DynamoDB テーブルにアクセスしようとすると、次の 2 つの例外のいずれかが発生します。
"The remote server returned an error: (400) Bad Request."
; また"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"
}
]
}
資格情報の取得方法:
- ユーザーは 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>();
}
"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 に必要なすべてを渡していないのかわかりません。
何が間違っているのか、またはこれをさらにデバッグする方法について誰かが洞察を提供できますか?