service.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. if (setting.enabledCrypto && config.method == 'POST' && config.data && crypto.isNotInWhiteList(config.url) ) {
  46. let encrypt = crypto.encrypt(JSON.stringify(config.data))
  47. config.data = encrypt
  48. }
  49. return config
  50. }, (config) => {
  51. return Promise.reject(config)
  52. })
  53. // 是否正在刷新的标记
  54. let isRefreshing = false
  55. // 重试队列,每一项将是一个待执行的函数形式
  56. let requests = []
  57. http.interceptors.response.use(async (response) => {
  58. /* 请求之后拦截器。可以使用async await 做异步操作 */
  59. //toekn过期处理
  60. //200 返回数据成功 0
  61. if (response.data.code != 200) {
  62. uni.showToast({
  63. icon: 'none',
  64. title: response.data.msg
  65. })
  66. return Promise.reject(response)
  67. }
  68. return response.data
  69. }, async (err) => { // 请求错误做点什么
  70. if (err.data.code == 401) {
  71. let {
  72. config
  73. } = err
  74. if (!isRefreshing) {
  75. isRefreshing = true
  76. let tokenInfo = uni.getStorageSync('tokenInfo')
  77. if (!tokenInfo.tenantId) {
  78. let phone = uni.getStorageSync("phone")
  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.set
  88. uni.reLaunch({
  89. url: "/pages/login/account-login?phone=" + phone
  90. })
  91. }
  92. }
  93. });
  94. return
  95. }
  96. let tokenParams={
  97. 'tenantId': tokenInfo.tenantId,
  98. 'refresh_token': tokenInfo.refreshToken,
  99. 'grant_type': "refresh_token",
  100. 'scope': "all",
  101. }
  102. let [, res] = await uni.request({
  103. url: refreshTokenUrl + queryParams(tokenParams),
  104. method: 'POST',
  105. header: {
  106. 'Authorization': "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
  107. 'Tenant-Id': tokenInfo.tenantId
  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. }