首页 > 编程语言 >php中关于token验证的相关问题详解

php中关于token验证的相关问题详解

时间:2023-10-17 13:07:27浏览次数:41  
标签:验证 JWT token 详解 time 服务器 php 客户端

这篇文章主要介绍了php中关于token验证的相关问题详解的相关资料,需要的朋友可以参考下

目录


token验证

什么是token?我相信很多开发者都或多或少听过基于 token 的用户鉴权和基于 session 的用户鉴权,而今天说的 token 验证就是第一种了。token 的意思是“令牌”,是用户第一次登录服务器返回的,它能让用户不需要提交账户和密码就能进行服务器验证身份,它是被放在请求头中一起提交给服务器的。

为什么用 token 验证?怎么用 token 验证?现在简单介绍一下,有错误请大牛指出,我会立即更正!


首先是为什么用?

为了验证用户的登录情况,毕竟不是登录状态的话很多东西是不允许访问和呈现出来的。 减少数据库的频繁查询,增加服务器性能,使得服务器更加健壮。 它可以在多个服务间共享,完全由应用管理,可以避开浏览器的同源策略。 增加扩展性、安全性和减少服务器内存开销。传统的服务器验证是使用 cookie + session 验证,服务器需要每一次都验证客户端的请求去辨别客户端身份,并且还要创建一个记录将用户信息存储起来,然而随着现在科技发达,这种验证弊端也就显露出来了,例如用户增多从而引发内存资源消耗变大、CORS(跨域资源共享)和 CSRF(跨域请求伪造)等。


那么怎么用呢?

流程: 客户端的用户输入账户密码请求登录。 服务端收到请求并进行验证,成功则生成一个 token 值并返回给客户端。 客户端收到 token 值并将其存储,例如 本地存储:localStore 或 放在Cookie。 客户端每次请求都将 token 值放在请求头中发给服务器,服务器进行验证有效性。 成功则返回客户端请求的数据,失败可以让用户进行登录重新获取新的 token 值。


token的组成


一般 token 组成:

Uid(用户身份的唯一标识) time(时间戳) sign(签名)


JWT 组成:

JWT(JSON Web Tokens) 读:jot


标准的组成:

header(头部),参数主要包括:类型--JWT,签名的算法--HS256。

private static $header=array(
        'alg'=>'HS256', //生成signature的算法
        'typ'=>'JWT'    //类型
);

poyload(负荷):一般是自己想要放置的数据(因为信息会暴露,不建议放敏感信息)。

php中关于token验证的相关问题详解_客户端

$time = time();
$tokenInfo = [
    'iss'=>'CIMS',
    'iat'=>$time,
    'nbf'=>$time+2,
    'jti'=>md5(uniqid('JWT').$time),
    'sub'=>$data,
    'exp'=> $time+7200
];

sign(签名):为了防止被恶意篡改数据。

/**
* HMACSHA256签名 https://jwt.io/ 中HMACSHA256签名实现
* @param string $input 为base64编码后连接而成的的header和poyload的字符串:base64UrlEncode(header).".".base64UrlEncode(tokenInfo)
* @param string $key
* @param string $alg 算法方式
* @return mixed
*/
private static function signature(string $input, string $key, string $alg = 'HS256')
{
$alg_config=array(
'HS256'=>'sha256'
);
return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));
}

结果:一般会使用 base64 编码,中间用.隔开

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm5hbWUiOiJjZXNoaSIsImF1ZCI6IiIsImV4cCI6MTY4MTIyNDY0OCwiaWF0IjoxNjgxMjIxMDQ4LCJpc3MiOiIiLCJqdGkiOiJkN2UxYTBiNGU3MDZmODUxMjgzZWZkZWVlZjQ5MWEwOSIsIm5iZiI6MTY4MTIyMTA0OCwic3ViIjoiIn0.qRTyO1pYHHJxBNRwHUz032NWKKqS3C9dakOHASJyASk

总结

扩展

放请求头:

php中关于token验证的相关问题详解_服务器_02

JWT 缺点:1.签发生成后无法修改。2.不包含权限控制。

