php版Token授权简单示例

前边分享了 又拍云php版Token授权防盗链整理 感觉可以用一用,今天分享一个示例,利用Token授权来实现加解密。

/** 生成签名授权
 *
 * @param $str,签名对象
 * @param $key,密钥
 * @param $expiry,有效期,单位秒
 **/
function yang_encode($str, $key='', $expiry=''){
	// 过期时间: 当前Unix秒数+有效期
	$ctime = time() + $expiry;
	
	// 生成签名授权码: 将三个参数以&符号拼接,进行md5加密并取加密值的末8位,再与$ctime拼接
	$sign_str = substr(md5($str.'&'.$key.'&'.$ctime), -8).$ctime;
	return $sign_str;
}
// 示例
//echo yang_encode('aabbcc', 'UsG5kw67RB', '3600');


/** 解密签名授权
 *
 * @param $sign_str,签名授权码
 * @param $str,签名对象
 * @param $key,密钥
 * @param $expiry,有效期,单位秒
 **/
function yang_decode($sign_str, $str, $key='', $expiry=''){
	// 验证授权码完整性(18个字符)
	if( strlen($sign_str) != 18){
		return "签名授权码不完整,验证失败! ";
		exit;
	}
	
	// 拆分字符串 $sign_str
	$str1 = substr($sign_str, 0, 8); // 签名授权
	$str2 = substr($sign_str, 8, 10); // 过期时间
	
	// 构造签名验证字符串
	$sign = substr(md5($str.'&'.$key.'&'.$str2), -8);
	
	$de = ( ($str2-time())>0 && ($str2-time())<$expiry && ($sign==$str1) ) ? 1 : 0;
	
	return $de;
}

// 示例
//echo yang_decode('ae6648711483724340', 'aabbcc', 'UsG5kw67RB', '3600');

这个签名授权函数,可以用在 URL 传参中,比如授权获取用户资料:

http://aaa.com/get.php?uid=1&sign=ae6648711483724340

这样可以利用参数 sign 判断请求是否已授权且在有效期内,如果条件都满足,再输出数据,防止恶意提交!

比如QQ客户端上点击邮箱小图标,跳转到浏览器后自动登录邮箱,就用到了 clientkey 参数:

http://ptlogin2.qq.com/jump?ptlang=2052&clientuin=QQ号码&clientkey=112位授权码&u1=跳转网址

最近有个PC客户端与WEB端同步登录的项目就用到了这个方案,有时间将这个 url 通过 get 传参添加token授权的用法拓展一下。

如果各位有其他更优的方案,欢迎交流!