从 SDK 版本 1 升级到 3 后如何修复 getFederationToken returns 403 not authorized 错误
How to fix getFederationToken returns 403 not authorized error after upgrading from SDK version 1 to 3
我们有使用 AWS PHP SDK 版本 1 AmazonSTS()->get_federation_token() 的现有代码。升级到 SDK 版本 3 后,使用相同的凭据、资源和策略进行相同的调用 returns 403 未授权错误。
版本和地区似乎相同。政策json 是一样的。用于拨打电话的用户凭据是相同的(如果我切换回 SDK v1,它们仍然有效)。我设置了调试选项,但它似乎没有提供任何附加信息,说明为什么同一用户未被授权对同一联合用户执行相同的功能 getFederationToken。
有效的旧代码:
$client = new AmazonSTS();
$policy = new stdClass();
$policy->Statement = [
'Sid' => 'randomstatementid' . time(),
'Action' => ['s3:*'],
'Effect' => 'Allow',
'Resource' => 'aws:s3:::' . $AWS_BUCKET . '*'
];
// Fetch the session credentials.
$response = $client->get_federation_token('User1',array(
'Policy' => json_encode($policy),
'DurationSeconds' => $NUMSECS
));
returns 403 错误的新代码:
$client = new Aws\Sts\StsClient([
'region' => 'us-east-1',
'version' => '2011-06-15',
]);
$policy = new stdClass();
$policy->Statement = [
'Sid' => 'randomstatementid' . time(),
'Action' => ['s3:*'],
'Effect' => 'Allow',
'Resource' => 'aws:s3:::' . $AWS_BUCKET . '*'
];
try {
$response = $client->getFederationToken([
'Name' => 'User1',
'Policy' => json_encode($policy),
'DurationSeconds' => $NUMSECS,
]);
} catch (Exception $e) {
var_dump($e);
die();
}
第一个示例 returns 联合用户 User1 的临时凭据。
第二个例子 returns 403 forbidden error (我隐藏了真实的账户id):
<Error>
<Type>Sender</Type>
<Code>AccessDenied</Code>
<Message>User: arn:aws:iam::[account id]:user/portal is not authorized to perform: sts:GetFederationToken on resource: arn:aws:sts::[account id]:federated-user/User1</Message>
</Error>
原来我看错了凭据。我在脚本中找到了正确的凭据 hard-coded :(
我们有使用 AWS PHP SDK 版本 1 AmazonSTS()->get_federation_token() 的现有代码。升级到 SDK 版本 3 后,使用相同的凭据、资源和策略进行相同的调用 returns 403 未授权错误。
版本和地区似乎相同。政策json 是一样的。用于拨打电话的用户凭据是相同的(如果我切换回 SDK v1,它们仍然有效)。我设置了调试选项,但它似乎没有提供任何附加信息,说明为什么同一用户未被授权对同一联合用户执行相同的功能 getFederationToken。
有效的旧代码:
$client = new AmazonSTS();
$policy = new stdClass();
$policy->Statement = [
'Sid' => 'randomstatementid' . time(),
'Action' => ['s3:*'],
'Effect' => 'Allow',
'Resource' => 'aws:s3:::' . $AWS_BUCKET . '*'
];
// Fetch the session credentials.
$response = $client->get_federation_token('User1',array(
'Policy' => json_encode($policy),
'DurationSeconds' => $NUMSECS
));
returns 403 错误的新代码:
$client = new Aws\Sts\StsClient([
'region' => 'us-east-1',
'version' => '2011-06-15',
]);
$policy = new stdClass();
$policy->Statement = [
'Sid' => 'randomstatementid' . time(),
'Action' => ['s3:*'],
'Effect' => 'Allow',
'Resource' => 'aws:s3:::' . $AWS_BUCKET . '*'
];
try {
$response = $client->getFederationToken([
'Name' => 'User1',
'Policy' => json_encode($policy),
'DurationSeconds' => $NUMSECS,
]);
} catch (Exception $e) {
var_dump($e);
die();
}
第一个示例 returns 联合用户 User1 的临时凭据。 第二个例子 returns 403 forbidden error (我隐藏了真实的账户id):
<Error>
<Type>Sender</Type>
<Code>AccessDenied</Code>
<Message>User: arn:aws:iam::[account id]:user/portal is not authorized to perform: sts:GetFederationToken on resource: arn:aws:sts::[account id]:federated-user/User1</Message>
</Error>
原来我看错了凭据。我在脚本中找到了正确的凭据 hard-coded :(