天天看点

基于Token的身份验证——JWT

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

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

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

A.B.C

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

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

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

header格式为:

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

将header用base64加密,得到A

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

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

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

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

将claim set加密后得到<code>B</code>,学名<code>payload</code>

将<code>A.B</code>使用HS256加密(其实是用header中指定的算法),当然加密过程中还需要密钥(自行指定的一个字符串)。

加密得到<code>C</code>,学名<code>signature</code>,其实就是一个字符串。作用类似于CRC校验,保证加密没有问题。

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

可以放到HTTP请求的请求头中,通常是<code>Authorization</code>字段。

也有人说放到cookie。不过移动端app用cookie似乎不方便。

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

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

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

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

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