最近在做一个JSPatch后台管理系统。起初只是自己内部用,后来买了阿里云的免费服务器,用docker+jenkins完成了一个自动化部署,于是就想把这个小东西放到公网里。所以现在开始回来完善一下登录注册的功能,当然这个不是最终解决方案,只是帮助大家了解Json Web Token的基本流程和koa-jwt的基本用法。
一.Json Web Token介绍
由于http协议的无状态性,有些时候我们需要保存一些状态,比如用户的登录信息等。目前主要用到的一种方式是session + cookie。这种方式我之前也有过实现,但是只适用于浏览器端而不适用于原生应用。另外一种方式就是我们今天要讲到的Json Web Token。
1.组成
JWT主要由三部分组成
Header:base64编码的json object,包含token类型和使用的加密算法。一个Header行如下
{"alg": "HS256","typ": "JWT"}
Payload:base64编码的json object,包含一些自定义信息(用户唯一标识),和一些jwt预留的标识。常用的有iss(签发者),exp(过期时间戳),sub(面向的用户),aud(接收方),iat(签发时间)等。jwt不会强制要求你使用预留标识,一个简单Payload行如下。
{"uid": 42245,"exp": Date.now()+10*60*1000}
Signature: 根据Header,PayloadA 和一个密钥(只有服务端知道),并利用Header中指定的加密算法,生成的一个签名串。
2.输出形式
JWT格式的输出是以.分隔的三段Base64编码,与SAML等基于XML的标准相比,JWT在HTTP和HTML环境中更容易传递。一个标准的JWT输出大概是这样子的
3.鉴权流程
这里以koa-jwt为例。服务端调用koa-jwt的sign方法生成token,通过api请求下发到客户端。客户端存入本地(h5就是localstorage,cookie,sessionstorage等,iOS的话就是NSUserDefault)。客户端在下一次请求的时候在header里面带上token,服务端koa-jwt检测到token,先进行校验,校验成功以后用decode方法解密,并直接赋予this.state.user。以下是一个流程图。