PHP无状态对象,(PHP)基于Token的身份验证中对无状态的理解

假设我们设计的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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值