解决token 注销问题:尽快让 token 失效,退出登录后删除 cookie,对失效的 token 形成黑名单,会违无状态特性,但是标记时间短,会减少服务器压力。

解决token 续签问题:后端在用户登录的接口添加 token 有效期判断:例如即将过期那就重新生成一个返回。

token验证目前是非常流行的,不仅仅只是在web网站上,移动端、小程序也会用到。例如小程序用的是使用 login 获取 code 发送给后端进行一系列使用微信官方API接口获取数据再进行加密等操作才返回 token,这里就不详细展开了吧,有兴趣哈哈哈哈自己查下看看啦。

到此这篇关于php中关于token验证的相关问题详解的文章就介绍到这了,更多相关php token验证内容请搜索51博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持51博客!

标签:验证,JWT,token,详解,time,服务器,php,客户端
From: https://blog.51cto.com/u_16306834/7901695

相关文章

  • PHP轮子批量替换数据库前缀
    <?phpinclude_once('fix_mysql.inc.php');//设置好相关信息echo'<metacharset="utf-8">';$dbserver='localhost';$dbname='test';//替换成你的数据库名$dbuser='root';//替换成你的数据库用户名$dbpassword='123......
  • Qt OpenGL textures详解
    1.初始化opengl资源 Q_INIT_RESOURCE:textures(资源名称)QSurfaceFormat:定义3d面显示方式如果在vs+qtvstools中无法正常显示3d图形,则需加入以下代码:format.setStenciBufferSize(8);format.setVersion(1,1);版本号根据用户安装的Qt版本来更改2.继承QOpenGLWidget和QOpen......
  • JDBC API详解
    //DriverManage//1.注册驱动//2.获取数据库连接//Connection//1.获取执行SQL的对象StatementcreateStatement();//普通执行sql对象PrepareStatementprepareStatement(sql);//预编译sql的执行sql对象:防止sql注入CallableStatementprepareCall(sql);//执行存储过程......
  • selenium之鼠标操作详解
    前言人类频繁的用手操作鼠标和键盘,为了解决这个问题,selenium工具为我们提供了一个类来处理这些事件—Actionchains,该类可以完成鼠标移动,鼠标点击事件、键盘输入、内容菜单交互等交互行为。1、常见的鼠标操作有:单击、右键点击、双击、移动鼠标、拖拽鼠标。(Actionchains代替人......
  • open_basedir(PHP可访问目录)
       open_basedir指令用来限制PHP只能访问那些目录,通常我们只需要设置Web文件目录即可。如果需要include加载外部脚本,也需要把脚本所在目录路径加入到open_basedir指令中,多个目录以分号(;)分割。   使用open_basedir需要注意的一点是,指定的显示实际上是前缀,而不是目录名......
  • 详解Java HashMap
    HashMap介绍HashMap遍历方式HashMap的遍历,大体上可分为4类,而每种类型下又有不同的实现方式,总共的遍历方式可分为7种:迭代器遍历:使用迭代器对EntrySet遍历;使用迭代器对KeySet遍历;foreach遍历:使用foreach对EntrySet遍历;使用foreach对KeySet遍历;lambda表达式遍历;stre......
  • JS实现导出Excel的五种方法详解
    <!DOCTYPEhtml><html><headlang="en"><metacharset="UTF-8"><title>html表格导出道</title><scriptlanguage="JavaScript"type="text/javascript">//第一种方法function......
  • PHP通用权限后台管理系统
    项目介绍一款PHP语言基于ThinkPhp6.x+Vue+ElementUI等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,目前框架已集成了完整的RBAC权限架构和常规基础模块,前端Vue端支持多主题......
  • PHP前后端分离开发框架
    项目介绍一款PHP语言基于ThinkPhp6.x+Vue+ElementUI等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,目前框架已集成了完整的RBAC权限架构和常规基础模块,前端Vue端支持多主题......
  • Java大文件上传详解及实例代码
    前言:上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120。但还是不行,有时候10分钟就崩了。同事说,可能是客户这里服......