保护Amazon S3文件以进行特定于用户的显示

时间:2014-08-30 19:48:53

标签: amazon-web-services amazon-s3

我的服务器将与S3通信。据我所知,有两种可能性:

1)将文件加载到我的服务器并将其发送给用户,使S3只能访问我服务器的IP 2)在我的服务器上处理身份验证时重定向到S3

我已经理解(我认为)如何做到#1来自: Does Amazon S3 support HTTP request with basic authentication

但有没有办法完成#2?我想避免首先将文件加载到我的服务器然后将其发送给用户的延迟。

我不确定如何在#2中保护S3网址免受公共访问。有人可能会通过我的身份验证,获得下载链接,但该链接可以公开访问。

我一般都是S3的新手,所以如果我误解了任何事情,请耐心等待。

编辑:我查看过期时间的签名链接,但其他人仍然可以访问它们。我也更喜欢使用自己的身份验证,因此只有在用户登录时才允许访问链接。

1 个答案:

答案 0 :(得分:1)

您应该尝试下面的代码,服务器会生成一个会在60秒内过期的URL,以便用户直接从S3服务器下载文件。

首先:从这里下载HMAX.php: http://pear.php.net/package/Crypt_HMAC/redirected

<?php
require_once('Crypt/HMAC.php');

echo getS3Redirect("/test.jpg") . "\n";

function getS3Redirect($objectName)
{
  $S3_URL = "http://s3.amazonaws.com";
  $keyId = "your key";
  $secretKey = "your secret";
  $expires = time() + 60;
  $bucketName = "/your bucket";

  $stringToSign = "GET\n\n\n$expires\n$bucketName$objectName";
  $hasher =&amp; new Crypt_HMAC($secretKey, "sha1");
  $sig = urlencode(hex2b64($hasher-&gt;hash($stringToSign)));

  return "$S3_URL$bucketName$objectName?AWSAccessKeyId=$keyId&amp;Expires=$expires&amp;Signature=$sig";
}

function hex2b64($str)
{
    $raw = ";
    for ($i=0; $i &lt; strlen($str); $i+=2)
    {
        $raw .= chr(hexdec(substr($str, $i, 2)));
    }
    return base64_encode($raw);
}

?>

试一试。