service.js 3.9 KB

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