阿里云获取TOKEN

野生程序猿-杂烧5年前随意分享3481

阿里云获取TOKEN

阿里云有sdk,但是看了一下,解压后有10多MB,于是参照官方文档写一个


https://help.aliyun.com/document_detail/113251.html


采坑指南(其他开发语言借鉴)

1. 时间Timestamp

(1)时间格式为 2019-04-18T08:32:31Z ,使用UTC时间,时区:+0。格式:YYYY-MM-DDThh:mm:ssZ。注意时区+0;我们大部分人用的是+8时间,需要-8

(2)时间在有的时候需要urlencode,有的时候不要。我就是有个地方少了urlencode,查了好几个小时

2. 转码 urlencode,percentEncode

function percentEncode($str)
{
	// 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
	$res = urlencode($str);
	
	$res = str_replace('+', '%20', $res);
	$res = str_replace('*', '%2A', $res);
	$res = str_replace('%7E', '~', $res);
	return $res;
}

percentEncode是  使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范

3. 签名

签名本身不复杂,前面调对了基本上能走通,文档里有几个固定值,根据固定值算签名进行核对即可。


---------------------------------


PHP代码如下,自己增加2个配置文件 config/access.json默认内容为{};config/access.json默认内容为{"ACCESS_KEYID":"MY_ACCESS_KEYID","ACCESS_KEYSECRET":"MY_ACCESS_KEYSECRET"}

<?php
/**
*   PHP纯净版 获取阿里云TOKEN
*	作者:野生程序员-杂烧
*	www.zashao.com
*/

//error_reporting(E_ALL);
error_reporting(0);

date_default_timezone_set('Asia/Shanghai');//设置时区

define("CONFIG_DIR",dirname(__FILE__)."/config/");

//* token.json,access.json 暂时文本存储json文件,访问量大再更换高速缓存

//* config/access.json默认格式为{}  token定时刷新 自动存配置文件,根据时间戳刷新
define("TOKEN_PATH",CONFIG_DIR."token.json");

//* config/access.json默认格式为{"ACCESS_KEYID":"MY_ACCESS_KEYID","ACCESS_KEYSECRET":"MY_ACCESS_KEYSECRET"}
define("ACCESS_PATH",CONFIG_DIR."access.json");




$access_info=json_decode(file_get_contents(ACCESS_PATH),true);

define("ACCESS_KEYID", $access_info["ACCESS_KEYID"]);	
define("ACCESS_KEYSECRET",$access_info["ACCESS_KEYSECRET"]);	




class AliToken
{
	private $AccessKeyId; 
	private $AccessKeySecret; 
	private $Timestamp; 
	private $Timestamp_urlencode; //这里有个坑,需要一个urlencode的时间戳
	private $SignatureNonce; 
	private $Action="CreateToken";
	private $Version="2019-02-28";
	private $Format="JSON";
	private $RegionId="cn-shanghai";
	private $SignatureMethod="HMAC-SHA1";
	private $SignatureVersion="1.0";
	private $parameters;
	private $Signature;
	
	function __construct(){
		$this->AccessKeyId=ACCESS_KEYID;
		$this->AccessKeySecret=ACCESS_KEYSECRET;
	}
	
	
	function create_uuid()
	{
		$str=time().mt_rand().rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
		$md5=md5($str);
		$result=substr($md5,0,8)."-".substr($md5,8,4)."-".substr($md5,12,4)."-".substr($md5,16,4)."-".substr($md5,20,12);
		return $result;
	}
	function create_Timestamp()
	{
		$date=date("Y-m-d\TH:i:s\Z",time()-8*3600);
		return $date;
	}


	function percentEncode($str)
	{
		// 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
		$res = urlencode($str);
		//$res = $str;
		$res = str_replace('+', '%20', $res);
		$res = str_replace('*', '%2A', $res);
		$res = str_replace('%7E', '~', $res);
		return $res;
	}




