卡比记账项目的前端界面已经全部完成,接下来要做登陆接口,这个接口是基于JWT来完成的,所以在本篇博客中总结一下有关JWT的知识。
JWT中的J是JSON,W是web,T是token,这里可以简单把token理解为加密字符串
前置知识——Cookie
通俗来讲,Cookie是属于HTTP协议的一个东西,主要功能是服务器server向客户端client(可以是浏览器)发送的一段token。服务器给浏览器的token就是cookie。这个token必须在后续的所有请求中自动添加。浏览器每次向同域名服务器发送的请求的header中都必须含有cookie:token的字段。满足这个特征的字符串就是cookie。 他与localstorage的区别就在于浏览器会自动把cookie带到同一个域名的请求。
JWT定义
通俗来讲就是server发送了一个票给client,client可以解密这张票然后得到里面的内容。
JWT就是JSON Web Token的简称。
JWT结构
JWT包括三个部分:头——Header,体——Payload,签名(密文)——Signature。
JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:
- Header : 描述 JWT 的元数据,定义了生成签名的算法以及
Token的类型。 - Payload : 用来存放实际需要传递的数据
- Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。
Header部分需要标记一下引用的加密算法,以及类型。这些字段是一定要包含的。 示例如下:
{
"alg": "HS256",
"typ": "JWT",
}
Payload部分来存放重要数据,比如当前用户是admin。这个部分就是JSON。 示例如下:
{
"loggedInAs": "admin",
"iat": "1422779638",
"uid": "1",
}
标准中注册的声明 (建议但不强制使用) :
-
iss: jwt签发者
-
sub: jwt所面向的用户
-
aud: 接收jwt的一方
-
exp: jwt的过期时间,这个过期时间必须要大于签发时间
-
nbf: 定义在什么时间之前,该jwt都是不可用的.
-
iat: jwt的签发时间
-
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
Signature = 加密(私钥,base64(header),base64(body))
base64是为了防止内容出现奇怪的字符,比如汉字,加密是一个函数
JWT 通常是这样的:xxxxx.yyyyy.zzzzz
比如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header 和 Payload 都是 JSON 格式的数据,Signature 由 Payload、Header 和 Secret(密钥)通过特定的计算公式和加密算法得到
可以理解为 JWT=加密(uid)
JWT使用
用户在登录的时候前端发送了一个请求POST/JWT,这个时候会把用户名/密码/验证码之类的发送给服务器。服务器这时会发送一个JWT回来,xxxxx.yyyyy.zzzzz前端只会在意中间的uid的部分。不用把uid读出来。由于JWT不是放在Cookie里面的,所以我们需要手动维护。
1. 把JWT放到LocalStorage里面
2. 配置axios,让所有请求的header都带上JWT
3. GET/user
这时服务器会看 1. Auth的字段内有没有JWT 2. 解密JWT,看signature中的uid是不是和JSON中的uid一样,验证有没有被修改 3. 从数据库里找到这个数据,用JSON发给前端
在HTTP协议中,可以把JWT放在cookie中解决。只是JWT应用会更加广泛。