| 1 | const crypto = require("crypto"); |
| 2 | |
| 3 | module.exports = new class { |
| 4 | /** |
| 5 | * 创建token |
| 6 | * |
| 7 | * @param {*} obj |
| 8 | * @param {*} exp |
| 9 | * @returns |
| 10 | */ |
| 11 | createToken(params, exp) { |
| 12 | let payload = { |
| 13 | data: params, |
| 14 | created: parseInt(Date.now() / 1000),//token生成的时间的,单位秒 |
| 15 | exp: exp || 3600//token有效期,精确到秒 |
| 16 | }; |
| 17 | |
| 18 | //payload信息 |
| 19 | let base64Str = Buffer.from(JSON.stringify(payload), "utf8").toString("base64"); |
| 20 | |
| 21 | //添加签名,防篡改 |
| 22 | let secret = "作者QQ:1178560551"; |
| 23 | let hash = crypto.createHmac('sha256', secret); |
| 24 | hash.update(base64Str); |
| 25 | let signature = hash.digest('base64'); |
| 26 | |
| 27 | return base64Str + "." + signature; |
| 28 | } |
| 29 | |
| 30 | checkToken(token) { |
| 31 | let decodeToken = (token) => { |
| 32 | |
| 33 | let decArr = token.split("."); |
| 34 | if (decArr.length < 2) { |
| 35 | //token不合法 |
| 36 | return false; |
| 37 | } |
| 38 | |
| 39 | let payload = {}; |
| 40 | //将payload json字符串 解析为对象 |
| 41 | try { |
| 42 | payload = JSON.parse(Buffer.from(decArr[0], "base64").toString("utf8")); |
| 43 | } catch (e) { |
| 44 | return false; |
| 45 | } |
| 46 | |
| 47 | //检验签名 |
| 48 | let secret = "作者QQ:1178560551"; |
| 49 | let hash = crypto.createHmac('sha256', secret); |
| 50 | hash.update(decArr[0]); |
| 51 | let checkSignature = hash.digest('base64'); |
| 52 | |
| 53 | return { |
| 54 | payload: payload, |
| 55 | signature: decArr[1], |
| 56 | checkSignature: checkSignature |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | let resDecode = decodeToken(token); |
nothing calls this directly
no outgoing calls
no test coverage detected