阿里云oss通过sts securityToken获取自签名授权链接php版

本文介绍了如何在PHP中利用STS和签名URL机制,实现对阿里云OSS资源的目录授权访问,包括获取security-token、签名生成以及调用示例,同时针对官方SDK的不足进行了讨论。
摘要由CSDN通过智能技术生成

参考

如何使用STS以及签名URL临时授权访问OSS资源(PHP)_对象存储(OSS)-阿里云帮助中心

目的

官方sdk并没有授权目录,而很多时候需要授权目录,比如hls文件夹授权,总不能几千个切片全部跑一遍授权

主要实现oss地址+Expires+OSSAccessKeyId+security-token+Signature自行拼接成授权访问地址,只需.无需new

代码

获取security-token

参考上面官方地址,下述中tk包含获取security-token结果返回的accessKeyId,accessKeySecret,securityToken

获取签名

Oss.php

public static function getSignature($tk,$endpoint,$bucket,$object,$timeout,$method="GET",$options=array())
    {
        $accessKeyId = $tk['accessKeyId'];
        $accessKeySecret = $tk['accessKeySecret'];
        $securityToken = $tk['securityToken'];
        $timeout = time()+$timeout;
        $stringToSign=$method."\n\n\n".$timeout."\n".'/'.$bucket.'/'.$object.'?security-token='.$securityToken;
        $signature=base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret, true));
        $query = [
            'security-token'=>$securityToken,
            'OSSAccessKeyId'=>$accessKeyId,
            'Expires'=>strval($timeout),
            'Signature'=>$signature,
        ];
        $queryString=self::toQueryString($query);
        $pp = parse_url($endpoint);
        $parsed_url=[
            'scheme'=>$pp['scheme'],
            'host'=>$bucket.'.'.$pp['host'],
            'path'=>'/'.$object,
            'query'=>$queryString,
        ];
        $url = self::unparseUrl($parsed_url);
        return $url;
    }
    private static function toQueryString($options = array())
    {
        $temp = array();
        uksort($options, 'strnatcasecmp');
        foreach ($options as $key => $value) {
            if (is_string($key) && !is_array($value)) {
                if (strlen($value) > 0) {
                    $temp[] = rawurlencode($key) . '=' . rawurlencode($value);
                } else {
                    $temp[] = rawurlencode($key);
                }
            }
        }
        return implode('&', $temp);
    }
    private static function unparseUrl($parsed_url) {
        $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
        $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
        $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
        $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
        $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
        return "$scheme$host$port$path$query";
    }

调用

$oss = new Oss($id);
//        $oss->getTK();
        $endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
        $bucket= "b999a7c3bcc5535b4c8e277e18b7b6e1";
        $tk = unserialize(file_get_contents('tk'));
        $object=$oss_list_file;
        $timeout=3000;
        $method = "GET";
        $options=array();
        $link = $oss::getSignature($tk,$endpoint,$bucket,$object,$timeout,$method,$options);
        echo $link;

 

结语

为什么官方文档没有类似说明?也许是大有大的难处吧!累死本小白了!!

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

etafort

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值