从SDK版本1升级到3后,如何修复getFederationToken返回403未经授权的错误

时间:2019-06-04 20:12:57

标签: aws-php-sdk

我们已有使用AWS PHP SDK版本1 AmazonSTS()-> get_federation_token()的代码。升级到SDK版本3后,使用相同凭据,资源和策略的相同调用将返回403未经授权的错误。

版本和区域似乎相同。策略json相同。用于进行呼叫的用户凭据是相同的(如果我切换回SDK v1,它们仍然可以使用)。我设置了debug选项,但是它似乎没有提供任何其他信息来说明为什么没有授权同一用户在同一联盟用户上执行相同功能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
    ));

返回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();
    }

第一个示例返回联合用户User1的临时凭证。 第二个示例返回403禁止错误(我正在隐藏实际的帐户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>

1 个答案:

答案 0 :(得分:0)

结果是我看错了凭据。我在脚本中找到了正确编码的正确凭证:(