JWT用法

112 阅读3分钟

卡比记账项目的前端界面已经全部完成,接下来要做登陆接口,这个接口是基于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应用会更加广泛。