| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- import Request from 'luch-request'
- import setting from './setting.js'
- import crypto from '@/utils/crypto.js'
- import queryParams from '@/utils/queryParams.js'
- let baseURL = setting.baseURL
- let refreshTokenUrl = baseURL + "blade-auth/oauth/token"
- //获取token
- const getTokenStorage = () => {
- let token = ''
- try {
- token = uni.getStorageSync('token')
- } catch (e) {}
- return token
- }
- //缓存token信息
- const cacheToken = (data) => {
- let tokenInfo = {
- accessToken: data.access_token,
- //提前500秒过期
- expiresIn: new Date().getTime() + (data.expires_in - 500) * 1000,
- refreshToken: data.refresh_token,
- tenantId: data.tenant_id,
- nickName: data.nick_name
- }
- uni.setStorageSync('token', data.access_token)
- uni.setStorageSync('tokenInfo', tokenInfo)
- }
- const http = new Request()
- http.setConfig((config) => {
- /* 设置全局配置 */
- config.baseURL = baseURL /* 根域名不同 */
- config.header = {
- ...config.header,
- }
- return config
- })
- http.interceptors.request.use((config) => {
- /* 请求之前拦截器。可以使用async await 做异步操作 */
- config.header = {
- ...config.header,
- "Content-Type": "application/json;charset=UTF-8",
- "Authorization": "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
- "Blade-Auth": getTokenStorage()
- }
- if (setting.enabledCrypto && config.method == 'POST' && config.data && crypto.isNotInWhiteList(config.url) ) {
- let encrypt = crypto.encrypt(JSON.stringify(config.data))
- config.data = encrypt
- }
- return config
- }, (config) => {
- return Promise.reject(config)
- })
- // 是否正在刷新的标记
- let isRefreshing = false
- // 重试队列,每一项将是一个待执行的函数形式
- let requests = []
- http.interceptors.response.use(async (response) => {
- /* 请求之后拦截器。可以使用async await 做异步操作 */
- //toekn过期处理
- //200 返回数据成功 0
- if (response.data.code != 200) {
- uni.showToast({
- icon: 'none',
- title: response.data.msg
- })
- return Promise.reject(response)
- }
- return response.data
- }, async (err) => { // 请求错误做点什么
- if (err.data.code == 401) {
- let {
- config
- } = err
- if (!isRefreshing) {
- isRefreshing = true
- let tokenInfo = uni.getStorageSync('tokenInfo')
- if (!tokenInfo.tenantId) {
- let phone = uni.getStorageSync("phone")
- uni.showModal({
- title: "提示",
- content: "会话已过期,请重新登录",
- showCancel: false,
- confirmColor: '#EF9944',
- success: (res) => {
- if (res.confirm) {
- uni.clearStorageSync()
- uni.set
- uni.reLaunch({
- url: "/pages/login/account-login?phone=" + phone
- })
- }
- }
- });
- return
- }
- let tokenParams={
- 'tenantId': tokenInfo.tenantId,
- 'refresh_token': tokenInfo.refreshToken,
- 'grant_type': "refresh_token",
- 'scope': "all",
- }
- let [, res] = await uni.request({
- url: refreshTokenUrl + queryParams(tokenParams),
- method: 'POST',
- header: {
- 'Authorization': "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
- 'Tenant-Id': tokenInfo.tenantId
- }
- })
- if (res.data && res.data.error_description == "用户名或密码不正确") {
- uni.clearStorage()
- uni.reLaunch({
- url: "/pages/login/account-login"
- })
- return
- }
- //否则保存新的token
- cacheToken(res.data)
- requests.forEach(cb => cb())
- // 重试完了清空这个队列
- requests = []
- isRefreshing = false
- return http.request(config)
- } else {
- return new Promise((resolve) => {
- // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
- requests.push(() => {
- resolve(http.request(config))
- })
- })
- }
- }
- if (err.data.code == 500) {
- uni.showToast({
- title: err.data.msg,
- icon: "none"
- })
- return Promise.reject(err)
- }
- if (!err.data.success) {
- uni.showToast({
- title: err.data.msg,
- icon: "none"
- })
- return err.data
- } else {
- return err.data
- }
- })
- export {
- http
- }
|