博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Token的身份验证——JWT
阅读量:7255 次
发布时间:2019-06-29

本文共 1813 字,大约阅读时间需要 6 分钟。

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

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

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遵循,里面提到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应用流程?

  1. 初次登录:用户初次登录,输入用户名密码
  2. 密码验证:服务器从数据库取出用户名和密码进行验证
  3. 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT
  4. 返还JWT:服务器的HTTP RESPONSE中将JWT返还
  5. 带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT

转载地址:http://tckdm.baihongyu.com/

你可能感兴趣的文章
小程序开发系类之基础部分-开发工具
查看>>
Vue.js组件中v-model的使用
查看>>
移动相关HTML设置
查看>>
解决 Android ping IPv6 地址显示 network is unreachable 的问题
查看>>
【ELK】ELK集群搭建(ElasticSearch Logstash Kinaba)
查看>>
vue.cli脚手架初次使用图文教程
查看>>
node.js
查看>>
Vue 过渡实现轮播图
查看>>
使用npm发布项目
查看>>
关于NodeJS配置HTTPS服务、阿里云申请HTTPS证书
查看>>
Shortest Distance from All Buildings
查看>>
javascript之作用域
查看>>
1.1.linux命令.概要学习
查看>>
Jupyter介绍和使用
查看>>
在2019年,如何成为更好的Node.js开发者?
查看>>
国内云计算厂商众生相:四大阵营十几家企业生存盘点
查看>>
为了云,阿里、腾讯和百度一年花了多少钱?
查看>>
无服务器计算的黑暗面:程序移植没那么容易
查看>>
我在ThoughtWorks中的敏捷实践
查看>>
Universal Windows Platform(UWP)应用的窗口特性
查看>>