(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)。
原创粉丝点击