Php ListObjects AWS STS和S3客户端的访问被拒绝

Php ListObjects AWS STS和S3客户端的访问被拒绝,php,amazon-s3,http-status-code-403,aws-sts,Php,Amazon S3,Http Status Code 403,Aws Sts,我无法使用ListObjects方法使用安全令牌服务访问AWS S3 文档说明了一个bucket,它的对象可以是私有的,而我们可以使用AWS STS获取临时凭证来访问S3对象 我正在尝试创建一个图形服务器。我有一个单独的服务,你可以查询。在响应过程中,我的计划是使用AWS STS暴露S3存储桶中的图像 use Aws\Sts\StsClient; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $bucket = 'bucket_n

我无法使用ListObjects方法使用安全令牌服务访问AWS S3

文档说明了一个bucket,它的对象可以是私有的,而我们可以使用AWS STS获取临时凭证来访问S3对象

我正在尝试创建一个图形服务器。我有一个单独的服务,你可以查询。在响应过程中,我的计划是使用AWS STS暴露S3存储桶中的图像

use Aws\Sts\StsClient;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = 'bucket_name';


// the security credentials that you use to obtain temporary security credentials.
$stsClient = StsClient::factory(array(
    'credentials' => array(
        'secret'    => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        'key' => 'YYYYYYYYYYYYYYYYYYYYYYYYY'
    ),
    'region'=>'us-east-1',
    'version'=>'latest'
));




// Fetch the federated credentials.
$sessionToken = $stsClient->getFederationToken([
    'Name'              => 'IAM-Username',
    'DurationSeconds'    => '3600',
    'PolicyName'         => 'my-policy'
]);

// The following will be part of your less trusted code. You provide temporary
// security credentials so the code can send authenticated requests to Amazon S3.

$s3 = new S3Client([
    'region' => 'us-east-1',
    'version' => 'latest',
    'credentials' => [
        'key'    => $sessionToken['Credentials']['AccessKeyId'],
        'secret' => $sessionToken['Credentials']['SecretAccessKey'],
        'token'  => $sessionToken['Credentials']['SessionToken']
    ]
]);
print_r($sessionToken);
echo "<br/>";
echo "<br/>";
try {
    $result = $s3->listObjects([
        'Bucket' => $bucket
    ]);
} catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
使用Aws\Sts\StsClient;
使用Aws\S3\S3客户端;
使用Aws\S3\Exception\S3Exception;
$bucket='bucket_name';
//用于获取临时安全凭据的安全凭据。
$stsClient=stsClient::工厂(数组(
“凭据”=>数组(
“机密”=>“XXXXXXXXXXXXXXXXXXXXXXXXXXXXX”,
'key'=>'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
),
'地区'=>'美国东部-1',
'版本'=>'最新'
));
//获取联合凭据。
$sessionToken=$stsClient->getFederationToken([
“名称”=>“IAM用户名”,
'DurationSeconds'=>'3600',
'PolicyName'=>'我的保单'
]);
//以下内容将是不太受信任的代码的一部分。你提供临时的
//安全凭据,以便代码可以向AmazonS3发送经过身份验证的请求。
$s3=新的s3客户端([
'地区'=>'美国东部-1',
'版本'=>'最新',
“凭证”=>[
'key'=>$sessionToken['Credentials']['AccessKeyId'],
'secret'=>$sessionToken['Credentials']['SecretAccessKey'],
'token'=>$sessionToken['Credentials']['sessionToken']
]
]);
打印(sessionToken);
回声“
”; 回声“
”; 试一试{ $result=$s3->listObjects([ “Bucket”=>$Bucket ]); }捕获(S3$e){ echo$e->getMessage().PHP\u EOL; }
我期待一个S3对象键列表。但是,我收到了一条错误消息:

在“”上执行“ListObjects”时出错;AWS HTTP错误:客户端错误:
GET
https://s3.amazonaws.com/bucket_name?encoding-type=url
导致
403>禁止的
响应:AccessDeniedAccess拒绝AccessDenied(客户端):>拒绝访问-拒绝AccessDeniedAccess xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


找到了我的答案。我调用了错误的方法

我改变了这一点:

$sessionToken = $stsClient->getFederationToken([
    'Name'              => 'IAM-Username',
    'DurationSeconds'    => '3600',
    'PolicyName'         => 'my-policy'
]);
为此:

$sessionToken = $stsClient->getSessionToken([
    'Name'              => 'IAM-Username',
    'DurationSeconds'    => '3600',
    'PolicyName'         => 'my-policy'
]);
使用getSessionToken而不是getFederationToken,这是很明显的