	function createSign()
	{
	
		$this->Timestamp=$this->create_Timestamp();
		$this->SignatureNonce=$this->create_uuid();
		
		
		//测试用数据 https://help.aliyun.com/document_detail/113251.html 对照算法检查签名结果用
		/*
		$this->AccessKeyId="my_access_key_id";
		$this->AccessKeySecret="my_access_key_secret";
		$this->Timestamp="2019-04-18T08:32:31Z";
		$this->SignatureNonce="b924c8c3-6d03-4c5d-ad36-d984d3116788";
		*/
		

		$this->Timestamp_urlencode=urlencode($this->Timestamp);
		
		$parameters=array(
			"AccessKeyId"=>$this->AccessKeyId
			,"Action"=>$this->Action
			,"Version"=>$this->Version
			,"Format"=>$this->Format
			,"RegionId"=>$this->RegionId
			,"Timestamp"=>$this->Timestamp
			,"SignatureMethod"=>$this->SignatureMethod
			,"SignatureVersion"=>$this->SignatureVersion
			,"SignatureNonce"=>$this->SignatureNonce
		);
		
		ksort($parameters);
		$this->parameters=$parameters;
		$signStr = "";
		foreach ($parameters as $key => $val) {
			$signStr .= $key . "=" . urlencode($val) . "&";
		}
		$signStr = substr($signStr, 0, -1);
		$signStr="GET&".$this->percentEncode("/")."&".$this->percentEncode($signStr);
		
		
		$signStr = base64_encode(hash_hmac('SHA1', $signStr, $this->AccessKeySecret."&", true));
		$signStr=$this->percentEncode($signStr);
		
		$this->Signature = $signStr;
	}
	
	
	function new_token()
	{
		$this->createSign();
		$url="http://nls-meta.cn-shanghai.aliyuncs.com/?Signature={$this->Signature}&AccessKeyId={$this->AccessKeyId}&Action={$this->Action}&Format={$this->Format}&RegionId={$this->RegionId}&SignatureMethod={$this->SignatureMethod}&SignatureNonce={$this->SignatureNonce}&SignatureVersion={$this->SignatureVersion}&Timestamp={$this->Timestamp_urlencode}&Version={$this->Version}";
		file_put_contents("url.txt",$url);
		//exit();
		$r=file_get_contents($url);
		$data=json_decode($r,true);
		$token=$data["Token"]["Id"];

		return $token;
	}
	
	function get_token()
	{
		$token_info=json_decode(file_get_contents(TOKEN_PATH),true);
		$token_time=intval($token_info["time"]);
		//4个小时取一次新token 大概24小时过期,这里一天多取几次问题不大
		if(time()-$token_time>4*3600)
		{
			//伪唯一 可能出现极小极小极小概率重复,以及极小情况接口异常,所以只尝试3次
			for($i=1;$i<=3;$i++)
			{
				$token=$this->new_token();
				if($token)
				{
					break;
				}
			}
			
			
			if($token){
				//token正常需要缓存	*如果不正常要调试一下,肯定哪里出问题了
				$token_info_new=array(
					"time"=>time(),
					"token"=>$token
				);
				file_put_contents(TOKEN_PATH,json_encode($token_info_new));
			}
			
		}else{
			$token=$token_info["token"];
		}
		return $token;
		
	}
}

$ali=new AliToken();
$token=$ali->get_token();
echo "\r\n\r\n{$token}";

?>


返回列表

没有更早的文章了...

下一篇:时光机栏目的意义

相关文章

再谈面向过程编程,工序再到时序

再谈面向过程编程,工序再到时序

先看一个需求,这个是教学软件的一个环节。进入机场哪些东西能带哪些东西不能带?哪些东西放在行李箱托运?哪些放在包里随身携带?教学软件一般是带有互动的,有时序的概念。1、时序开始,先是导学说话。2、用户开...

h5的横屏适配

h5的横屏适配

最近遇到一个问题,我们开发的软件是横屏软件,因客户群体主要是学校,就是使用者是老师和学生。本来软件设计的是电脑机房里用,现在学校希望手机也可以用。结果手机用起来就是这个现象。老师提意见,说字太小看不清...

E语言吓退编程老司机

E语言吓退编程老司机

有门开发语言叫E语言,中文的编程语言。很多开发者瞧不上,但是少部分初中毕业的却用来开发外挂,而且赚了不少钱。很多人觉得e语言不稳定,玩游戏的都知道,其实稳定性特别强,只是开发没有生态,然后...

python RabbitMq的订阅

【test_RabbitMq1.py】import pika import json credentials = pika.PlainCredentia...

egret升级版本后遇到的问题

升级完egret引擎版本后vscode项目启动不了了,关键是新的demo也启动不了。只能用egret run -a 启动。egret越来越离谱了,还发现了其他怪异问题。1、html5编译报错,提示“您...

编译新的js库用在传统模式直接使用

面向dom的jquery被淘汰了,但是jquery拥有多年的生态,很多时候还是可以用在一些项目上的。没有最好的开发语言,也没有最好的框架;只有最适用的开发语言、最适用的框架。很多时候我们敏捷开发者都会...