基于Token的身份验证之JWT基础教程

 更新时间:2018年09月06日 11:08:00   作者:ChrisZZ  
JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。下面这篇文章主要给大家介绍了关于基于Token的身份验证之JWT的基础相关资料,文中通过示例代码的非常详细,需要的朋友可以参考下

前言

初次了解JWT,很基础,高手勿喷。

基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session。

token应用流程为:

1、初次登录:用户初次登录,输入用户名密码。

2、密码验证:服务器从数据库取出用户名和密码进行验证。

3、生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT。

4、返还JWT:服务器的HTTP RESPONSE中将JWT返还。

5、带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorization字段都要有值,为JWT,用来验证用户身份以及对路由,服务和资源的访问权限进行验证。请求验证的url可以例如:http://127.0.0.1:8083/change/goodsMenu? token=JWT

JWT是啥?

JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:

A.B.C

A由JWT头部信息header加密得到

B由JWT用到的身份验证信息json数据加密得到

C由A和B加密得到,是校验部分

怎样生成A?

header格式为:

{
 "typ": "JWT",
 "alg": "HS256" 
}

它就是一个json串,两个字段是必须的,不能多也不能少。alg字段指定了生成C的算法,默认值是HS256

将header用base64加密,得到A

通常,JWT库中,可以把A部分固定写死,用户最多指定一个alg的取值

怎样计算B?

根据JWT claim set[用base64]加密得到的。claim set是一个json数据,是表明用户身份的数据,可自行指定字段很灵活,也有固定字段表示特定含义(但不一定要包含特定字段,只是推荐)。

这里偷懒,直接用php中的代码来表示claim set了,重在说明字段含义:

$token = array(
 "iss" => "http://example.org", #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
 "iat" => 1356999524,    #非必须。issued at。 token创建时间,unix时间戳格式
 "exp" => "1548333419",   #非必须。expire 指定token的生命周期。unix时间戳格式
 "aud" => "http://example.com", #非必须。接收该JWT的一方。
 "sub" => "jrocket@example.com", #非必须。该JWT所面向的用户
 "nbf" => 1357000000, # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
 "jti" => '222we',  # 非必须。JWT ID。针对当前token的唯一标识

 "GivenName" => "Jonny", # 自定义字段
 "Surname" => "Rocket", # 自定义字段
 "Email" => "jrocket@example.com", # 自定义字段
 "Role" => ["Manager", "Project Administrator"] # 自定义字段
);

JWT遵循RFC7519,里面提到claim set的json数据中,自定义字段的key是一个string,value是一个json数据。因此随意编写吧,很灵活。

个人初学,认为一个最基本最简单最常用的claim set为:

$token=array(
 "user_id" => 123456, #用户id,表明用户
 "iat" => 1356999524, #token发布时间
 "exp" => 1556999524, #token过期时间
);

将claim set加密后得到B,学名payload

怎样计算C?

将A.B使用HS256加密(其实是用header中指定的算法),当然加密过程中还需要密钥(自行指定的一个字符串)。
加密得到C,学名signature,其实就是一个字符串。作用类似于CRC校验,保证加密没有问题。

好了,现在A.B.C就是生成的token了。

怎样使用token?

可以放到HTTP请求的请求头中,通常是Authorization字段。
也有人说放到cookie。不过移动端app用cookie似乎不方便。

token应用流程?

初次登录:用户初次登录,输入用户名密码

密码验证:服务器从数据库取出用户名和密码进行验证

生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT

返还JWT:服务器的HTTP RESPONSE中将JWT返还

带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 解决VIM显示utf-8文件乱码问题

    解决VIM显示utf-8文件乱码问题

    在Vim中,有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding和termencoding。下面,我们详细介绍一下这四个选项的含义和作用,感兴趣的朋友一起看看吧
    2020-02-02
  • Webpack基础教程之名词解释

    Webpack基础教程之名词解释

    webpack 是一个现代JavaScript 应用程序的静态模块打包器,这次为大家简单介绍一下webpack及关于webpack的一些专属名词入口(entry),输出(output),loader,插件(plugins)
    2020-02-02
  • Ceph集群CephFS文件存储核心概念及部署使用详解

    Ceph集群CephFS文件存储核心概念及部署使用详解

    这篇文章主要为大家介绍了Ceph集群CephFS文件存储核心概念及部署使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 超好用的免费内网穿透工具【永久免费不限制流量】

    超好用的免费内网穿透工具【永久免费不限制流量】

    对于开发人员来讲,演示内网web站点、本地开发微信公众号、小程序开发、调试第三方支付系统对接等开发环境,往往需要一个环境可以进行调试,市面上内网穿透工具有很多,这里推荐一款简单又好用的cpolar,可以永久免费使用,不限制流量,支持http/https/tcp协议
    2022-09-09
  • 字符集和字符编码(Charset & Encoding)

    字符集和字符编码(Charset & Encoding)

    相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"、"�????????"?还记得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Encoding、Content-Language等消息头字段?这些就是接下来我们要探讨的
    2012-04-04
  • 大数据HelloWorld-Flink实现WordCount

    大数据HelloWorld-Flink实现WordCount

    这篇文章主要介绍了大数据HelloWorld-Flink实现WordCount的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 网址URL的大小写敏感吗,有什么区别?

    网址URL的大小写敏感吗,有什么区别?

    在 Web 开发中,网址URL 的大小写问题可能引发意想不到的行为,本文将从技术规范、服务器配置、浏览器行为等多个维度,系统解析 URL 各组件的大小写敏感性,并提供实践建议,可有效避免因 URL 大小写不一致引发的搜索引擎优化问题、链接失效及用户体验下降
    2025-04-04
  • OAuth 2.0授权协议详解

    OAuth 2.0授权协议详解

    这篇文章主要介绍了OAuth 2.0授权协议详解,本文对OAuth协议做了详解讲解,对OAuth协议的各个方面做了分解,读完本文你就会知道到底啥是OAuth了,需要的朋友可以参考下
    2014-09-09
  • Webstorm解除版本控制的场景分析

    Webstorm解除版本控制的场景分析

    这篇文章主要介绍了Webstorm解除版本控制的场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 利用DeepSeek实现复杂Git操作的详细过程

    利用DeepSeek实现复杂Git操作的详细过程

    今天综合利用 DeepSeek V3 和 R1 推理模型,成功解决了一个复杂的 Git 操作,谨以此文记录 DeepSeek 使用心得,以备后续复盘,下面是小编给大家介绍的利用DeepSeek实现复杂Git操作的详细过程,需要的朋友可以参考下
    2025-02-02

最新评论