亚马逊 S3 已预先签URL名 AWS SDK for PHP 版本 3 - AWS SDK for PHP

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊 S3 已预先签URL名 AWS SDK for PHP 版本 3

您可以通过将所需信息作为查询字符串参数传递而不是使用 Authorization 标头来对某些类型的请求进行身份验证。HTTP这在允许第三方浏览器直接访问您的私有 Amazon S3 数据,而无需代理请求时非常有用。这个想法是构造一个 “预签名” 的请求并将其编码为URL最终用户浏览器可以检索的。此外,您还可以通过指定过期时间来限制预签名请求。

以下示例演示如何:

的所有示例代码都可以在此 AWS SDK for PHP 处找到 GitHub

凭证

在运行示例代码之前,请配置您的 AWS 证书,如中所述凭证。然后导入 AWS SDK for PHP,如中所述基本用法

创建预签名请求

您可以使用Aws\S3\S3Client::createPresignedRequest()方法获取 Amazon S3 对象的预签名URL。此方法接受 Aws\CommandInterface 对象和过期时间戳并返回预签名 Psr\Http\Message\RequestInterface 对象。您可以使用请求的getUri()方法检索对象URL的预签名。

最常见的场景是URL为GET对象创建预签名。

导入

use Aws\Exception\AwsException; use AwsUtilities\PrintableLineBreak; use AwsUtilities\TestableReadline; use DateTime; require 'vendor/autoload.php';

示例代码

$command = $s3Service->getClient()->getCommand('GetObject', [ 'Bucket' => $bucket, 'Key' => $key, ]);

创建预签名 URL

您可以使用创建命令对象的getCommand方法URLs为任何 Amazon S3 操作创建预签名,然后使用命令调用该createPresignedRequest()方法。最终发送请求时,请务必与返回的请求使用相同的方法和相同的标头。

示例代码

try { $preSignedUrl = $s3Service->preSignedUrl($command, $expiration); echo "Your preSignedUrl is \n$preSignedUrl\nand will be good for the next 20 minutes.\n"; echo $linebreak; echo "Thanks for trying the Amazon S3 presigned URL demo.\n"; } catch (AwsException $exception) { echo $linebreak; echo "Something went wrong: $exception"; die(); }

获取URL物体

如果您只URL需要公开存储在 Amazon S3 存储桶中的对象,则可以使用Aws\S3\S3Client::getObjectUrl()方法。此方法返回给定存储桶和密钥的未签名URL值。

示例代码

$preSignedUrl = $s3Service->preSignedUrl($command, $expiration);
重要

此方法URL返回的内容未经过验证以确保存储桶或密钥存在,也不能确保该对象允许未经身份验证的访问。