service.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import Request from 'luch-request'
  2. import setting from './setting.js'
  3. import crypto from '@/utils/crypto.js'
  4. let baseURL = setting.baseURL
  5. let refreshTokenUrl = baseURL + "blade-auth/oauth/token"
  6. //获取token
  7. const getTokenStorage = () => {
  8. let token = ''
  9. try {
  10. token = uni.getStorageSync('token')
  11. } catch (e) {}
  12. return token
  13. }
  14. //缓存token信息
  15. const cacheToken = (data) => {
  16. let tokenInfo = {
  17. accessToken: data.access_token,
  18. //提前500秒过期
  19. expiresIn: new Date().getTime() + (data.expires_in - 500) * 1000,
  20. refreshToken: data.refresh_token,
  21. tenantId: data.tenant_id,
  22. nickName: data.nick_name
  23. }
  24. uni.setStorageSync('token', data.access_token)
  25. uni.setStorageSync('tokenInfo', tokenInfo)
  26. }
  27. const http = new Request()
  28. http.setConfig((config) => {
  29. /* 设置全局配置 */
  30. config.baseURL = baseURL /* 根域名不同 */
  31. config.header = {
  32. ...config.header,
  33. }
  34. return config
  35. })
  36. http.interceptors.request.use((config) => {
  37. /* 请求之前拦截器。可以使用async await 做异步操作 */
  38. config.header = {
  39. ...config.header,
  40. "Content-Type": "application/json;charset=UTF-8",
  41. "Authorization": "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
  42. "Blade-Auth": getTokenStorage()
  43. }
  44. console.log(config,"122222222222");
  45. if (setting.enabledCrypto && config.method == 'POST' && config.data) {
  46. let encrypt= crypto.encrypt(JSON.stringify(config.data))
  47. console.log(crypto.decrypt(encrypt),"/******************");
  48. config.data=encrypt
  49. }
  50. return config
  51. }, (config) => {
  52. return Promise.reject(config)
  53. })
  54. // 是否正在刷新的标记
  55. let isRefreshing = false
  56. // 重试队列,每一项将是一个待执行的函数形式
  57. let requests = []
  58. http.interceptors.response.use(async (response) => {
  59. /* 请求之后拦截器。可以使用async await 做异步操作 */
  60. //toekn过期处理
  61. //200 返回数据成功 0
  62. if (response.data.code != 200) {
  63. uni.showToast({
  64. icon: 'none',
  65. title: response.data.msg
  66. })
  67. return Promise.reject(response)
  68. }
  69. return response.data
  70. }, async (err) => { // 请求错误做点什么
  71. if (err.data.code == 401) {
  72. let {
  73. config
  74. } = err
  75. if (!isRefreshing) {
  76. isRefreshing = true
  77. let tokenInfo = uni.getStorageSync('tokenInfo')
  78. if (!tokenInfo.tenantId) {
  79. uni.showModal({
  80. title: "提示",
  81. content: "会话已过期,请重新登录",
  82. showCancel:false,
  83. confirmColor:'#EF9944',
  84. success: (res)=>{
  85. if (res.confirm) {
  86. uni.clearStorageSync()
  87. uni.reLaunch({
  88. url:"/pages/login/account-login"
  89. })
  90. }
  91. }
  92. });
  93. return
  94. }
  95. let [, res] = await uni.request({
  96. url: refreshTokenUrl,
  97. method: 'POST',
  98. header: {
  99. 'Authorization': "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
  100. 'Content-Type': 'application/x-www-form-urlencoded',
  101. 'Tenant-Id': tokenInfo.tenantId
  102. },
  103. data: {
  104. 'tenantId': tokenInfo.tenantId,
  105. 'refresh_token': tokenInfo.refreshToken,
  106. 'grant_type': "refresh_token",
  107. 'scope': "all",
  108. }
  109. })
  110. if (res.data && res.data.error_description=="用户名或密码不正确") {
  111. uni.clearStorage()
  112. uni.reLaunch({
  113. url:"/pages/login/account-login"
  114. })
  115. return
  116. }
  117. //否则保存新的token
  118. cacheToken(res.data)
  119. requests.forEach(cb => cb())
  120. // 重试完了清空这个队列
  121. requests = []
  122. isRefreshing = false
  123. return http.request(config)
  124. } else {
  125. return new Promise((resolve) => {
  126. // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
  127. requests.push(() => {
  128. resolve(http.request(config))
  129. })
  130. })
  131. }
  132. }
  133. if (err.data.code == 500) {
  134. uni.showToast({
  135. title: err.data.msg,
  136. icon: "none"
  137. })
  138. return Promise.reject(err)
  139. }
  140. if (!err.data.success) {
  141. uni.showToast({
  142. title: err.data.msg,
  143. icon: "none"
  144. })
  145. return err.data
  146. } else {
  147. return err.data
  148. }
  149. })
  150. export {
  151. http
  152. }