什么是jwt
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
jwt的组成和结构
jwt加密后是一段字符串格式 例(xxxx.yyyy.zzzz),第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品,一般用户信息都是在这个地方存储),第三部分是签证(signature)
所以说白了,jwt就是三段字符串通过base64加密(对称加密)的结果,所以小程序端拿到加密后到字符串,首先对字符串进行分割,然后取出存有用户信息对字符串,在通过base64解密就可以得到正确对信息了。
小程序端首先对请求进行封装
每次小程序发送请求都需要在头部带上token,作为用户唯一标识,还用作单点登录,判断用户登录是否过期,
const requestPost = (url, data, istoken) => {
data = data || {};
const deviceParameters = wx.getStorageSync("deviceParameters");
if (istoken) {
let token = wx.getStorageSync("token");
return new Promise((res, rej) => {
wx.request({
url: baseUrl.baseUrl + url,
header: {
"content-type": "application/x-www-form-urlencoded",
"Authorization": token,
"deviceType": deviceParameters.deviceType,
"appVersion": deviceParameters.appVersion,
"userAgent": deviceParameters.userAgent,
"imeiSerial": deviceParameters.imeiSerial,
},
data: data,
method: "POST",
dataType: "json",
success: (f) => {
let c = JSON.parse(JSON.stringify(f));
if (responseType.responseType == true) {
let obj = Base64.decode(f.data.data)
obj.indexOf('{') != -1 ? c.data.data = JSON.parse(obj) : c.data.data = obj
}
res(c);
},
fail: function(f) {
if (typeof(f.data.msg) !== undefined) {
if (f.data.msg == '你的登录信息过期,请重新登录') {
} else {
rej(f);
}
}
},
complete: function(f) {
if (typeof(f.data.msg) !== undefined) {
if (f.data.code === 401) {
wx.showModal({
showCancel: false,
confirmColor: '#DD0000',
title: '提示',
content: '当前登录已失效,为了确保您的账号安全,请您重新登录',
success: function(res) {
if (res.confirm) {
wx.removeStorageSync('userInfo');
wx.removeStorageSync('token');
wx.removeStorageSync('users');
wx.switchTab({
url: '../mine/mine',
})
}
}
})
}
}
}
});
})
}
}
小程序登录时候对token进行解析和存储
//引入base64解密js
const Base64 = require("../../utils/jwt.js");
//拿到头部信息
let authorization = e.header.Authorization
//对头部信息进行分割
let tokenData = authorization.split(' ')[1]
let second = Base64.decode(tokenData.split('.')[1])
//解析然后存储
let token = JSON.parse(second)