从 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 :(