初次了解JWT,很基础,高手勿喷。
基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session。php
JWT就是一个字符串,通过加密处理与校验处理的字符串,形式为:html
A.B.C算法
A由JWT头部信息header加密获得
B由JWT用到的身份验证信息json数据加密获得
C由A和B加密获得,是校验部分数据库
header格式为:json
{ "typ": "JWT", "alg": "HS256" }
它就是一个json串,两个字段是必须的,不能多也不能少。alg
字段指定了生成C的算法,默认值是HS256
将header用base64加密,获得A
一般,JWT库中,能够把A部分固定写死,用户最多指定一个alg
的取值服务器
根据JWT claim set[用base64]加密获得的。claim set是一个json数据,是代表用户身份的数据,可自行指定字段很灵活,也有固定字段表示特定含义(但不必定要包含特定字段,只是推荐)。
这里偷懒,直接用php中的代码来表示claim set了,重在说明字段含义:cookie
$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数据。所以随意编写吧,很灵活。session
我的初学,认为一个最基本最简单最经常使用的claim set为:app
$token=array( "user_id" => 123456, #用户id,代表用户 "iat" => 1356999524, #token发布时间 "exp" => 1556999524, #token过时时间 );
将claim set加密后获得B
,学名payload
加密
将A.B
使用HS256加密(实际上是用header中指定的算法),固然加密过程当中还须要密钥(自行指定的一个字符串)。
加密获得C
,学名signature
,其实就是一个字符串。做用相似于CRC校验,保证加密没有问题。
好了,如今A.B.C
就是生成的token了。
能够放到HTTP请求的请求头中,一般是Authorization
字段。
也有人说放到cookie。不过移动端app用cookie彷佛不方便。