0

我只是想问一下是否有人可以给我一个提示,让我在 S3 上获取只有登录用户才能访问的私有和安全文件,或者当业务逻辑希望它们可以访问时。这是场景...

一个用于输入账单详细信息的 PHP Web 应用程序,它会即时生成 PDF 发票并将其上传到 S3 存储桶。(它实际上并不总是生成和上传 - 仅当用户想要打印或下载它时 - 代码生成一个 pdf - 将其上传到 S3 并相应地取回 url 或文件)

现在,任何拥有 S3 存储桶上文件的 URL 的人都可以访问该文件。我想以这样一种方式限制文件访问,即使没有登录的人只能在回答一个秘密问题等之后才能获得文件。

生成一个在短时间内有效的签名 url 是这里唯一的答案,还是我也在寻找其他可能性?另外,我们可以直接从 S3 生成签名的 url,还是需要通过 cloudfront 生成?

请建议我进一步研究的方向......谢谢!

4

2 回答 2

0

这篇文章 https://css-tricks.com/snippets/php/generate-expiring-amazon-s3-link/ 可以帮助你。不要忘记查看评论。

*** 编辑

生成即将过期的 Amazon S3 链接

您不必公开 Amazon S3 上的文件(默认情况下它们不是公开的)。但是您可以生成特殊密钥以允许访问私有文件。这些密钥通过 URL 传递,并且可以过期。

<?php

    如果(!function_exists('el_crypto_hmacSHA1')){
        函数 el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
                if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
                $key = str_pad($key, $blocksize, chr(0x00));
                $ipad = str_repeat(chr(0x36), $blocksize);
                $opad = str_repeat(chr(0x5c), $blocksize);
                $hmac = pack('H*', sha1(
                ($key ^ $opad) 。包('H *',sha1(
                    ($key ^ $ipad) 。$数据
                ))
            ));
                返回 base64_encode($hmac);
        }
    }

    if(!function_exists('el_s3_getTemporaryLink')){

        函数 el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
            //计算过期时间
            $expires = time() + intval(floatval($expires) * 60);
            // 修复路径;编码和消毒
            $path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
            // 签名路径以bucket开头
            $signpath = '/'。$bucket .'/'。$路径;
            // 要签名的 S3 友好字符串
            $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
            // 计算哈希
            $signature = el_crypto_hmacSHA1($secretKey, $signsz);
            // 粘贴 URL ...
            $url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
            // ... 到查询字符串 ...
            $qs = http_build_query($pieces = array(
                'AWSAccessKeyId' => $accessKey,
                '过期' => $过期,
                '签名' => $签名,
            ));
            // ... 并返回 URL!
            返回 $url.'?'.$qs;
        }
    }

用法

<?php

    echo el_s3_getTemporaryLink('your-access-key', 'your-secret-key', 'bucket-name', '/path/to/file.mov');
于 2013-11-29T05:23:37.953 回答
0

This might help? Amazon CloudFront Private Content

I would assume you will need to setup a VPC to ensure your user's credentials are verified and valid to keep the content "private".

于 2013-02-07T19:08:20.883 回答