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授权的用法拓展一下。

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

参与评论

  • 784804568@qq.com

    感谢杨老师回复!我基础差,想直接复制你的代码回来用,构造签名echo yang_encode('aabbcc', 'UsG5kw67RB', '3600') 完全正常,验证代码echo yang_decode('ae6648711483724340', 'aabbcc', 'UsG5kw67RB', '3600');页面返回为0,想修改成验证时间超时和token错误带提示,不会写,杨老师能不能抽空补一下代码,可以复制下来就能的那种。谢谢您!

    5个月前 (05-04)
    回复
  • 784804568@qq.com

    杨老师您好!非常感谢您分享Token授权代码,我是一个PHP小白,对这段代码一知半解,我直接复制了这段代码来用,生成token的代码测试成功,不知道为何验证代码页面一直都显示为0,我不知道怎么调整代码,才能让超时或错误时,页面显示超时或错误,麻烦杨老师帮忙看看,写个完整的客户端和服务端的代码,感激不尽!

    5个月前 (05-04)
    回复
  • YangJunwei

    函数后边注释的示例就是例子,可能你要传参有调整吧。就一点,无论多少参数,构造签名验证后解码验证时记得把你的参数都处理一下就行。如果是文档不够详细,可以参考各大open平台的授权验证方法

    5个月前 (05-04)
    回复
    回复YangJunwei