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

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

  1. 基于Token进行身份验证

    1.基于服务器的验证 我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份.  在这之前,程序都是通过在服务端存储的登录信息来辨别请求的.这种方式一般都是通 ...

  2. 【转】基于Token的身份验证原理

    目录 1 发展史 2 Cookie 3 Session 3.1 cookie和session的区别 4 Token 4.1 传统方式--基于服务器的验证 4.2 基于服务器验证方式暴露的一些问题 4. ...

  3. node实现基于token的身份验证

    最近研究了下基于token的身份验证,并将这种机制整合在个人项目中.现在很多网站的认证方式都从传统的seesion+cookie转向token校验.对比传统的校验方式,token确实有更好的扩展性与安 ...

  4. 基于Token的身份验证的原理

    目录 1 发展史 2 Cookie 3 Session 3.1 cookie和session的区别 4 Token 4.1 传统方式--基于服务器的验证 4.2 基于服务器验证方式暴露的一些问题 4. ...

  5. 基于 Token 的身份验证:JSON Web Token

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等, 比起传统的身份验证方法,Token 扩展性更强 ...

  6. 用户数据表设计借鉴 浅谈数据库用户表结构设计,第三方登录 基于 Token 的身份验证

    最近对用户数据表的设计比较感兴趣,看到了两篇比较好的文章. 浅谈数据库用户表结构设计,第三方登录 转载于: https://www.cnblogs.com/jiqing9006/p/5937733.h ...

  7. 基于 Token 的身份验证方法

    基于 Token 的身份验证方法 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的:客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成 ...

  8. 基于Token的身份验证——JWT

    原文:基于Token的身份验证--JWT 初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就 ...

  9. 基于 Token 的身份验证和安全问题

    1 前言 最近为了学习 Token 知识,博主在网上狂搜资料,其中发现了两篇博文对 Token 的讲解特别详细的,博主看过之后感觉受益匪浅,现将两篇博文整合成一篇博文发布出来,从而分享给大家,希望能够 ...

最新文章

  1. java中如何改方法签名_我们可以在Java重写中更改方法签名吗?
  2. 介绍27款经典的CSS框架
  3. HttpWatch是强大的网页数据分析工具
  4. rapidjson读取json文件_SPARK入门 - json文件读取
  5. Python functool module
  6. Java 算法 邮票
  7. PHP新闻APP,【优速软件】APP/小程序接口:全部新闻列表,POSCMS,CodeIgniter技术文档,PHP开发文档,迅睿CMS框架官方教程...
  8. 【elasticsearch】org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILA
  9. RFID Cooking with Mifare Classic
  10. 调用iframe 中的js[兼容各种浏览器]
  11. 渗透测试/应急演练过程中metasploit制作木马连接失败问题排查
  12. Android 开源无线投屏,用树莓派Raspberry Pi 4B制作一个无线投屏器(20200803)
  13. R语言——双因素方差分析
  14. Unity Activator反射
  15. DICOM标准之一_介绍和概述
  16. vue纯前端下载excel表格
  17. C#解决串口数据丢失问题
  18. 如何批量实现通过MP3标题重命名文件名
  19. 华为v5服务器安装2012系统,裸金属服务器安装v5
  20. 【winPE系统下如何安装游戏手柄】

热门文章

  1. CSDN-屏蔽广告详细方法 仅对谷歌浏览器有效!
  2. SWAGAN:基于样式的小波驱动生成模型
  3. 4、EIGRP配置实验之手动汇总
  4. MySQL体系结构之物理文件
  5. (二)阅读器客户端开发实战_需求阐述
  6. 发展是硬道理 高可用从双机热备走向容灾复制集群
  7. 读dataframe存入mysql_DataFrame数据保存到mysql数据库中
  8. linux开启docker mysql_Linux服务器利用Docker快速搭建MySQL数据库
  9. 编程入门:准备学Python入门编程 为什么前辈一直劝我不行?
  10. 自学Python和科班出身的Python程序员差别在哪?几张图告诉你