转载收藏于 http://www.cnblogs.com/zjutzz/p/5790180.html

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应用流程?

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

最新文章

  1. 共享Excel编辑的一些资源
  2. AFNetworking3.0介绍,收藏
  3. Javascript初学篇章_3(注释/if/switch)
  4. Fiddler-010-网络延时应用小技巧-模拟低网速环境
  5. curl要注意的几点
  6. vijos P1352 最大获利(最小割)
  7. 设计模式——辛格尔顿(Singleton)
  8. 从Angular2路由引发的前后端路由浅谈
  9. 容斥原理及SQL in关键字在EF中的应用
  10. [译]ASP.NET Core 2.0 视图引擎
  11. PAT 1003. Emergency 单源最短路
  12. 红透半边天的VR(虚拟现实)产业
  13. Python迭代和解析(1):列表解析
  14. 程序配置的原则和实践以及 Spring Boot 支持方式
  15. 第二十三篇-ubuntu18.04怎么下载播放器以及如何设置默认播放器
  16. js 比大小
  17. solr7.7.0搜索引擎使用(三)(添加文件索引)
  18. CentOS yum 安装获取原始rpm文件的方法
  19. 用C#代码来安装、卸载、启动、关闭服务
  20. React对比Vue(05 生命周期的对比)

热门文章

  1. C#调用带结构体指针的C Dll的方法
  2. SWT自定义选项卡CTabFolder
  3. Android笔记---点击事件的四种写法
  4. 拥抱PBO(基于项目的组织)聚焦核心价值创造
  5. lua实现大数运算
  6. 37.创建自定义的指令的限制使用 通过restrict 设置
  7. json数据字典,以及数据在下拉框中显示
  8. html页面全屏化显示
  9. AngularJs轻松入门(七)多视图切换
  10. codeforces 400 C Inna and Huge Candy Matrix【模拟】