JSON Web Tokens are an open, industry standard ​​RFC 7519 ​​method for representing claims securely between two parties.

JWT.IO allows you to decode , verify and generate JWT

http://jwt.io

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

JWT标准的Token分为三部分:

header.payload.signature

Header头部,使用Base64编码。

{
"typ":"JWT", # Token 类型
"alg":"HS512" # 加密的算法
}

Payload 载荷,Token的具体内容,使用Base64编码

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

"username":"admin", # 自定义字段
"email":"demo@demo.com", #自定义字段
"Role" : ["Manager", "Project Administrator"] # 自定义字段
}

signature签证,由三部分组成。

HMACSHA512( base64UrlEncode(header)+"."+base64UrlEncode(payload),secret )

前两个使用.连接,然后使用secret和Header中的加密算法进行加密,将加密结果作为signature连接在最后。

Java JWT: JSON Web Token for Java and Android, created by Stormpath's CTO ,Les Hazlewood and is now maintaioned by a community of contributors.sss

Github: http://github.com/jwtk/jjwt

加解密的key是通过固定字符串转换而生成的,subject为用户信息的json字符串;ttlMillis是指token的有效期,时间较短,需要定时更新。

这里要介绍的token刷新方式,是在生成token的同时生成一个有效期较长的refreshToken,后续由客户端定时根据refreshToken来获取最新的token。浏览器和服务端之间建立sse(server send event)请求,来实现刷新。 github地址:https://github.com/ahmu/spring-authorization-demo