AWS对S3桶里的文件设置签名验证,过期时间等

AWS 可以对S3桶的文件设置访问权限,当设置不公开访问的时候,又要让用户可以查看,那么就需要用到设置临时访问权限了

亚马逊 CloudFront 网址进行签名

php 复制代码
    /**
     * CDN域名使用
     * 给某个文件设置临时过期时间的url
     * @param $filePath
     * @return mixed|string
     * @author wzb
     * @data 2024/5/30
     */
    static function ossAwsUrlSign($filePath = '', $expiresTime = 60)
    {
        if (empty($filePath)) {
            return $filePath;
        }
        $configOss = config('aws_oss');
        $configOss = $configOss['video'] ?? [];
        $accessKeyId = $configOss['accessKeyId'] ?? '';  // 你的AccessKeyId
        $accessKeySecret = $configOss['accessKeySecret'] ?? '';  // 你的AccessKeySecret
        $region = $configOss['region'] ?? ''; // 你的Bucket所在地域的域名
        $bucket = $configOss['bucket'] ?? ''; // 你的Bucket名字
        $ossDomain = $configOss['oss_domain'] ?? '';  // CDN域名
        if (empty($accessKeyId) || empty($accessKeySecret) || empty($region) || empty($bucket)) {
            return '';
        }
        $resourceKey = $ossDomain . $filePath;
        $expires = time() + $expiresTime; // 5 minutes (5 * 60 seconds) from now.
        $privateKey = ROOT_PATH . "oss/aws_s3/private_key.pem";
        $keyPairId = 'K2****ADPC';

        $stsClient = new StsClient([
            'version' => 'latest',//版本
            'region' => $region,//区域
            'credentials' => new Credentials(
                $accessKeyId,//Access key ID
                $accessKeySecret,//Secret access key
            ),
        ]);
        $result = $stsClient->getSessionToken();
        $cloudFrontClient = new CloudFrontClient([
            'version' => 'latest',//版本
            'region' => $region,//区域
            'credentials' => [
                'key' => $result['Credentials']['AccessKeyId'],
                'secret' => $result['Credentials']['SecretAccessKey'],
                'token' => $result['Credentials']['SessionToken']
            ]
        ]);
        try {
            $result = $cloudFrontClient->getSignedUrl([
                'url' => $resourceKey,
                'expires' => $expires,
                'private_key' => $privateKey,
                'key_pair_id' => $keyPairId
            ]);

            return $result;
        } catch (AwsException $e) {
            return 'Error: ' . $e->getAwsErrorMessage();
        }
    }
	// CDN域名使用
	// 给用户临时的cookie访问权限
    static function ossAwsUrlCookie($resourceKey)
    {
        if (empty($resourceKey)) {
            return $resourceKey;
        }
        $configOss = config('aws_oss');
        $configOss = $configOss['video'] ?? [];
        $accessKeyId = $configOss['accessKeyId'] ?? '';  // 你的AccessKeyId
        $accessKeySecret = $configOss['accessKeySecret'] ?? '';  // 你的AccessKeySecret
        $region = $configOss['region'] ?? ''; // 你的Bucket所在地域的域名
        $bucket = $configOss['bucket'] ?? ''; // 你的Bucket名字
        $ossDomain = $configOss['oss_domain'] ?? '';
        if (empty($accessKeyId) || empty($accessKeySecret) || empty($region) || empty($bucket)) {
            return [];
        }
        $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now.
        $privateKey = ROOT_PATH . "oss/aws_s3/private_key.pem";
        $keyPairId = 'K2CKP307JZADPC';

        $stsClient = new StsClient([
            'version' => 'latest',//版本
            'region' => $region,//区域
            'credentials' => new Credentials(
                $accessKeyId,//Access key ID
                $accessKeySecret,//Secret access key
            ),
        ]);
        $result = $stsClient->getSessionToken();
        $cloudFrontClient = new CloudFrontClient([
            'version' => 'latest',//版本
            'region' => $region,//区域
            'credentials' => [
                'key' => $result['Credentials']['AccessKeyId'],
                'secret' => $result['Credentials']['SecretAccessKey'],
                'token' => $result['Credentials']['SessionToken']
            ]
        ]);
        try {
            $result = $cloudFrontClient->getSignedCookie([
                'url' => $ossDomain . $resourceKey,
                'expires' => $expires,
                'private_key' => $privateKey,
                'key_pair_id' => $keyPairId
            ]);
        	// 需要把返回的数据写入cookie里
            return $result;
        } catch (AwsException $e) {
            return ['Error' => $e->getAwsErrorMessage()];
        }
    }
  

