oss 上传图片鉴权,临时权限

摘要:
˂?php/***公共方法*/defined('DYMall')orexit('AccessInvalid!
<?php


/**
 * 公共方法
 */

defined('DYMall') or exit('Access Invalid!');

useOSSOssClient;
useOSSCoreOssUtil;
useOSSCoreOssException;
useOSSHttpRequestCore;
useOSSHttpResponseCore;


require_once(BASE_ROOT_PATH.'/library/smartphp/libraries/OSS/autoload.php');
classosssecurityCtl{

    const OSS_URL_KEY = 'ossSecurityUrl';
    const OSS_TIME = 3600;

    const OSS_STS_URL = 'https://sts.aliyuncs.com';
    const FORMAT = 'JSON';
    const VERSION = '2015-04-01';
    const SIGN_ATURE_METHOD = 'HMAC-SHA1';
    const SIGN_ATURE_VERSION = '1.0';
    const ROLE_SESSION_NAME = 'web****ss';
    const OSS_STS_TOKEN = 'images:oss:sts:token';
    const OSS_ARN = 'acs:ram::136*******:role/w*****s'; //格式说明oss官网上有说明
    const OSS_STS_ACCESS_ID = 'LTAI4****9u3h';
    const OSS_ACCESE_SECRET = 'bv*******3B';

     /**
     * The name and signature of the console command.
     * @var string
     */
    protected $signature = 'get:OssStsToken';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '[OSS]定期更新OSS Sts Token';

    public function__construct()
    {
        $this->redis = caching::getInstance();
    }

    public functionindex(){
        //生成token
        $token = $this->handle();

        $endpoint = $GLOBALS['setting_config']['oss_url'];
        $bucket = $GLOBALS['setting_config']['oss_pre'];
        $object = 'data/upload/mobile/share/poster/'; //oss的图片上传路径,后面必须加上反斜杠否则报错
//此处有个坑,阿里云文档中没有写明,此处因为是生成临时鉴权,来传递图片,所以用建立用户时生成的acesseckeyid去生成token,
// 生成的$token 会返回临时的 token值跟 AccessKeyId 跟 AccessKeySecret 跟Expiration 此处是生成的临时用的 acessid 跟 accesesecret
// 然后用生成的临时的 acceesskeyid 跟 accesskeysecret 跟token去生成临时鉴权的url ,不要用原来的 OSS_STS_ACCESS_ID
$ossClient = new OSSOssClient($token['AccessKeyId'], $token['AccessKeySecret'], $endpoint, false,$token['SecurityToken']); try{ $is_keys = $this->redis->exists(self::OSS_URL_KEY); if($is_keys) { $signedUrl = $this->redis->get(self::OSS_URL_KEY); }else{ //生成PutObject的签名URL。 $signedUrl = $ossClient->signUrl($bucket, $object, self::OSS_TIME); $this->redis->set(self::OSS_URL_KEY, $signedUrl, self::OSS_TIME); } }catch (OssException $e){ output_error($e->getMessage()); } $signedUrl = $signedUrl.'&AccessKeySecret='.$token['AccessKeySecret'].'&bucketName='.$bucket.'&endpoint='.$endpoint; $arr = parse_url($signedUrl); $arrQeury = $arr['query']; $explarr = explode('&', $arrQeury); $urlarr =[]; foreach($explarr as $k =>$v){ $arr1=explode('=',$v); $urlarr[$arr1[0]] = $arr1[1]; } output_data($urlarr);//此处是将数据json后返回前段,token会被转义,所以前段拿到值后需要jsondecode一下在转义回来使用 } /** * 定期更新Oss Sts token * * @return mixed */ private functionhandle() { if($this->redis->exists(self::OSS_STS_TOKEN)) { return $this->redis->get(self::OSS_STS_TOKEN); } date_default_timezone_set("GMT"); $params =[ //获取公共参数 'Format' => self::FORMAT, 'Version' => self::VERSION, 'AccessKeyId' => self::OSS_STS_ACCESS_ID, 'SignatureMethod' => self::SIGN_ATURE_METHOD, 'SignatureVersion' => self::SIGN_ATURE_VERSION, 'SignatureNonce' => uniqid(), 'Timestamp' => date('Y-m-dTH:i:s'), //获取接口参数 'Action' => 'AssumeRole', 'RoleArn' => self::OSS_ARN, 'RoleSessionName' => self::ROLE_SESSION_NAME,]; ksort($params); $oss_access_key = self::OSS_ACCESE_SECRET; $sign = ''; $items =[]; foreach($params as $key => $value){ $items[] = rawurlencode($key) . '=' . rawurlencode($value); $sign .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value); } $sign = 'GET&%2F&' . $this->percentencode(substr($sign, 1)); $signature = base64_encode(hash_hmac('sha1', $sign, $oss_access_key . "&", true)); $url = self::OSS_STS_URL . '?' . implode('&', $items) . '&Signature=' . rawurlencode($signature); $token = $this->getApi($url); $time = date('Y-m-d H:i:s', time()); if (!empty($token)) { $this->redis->set(self::OSS_STS_TOKEN, $token, self::OSS_TIME); return $token; } } private function percentEncode($str) { $res = urlencode($str); $res = preg_replace('/+/', '%20', $res); $res = preg_replace('/*/', '%2A', $res); $res = preg_replace('/%7E/', '~', $res); return $res; } private function getApi($url){ $ch =curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); if(!isset($output['Credentials'])){ return false; }else{ return $output['Credentials']; } } }

免责声明:文章转载自《oss 上传图片鉴权,临时权限》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇23.allegro中钻孔[原创]ICP备案接入商下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何获取变量token的值

一.什么是token 1.客户端使用用户名跟密码请求登录 2.服务端收到请求,去验证用户名与密码 3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 LocalStorage 里,客户端每次向服务端请求资源的时候需要带着服务端签发的 Token...

使用Tensorflow对模型进行量化

本文旨在将迁移学习训练好的模型基于tensorflow工具进行量化。 环境配置及迁移学习部分可参考博文[https://www.cnblogs.com/hayley111/p/12887853.html]。 首先使用如下workflow理解模型部署的过程,本文主要描述的是quant这一步。 1. 环境准备: 安装bazel bazel是一个开源的构造和测...

snmp学习笔记

snmp5.5 client 包含头文件 #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> 用到的函数有:初始化snmp库:void init_snmp(const char *); 用于初始化snmp库 netsnmp_ses...

Node.js连接RabbitMQ,断线重连,动态绑定routing key

RabbitMQ官方提供的教程https://www.rabbitmq.com/tuto...,是基于回调的。 下面将给出基于Promise式的写法。并且实现动态的队列绑定 初始化配置 const amqp = require('amqplib') // rabbitMQ地址 const {amqpAddrHost} = require('../conf...

C/C++文件输入输出操作——FILE*、fstream、windowsAPI

基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下: typedef struct {int level;unsigned flags;char fd;unsigned char hold;int...

POJ 3281 Dining (网络流之最大流)

题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料。每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给一头牛。最多能有多少头牛可以同时得到喜欢的食物和饮料? 析:是一个经典网络流的题,建立一个超级源点,连向每种食物,建立一个超级汇点,连向每种饮料,然后把每头牛...