checkToken.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * Created by Andste on 2018/5/7.
  3. */
  4. import Vue from 'vue'
  5. import Storage from './storage'
  6. import request, { API } from '@/utils/request'
  7. import store from '@/store'
  8. /**
  9. * 检查token:
  10. * 1. user/accessToken/refreshToken都不存在。
  11. * 表示用户没有登录,不能放行需要登录的API
  12. * 2. 不存在accessToken,但是user/refreshToken存在。
  13. * 表示accessToken过期,需要重新获取accessToken。
  14. * 如果重新获取accessToken返回token失效错误,说明已被登出。
  15. * @param options
  16. * @returns {Promise<any>}
  17. */
  18. export default function checkToken(options) {
  19. // uid
  20. const uid = Storage.getItem('uid')
  21. // 访问Token
  22. const accessToken = Storage.getItem('access_token')
  23. // 刷新Token
  24. const refreshToken = Storage.getItem('refresh_token')
  25. //刷新token过期时间
  26. const refreshTokenTimeout = Storage.getItem('refresh_token_timeout')
  27. //access_token过期时间
  28. const accessTokenTimeout = Storage.getItem('access_token_timeout')
  29. const uuid = Storage.getItem('uuid')
  30. //当前时间戳
  31. const now = Math.round(new Date() / 1000)
  32. // 返回异步方法
  33. return new Promise((resolve, reject) => {
  34. /**
  35. * 如果accessToken、uid、refreshToken都存在。
  36. * 说明必要条件都存在,可以直接通过,并且不需要后续操作。
  37. */
  38. var checkLock
  39. // console.log('accessTokenout', !accessTokenTimeout || accessTokenTimeout <= now)
  40. if (accessToken && uid && refreshToken && accessTokenTimeout && now < accessTokenTimeout) {
  41. resolve()
  42. return
  43. }
  44. /**
  45. * 如果需要Token,但是refreshToken或者uid没有。
  46. * 说明登录已失效、或者cookie有问题,需要重新登录。
  47. */
  48. //刷新token失效了,需要重新登陆获取
  49. if (!refreshTokenTimeout || refreshTokenTimeout < now) { //刷新token失效,直接退出
  50. // uni.redirectTo({
  51. // url: '/pages/login/index'
  52. // })
  53. resolve()
  54. return
  55. }
  56. if (!accessTokenTimeout || accessTokenTimeout <= now) //access_token 失效 刷新token
  57. {
  58. console.log('refreshtoken')
  59. const param = {
  60. 'refresh_token': refreshToken
  61. }
  62. uni.request({
  63. url: `${API.buyer}/passport/token`,
  64. method: 'POST',
  65. header: {
  66. 'Content-Type': 'application/x-www-form-urlencoded',
  67. 'uuid': uuid
  68. },
  69. data: param,
  70. success(res) {
  71. console.log(res)
  72. const final = {}
  73. const {
  74. accessToken,
  75. refreshToken,
  76. accessTokenTimeout,
  77. refreshTokenTimeout
  78. } = res.data.accessToken ? res.data : final
  79. // 刷新成功 更新凭证数据
  80. console.log('refreshToken', accessToken)
  81. if (accessToken && refreshToken && accessTokenTimeout) {
  82. const now = Math.round(new Date() / 1000)
  83. store.dispatch('setAccessTokenAction', accessToken)
  84. store.dispatch('setRefreshTokenAction', refreshToken)
  85. Storage.setItem('access_token_timeout', now + accessTokenTimeout - 60)
  86. Storage.setItem('refresh_token_timeout', now + refreshTokenTimeout - 60)
  87. resolve()
  88. } else { //刷新返回数据错误
  89. Storage.removeItem('access_token_timeout')
  90. Storage.removeItem('refresh_token_timeout')
  91. Storage.removeItem('access_token')
  92. Storage.removeItem('refresh_token')
  93. uni.redirectTo({
  94. url: '/pages/login/index'
  95. })
  96. return
  97. }
  98. },
  99. fail(err) { //刷新token失败
  100. Storage.removeItem('access_token_timeout')
  101. Storage.removeItem('refresh_token_timeout')
  102. Storage.removeItem('access_token')
  103. Storage.removeItem('refresh_token')
  104. uni.redirectTo({
  105. url: '/pages/login/index'
  106. })
  107. return
  108. }
  109. })
  110. } else { //accessToken 有效
  111. resolve()
  112. }
  113. })
  114. }