token验证

yizhihongxing

token验证

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

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

首先是为什么用?

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

那么怎么用呢?

流程:

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

token的组成

一般 token 组成:

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

JWT 组成:

JWT(JSON Web Tokens) 读:jot

标准的组成:

  1. header(头部),参数主要包括:类型--JWT,签名的算法--HS256。
private static $header=array(
        'alg'=>'HS256', //生成signature的算法
        'typ'=>'JWT'    //类型
);
  1. poyload(负荷):一般是自己想要放置的数据(因为信息会暴露,不建议放敏感信息)。
    img
$time = time();
$tokenInfo = [
    'iss'=>'CIMS',
    'iat'=>$time,
    'nbf'=>$time+2,
    'jti'=>md5(uniqid('JWT').$time),
    'sub'=>$data,
    'exp'=> $time+7200
];
  1. 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

总结

扩展

放请求头:img

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

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

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

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

关于 token 更多的问题请在评论区留言!!!

参考文献

https://blog.csdn.net/MINGJU2020/article/details/103039418
https://blog.csdn.net/HD243608836/article/details/115732104
https://zhuanlan.zhihu.com/p/267771576

创作不易,若需转载请备注出处!

原文链接:https://www.cnblogs.com/zxlh1529/p/17284263.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:token验证 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • php循环table实现一行两列显示的方法

    那么我将为你详细讲解如何使用 PHP 循环 table 实现一行两列显示的方法。整个过程可以分为以下几步: 创建一个 HTML 表格 使用 PHP 循环输出表格行和列 在表格中显示数据 以下是每个步骤的详细说明。 1. 创建一个 HTML 表格 首先,你需要创建一个 HTML 表格的框架,如下所示: <table> <thead> &…

    PHP 2023年5月26日
    00
  • Windows下配置Nginx+PHP基本操作(启动、重启和退出)

    下面是在Windows系统下配置Nginx和PHP的完整攻略,包括启动、重启和退出操作: 1. 安装Nginx和PHP 首先需要安装Nginx和PHP,可以从官网下载对应的安装包进行安装。具体安装过程不再赘述。 2. 配置Nginx 接下来需要进行Nginx的配置,首先需要打开Nginx的配置文件nginx.conf。在Windows系统下,配置文件默认位于…

    PHP 2023年5月24日
    00
  • PHP页面间参数传递的四种方法详解

    让我来详细讲解“PHP页面间参数传递的四种方法详解”。 一、背景介绍 在网站开发过程中,经常需要将一个页面中获取到的参数传递到另一个页面中,以便另一个页面进行相应的处理或显示。在PHP中,实现页面间参数传递的方法有多种,本文将详细介绍其中的四种方法。 二、方法一:通过$_GET方法传递参数 在PHP中,$_GET方法用于获取由URL传递过来的参数。具体使用方…

    PHP 2023年5月26日
    00
  • PHP开启gzip页面压缩实例代码

    下面是详细的“PHP开启gzip页面压缩实例代码”的攻略。 什么是gzip压缩? GZip是GNU zip格式(GNU程序的一部分)。例如,Firefox发出一个HTTP请求以请求HTML,CSS和JavaScript文件。发送服务器的响应是类似的,其中包含HTML,CSS和JavaScript文件。当gzip被启用时,服务器将压缩响应的内容并将其发送回浏览…

    PHP 2023年5月26日
    00
  • php中的数组操作函数整理

    以下是详细讲解“php中的数组操作函数整理”: 简介 PHP中的数组操作函数很多,其中一些十分重要。本篇攻略主要整理了PHP中常用的一些数组操作函数,包括数组的创建、遍历、排序、查找等操作,以及示例说明。 创建数组 array函数 通过array函数可以创建一个新的数组,语法如下: array(value1, value2, …) 其中value可以是一个变…

    PHP 2023年5月26日
    00
  • PHP多维数组遍历方法(2种实现方法)

    对于“PHP多维数组遍历方法(2种实现方法)”这个问题,我可以给您提供详细的攻略和示例。 1. 什么是多维数组 多维数组是指数组中包含另一个数组,也就是二维数组的概念。多维数组还可以包含三维、四维、五维等,不同维度的数组可以相互包含。 2. 多维数组的遍历方法 PHP提供了两种方式遍历多维数组。 2.1. foreach遍历 使用foreach遍历多维数组非…

    PHP 2023年5月26日
    00
  • 常用照片尺寸有哪几个? 照片标准尺寸/像素对照表汇总

    在设计和处理照片时,了解常用的照片尺寸和像素大小是非常重要的。以下是常用照片尺寸和像素大小的汇总说明: 照片标准尺寸/像素对照表汇总 1. 网络图片 头像:一般为方形,在 200200 像素到500500 像素之间。 banner:网站首页的大图,通常是横幅广告。可以根据网站设计自由调整大小,多为 1920*1080 像素或更大。 2. 社交媒体 FaceB…

    PHP 2023年5月27日
    00
  • php实现session共享的实例方法

    让我们来详细讲解一下 PHP 实现 session 共享的实例方法。 什么是 session? 在开始之前,我们需要先了解一下 session 的概念。 Session 是网站用来记录用户状态的一种机制。如果没有 Session,那么每次用户访问网站的时候,网站都不能够区分这个用户和其他用户。而 Session 则可以通过在服务器端存储用户状态来解决这个问题…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部