From 5844e74d32b7a62bf7df88125c36ef5ec8a8693b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=BE=88=E5=B7=AE=E5=95=A6?= <17633066053@163.com> Date: Thu, 16 Feb 2023 14:41:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:sparkles:=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=BF=87=E6=9C=9Ftoken=E8=AF=B7=E6=B1=82=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js_sdk/t-jwt/jwt.js | 77 +++++++++++++++++++++++++++++++++++++++++++++ utils/request.js | 12 +++++++ 2 files changed, 89 insertions(+) create mode 100644 js_sdk/t-jwt/jwt.js diff --git a/js_sdk/t-jwt/jwt.js b/js_sdk/t-jwt/jwt.js new file mode 100644 index 0000000..cea62a1 --- /dev/null +++ b/js_sdk/t-jwt/jwt.js @@ -0,0 +1,77 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; +exports.weBtoa = function (string) { + string = String(string); + var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3; + for (; i < string.length;) { + if ((a = string.charCodeAt(i++)) > 255 || + (b = string.charCodeAt(i++)) > 255 || + (c = string.charCodeAt(i++)) > 255) + throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); + bitmap = (a << 16) | (b << 8) | c; + result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); + } + return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result; +}; +exports.weAtob = function (string) { + string = String(string).replace(/[\t\n\f\r ]+/g, ""); + if (!b64re.test(string)) + throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); + string += "==".slice(2 - (string.length & 3)); + var bitmap, result = "", r1, r2, i = 0; + for (; i < string.length;) { + bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | + (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); + result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : + r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : + String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); + } + return result; +}; +function b64DecodeUnicode(str) { + return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) { + var code = p.charCodeAt(0).toString(16).toUpperCase(); + if (code.length < 2) { + code = "0" + code; + } + return "%" + code; + })); +} +function base64_url_decode(str) { + var output = str.replace(/-/g, "+").replace(/_/g, "/"); + switch (output.length % 4) { + case 0: + break; + case 2: + output += "=="; + break; + case 3: + output += "="; + break; + default: + throw "Illegal base64url string!"; + } + try { + return b64DecodeUnicode(output); + } + catch (err) { + return exports.weAtob(output); + } +} +function weappJwtDecode(token, options) { + if (typeof token !== "string") { + throw ("Invalid token specified"); + } + options = options || {}; + var pos = options.header === true ? 0 : 1; + try { + return JSON.parse(base64_url_decode(token.split(".")[pos])); + } + catch (e) { + throw ("Invalid token specified: " + e.message); + } +} +exports.default = weappJwtDecode; \ No newline at end of file diff --git a/utils/request.js b/utils/request.js index 98c0d8a..adbb98e 100644 --- a/utils/request.js +++ b/utils/request.js @@ -10,6 +10,8 @@ import Foundation from "@/utils/Foundation.js"; import api from "@/config/api.js"; import uuid from "@/utils/uuid.modified.js"; +import jwt from '@/js_sdk/t-jwt/jwt.js' + let isNavigateTo = false @@ -74,6 +76,16 @@ http.interceptors.request.use( /* 请求之前拦截器。可以使用async await 做异步操作 */ let accessToken = storage.getAccessToken(); if (accessToken) { + /** + * 使用JWT解析 + * 小于当前时间将当前token清除 + */ + const decodeJwt = jwt(accessToken); + const timing = new Date().getTime() / 1000 + if(decodeJwt.exp <= timing){ + accessToken = "" + storage.setAccessToken('') + } const nonce = Foundation.randomString(6); const timestamp = parseInt(new Date().getTime() / 1000); const sign = md5(nonce + timestamp + accessToken);