(PHP)基于Token的身份验证中对无状态的理解
来源:互联网 发布:电子书杂志制作软件 编辑:程序博客网 时间:2024/06/03 18:23
假设我们设计的Token储存的信息为:
用户名.发行时间.过期时间.签名
在用户登录成功后,我们获取到用户的用户名、此时的时间戳,并将它们和我们设置的过期时间拼接在一起,组成一个字符串,假设为:
$info = 'foo.1497279169.1497379180';
然后我们根据以上信息信息生成签名(这里我们假设密钥为‘mystar’):
$signature = hash_hmac('md5',$info,'mystar');
最后我们将这两部分拼接起来,得到最终的Token字符串:
$token = $info.'.'.$signature;
此时得到的字符串为:
foo.1497279169.1497379180.8fd81e6e607d9228a6ef61e83b65e940
当用户登陆成功时,我们将此字符串储存到cookie中,那么在用户登录后,每次向服务器发送请求都会带着这个Token字符串,服务器在拿到字符串后,利用explode()函数将字符串的前三部分(即信息部分)取出,使用同样的方法拼接成一个字符串,并用hash_hmac()函数,再次对其进行加密,用加密后的字符串和签名部分做比较,如果相等,那么证明这个cookie没有被修改过,那么就成功验证了用户的合法身份。
$arr = explode('.',$_COOKIE['token']);$info = $arr[0].'.'.$arr[1].'.'.$arr[2];$true_signature = hash_hmac('md5',$info,'mystar');if ($true_signature == $arr[3]){ //验证成功}else{ //验证失败,数据被非法修改}
在整个验证的过程中,不需要在session或是数据库中储存任何的信息,Token本身携带了足够的信息,只需要在客户端的cookie或本地介质存储状态信息,然后用服务端的代码进行验证即可,所以说是基于Token的身份验证是无状态的。
最后,这只是最简单的思路,实际应用中$info中可以储存更多的信息,且一般需要用Base64进行编码后再进行拼接和加密(JWT)。
阅读全文
1 0
- (PHP)基于Token的身份验证中对无状态的理解
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于Token的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于Token的身份验证
- 基于 Token 的身份验证
- 基于Token的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证
- 基于 Token 的身份验证方法(流程)
- JAVA中的Token 基于Token的身份验证
- 了解基于Token的身份验证的来龙去脉
- Eclipse中导入外部jar包
- day 2 替换空格
- d1
- 优化前三步
- 前端静态基于纯js的最后一步验证
- (PHP)基于Token的身份验证中对无状态的理解
- 搭建FTP服务器
- 安卓高级控件3之Gallery(画廊)
- Numpy中转置transpose、T和swapaxes
- 亿级Web系统的容错性建设实践
- Uncaught RangeError: Maximum call stack size exceeded
- 前端-表头固定,内容滚动
- 安卓开发之“LitePal”
- Spring 申明式事务之XML模式