一、背景说明
需求是这样滴:对物联网终端设备以及网关设备进行统一的管理,这里需要一个设备管理平台,同时呢,计划开放API,以供应用开发者调用API来管理控制设备。设备管理平台本身的用的是传统的session来管理,设备管理者数量并不多,所以不会有超量的session给服务器造成太大的压力。开放API给第三方应用用户是为了应对第三方用户开发的各种移动端app以及需要自身维护的设备管理。所以用session就不是那么合适,计划采取token的方式。
多年以前我用过token这种方式来开发,那时候似乎还没有jwt这个框架,我记得是根据用户名密码生成token后存在数据库中的,每次token进来是需要从数据库中或者提前缓存的token池中来找到匹配的token以确保不是非法请求。
闲话多了,看看正题。
二、JWT以及JJWT介绍
首先呢,我们可以通过这里来看看JWT是个什么样的东西:https://jwt.io/introduction/ 官方说的很清楚了,我就用我蹩脚的英文来给大家解释下:
1、什么是JSON Web Token?
JSON Web Token (JWT)是一个开放的标准(RFC 7519),它定义了一种简洁独立的方式,以JSON对象的形式在各方之间安全地传输信息。
2、什么时候使用JWT呢?
授权和信息交换的时候
3、JWT结构介绍
JWT说白了,就是一串字符串,包含三个部分,三部分之间用“.”来分割。三部分分别是:
- Header
- Payload
- Signature
最后形成的字符串就像这样:xxxxx.yyyyy.zzzzz
Header大概就是这样的:
{
"alg": "HS256",
"typ": "JWT"
}
payload就是放内容的,官方叫做claims,这个是啥玩意呢?这玩意是声明一些实体,包括jwt自己已经定义好的特色的声明,还有一些用户加上的声明(我们这些开发者想加上的)以及一些附加数据
这玩意有三种类型,分别是 registered, public, and private claims. Registered Claims就是官方已经定义了的,比如:iss (issuer), exp (expiration time), sub (subject), aud(audience) public呢,就是自己可以随意定义了,要注意避免命名空间的冲突,https://www.iana.org/assignments/jwt/jwt.xhtml。private就是几方之间约定的,没有注册public的claims。感觉说多了自己都晕。
说白了就是一些key value,大概是这个样子的:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
signature是签名喽,就是你要发这些,你签个字再发,大概就是这个样子滴。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
最终形成这么个玩意:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
三、和springboot整合
待续啊,睡觉了先。