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 小时前
k8s-Pod基础管理,标签管理,rc控制器及重启策略实战
linux·运维·云原生·容器·kubernetes·云计算
m0_694845574 小时前
Docker 从入门到实践教程:docker_practice 完整学习指南
运维·服务器·docker·容器·云计算·github
zhojiew6 小时前
[INFRA] EMR集群中Hive和Spark集成Glue Data Catalog过程的深入分析
hive·hadoop·spark·aws·bigdata
亚马逊云开发者6 小时前
我用 Lambda Durable Functions 把五个 Lambda 缩成了一个,代码量砍半
aws
泡沫·7 小时前
云计算基础与虚拟化技术
云计算
wuxia21189 小时前
云计算技术与实践(微课版)
docker·kubernetes·云计算
亚马逊云开发者9 小时前
异构 GPU 混合部署 Whisper,我用 HyperPod 一个集群搞定了
aws
duoduo_sing10 小时前
如何备份天翼云/阿里云/腾讯云映射的“虚拟磁盘”?
阿里云·云计算·腾讯云·松鼠备份
gaize121310 小时前
阿里云经济型 e 实例
阿里云·云计算
亚马逊云开发者1 天前
模型搜完网页就"脑算"数字?用 Dynamic Filtering 让它老老实实写代码
aws