Amazon S3 预签名 URL

php 复制代码
    /**
     * S3桶自带的域名使用
     * 生成临时链接-过期时间
     * @return string
     * @author wzb
     * @data 2024/5/30
     */
    static function ossAwsUrlExpires($filePath = '')
    {
        $configOss = config('aws_oss');
        $configOss = $configOss['video'] ?? [];
        $accessKeyId = $configOss['accessKeyId'] ?? '';  // 你的AccessKeyId
        $accessKeySecret = $configOss['accessKeySecret'] ?? '';  // 你的AccessKeySecret
        $region = $configOss['region'] ?? ''; // 你的Bucket所在地域的域名
        $bucket = $configOss['bucket'] ?? ''; // 你的Bucket名字
        if (empty($accessKeyId) || empty($accessKeySecret) || empty($region) || empty($bucket)) {
            return '';
        }
        //实例化
        $s3Client = new S3Client([
            'version' => 'latest',//版本
            'region' => $region,//区域
            'credentials' => new Credentials(
                $accessKeyId,//Access key ID
                $accessKeySecret,//Secret access key
            ),
        ]);
        $cmd = $s3Client->getCommand('GetObject', [
            'Bucket' => $bucket,
            'Key' => $filePath
        ]);

//        $request = $s3Client->createPresignedRequest($cmd, '+1 minutes');
        $request = $s3Client->createPresignedRequest($cmd, '+20 second');
        $presignedUrl = (string)$request->getUri();
        return $presignedUrl;
    }
相关推荐
亚马逊云开发者2 小时前
更新个监控 Agent 要协调 200 个团队?Amazon ECS 托管守护进程终于把平台工程师从苦海里捞出来了
aws
亚马逊云开发者8 小时前
5 个 Agent 协同处理金融业务,我用 Kiro + AgentCore 半天就部署上线了
aws
AC赳赳老秦11 小时前
OpenClaw阿里云部署实操:多Agent协同,打造云端自动化工作流
人工智能·阿里云·数据挖掘·自动化·云计算·deepseek·openclaw
亚马逊云开发者12 小时前
我把 Claude Code 的 Token 费砍了 70%,只用了 SageMaker + 一个路由 Hook
aws
雨落Liy12 小时前
OpenClaw 腾讯云一键更新后全面排障与恢复
云计算·vim·腾讯云
喵叔哟13 小时前
3.【.NET10 实战--孢子记账--产品智能化】--.NET 10 核心新特性概览:运行时与 ASP.NET Core 10
云计算·asp.net·.net
圣殿骑士-Khtangc13 小时前
Amazon CodeWhisperer 超详细使用教程:AWS 云原生 AI 编程助手上手指南
人工智能·ai编程·aws·编程助手·codewhisperer
Echo-J1 天前
WinDbg 双机调试(调试机为Windows11系统,被调试机为Windows7系统)
安全·网络安全·云计算·系统安全
翼龙云_cloud2 天前
亚马逊云代理商:如何在 AWS Lightsail 上一键部署 OpenClaw 私有化 AI 助手?
人工智能·云计算·aws·openclaw
Virtual_human08062 天前
在VMware workstation上,部署3节点ceph测试,及加入openstack
ceph·云计算·openstack·osd·ceph集群