RuoYi
2020-08-01 43bc0ca39be664ffaeea6256a9f2160f5a8f7e40
OAuth自动刷新续签Token
5 files modified
111 ■■■■■ changed files
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java 11 ●●●●● patch | view | raw | blame | history
ruoyi-ui/src/api/login.js 12 ●●●●● patch | view | raw | blame | history
ruoyi-ui/src/store/modules/user.js 32 ●●●●● patch | view | raw | blame | history
ruoyi-ui/src/utils/auth.js 28 ●●●●● patch | view | raw | blame | history
ruoyi-ui/src/views/index.vue 28 ●●●●● patch | view | raw | blame | history
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
@@ -32,6 +32,10 @@
    private static final String UUID = "uuid";
    private static final String GRANT_TYPE = "grant_type";
    private static final String REFRESH_TOKEN = "refresh_token";
    @Override
    public GatewayFilter apply(Object config)
    {
@@ -44,6 +48,13 @@
                return chain.filter(exchange);
            }
            // 刷新token请求,不处理
            String grantType = request.getQueryParams().getFirst(GRANT_TYPE);
            if (StringUtils.containsIgnoreCase(request.getURI().getPath(), AUTH_URL) && StringUtils.containsIgnoreCase(grantType, REFRESH_TOKEN))
            {
                return chain.filter(exchange);
            }
            // 消息头存在内容,且不存在验证码参数,不处理
            String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
            if (StringUtils.isNotEmpty(header) && StringUtils.startsWith(header, BASIC_)
ruoyi-ui/src/api/login.js
@@ -2,11 +2,11 @@
const client_id = 'web'
const client_secret = '123456'
const grant_type = 'password'
const scope = 'server'
// 登录方法
export function login(username, password, code, uuid) {
  const grant_type = 'password'
  return request({
    url: '/auth/oauth/token',
    method: 'post',
@@ -14,6 +14,16 @@
  })
}
// 刷新方法
export function refreshToken(refresh_token) {
  const grant_type = 'refresh_token'
  return request({
    url: '/auth/oauth/token',
    method: 'post',
    params: { client_id, client_secret, grant_type, scope, refresh_token }
  })
}
// 获取用户详细信息
export function getInfo() {
  return request({
ruoyi-ui/src/store/modules/user.js
@@ -1,9 +1,10 @@
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, logout, getInfo, refreshToken } from '@/api/login'
import { getToken, getRefreshToken, setToken, setRefreshToken, setExpiresIn, removeToken } from '@/utils/auth'
const user = {
  state: {
    token: getToken(),
    refresh_token: getRefreshToken(),
    name: '',
    avatar: '',
    roles: [],
@@ -13,6 +14,12 @@
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_EXPIRES_IN: (state, time) => {
      state.expires_in = time
    },
    SET_REFRESH_TOKEN: (state, token) => {
      state.refresh_token = token
    },
    SET_NAME: (state, name) => {
      state.name = name
@@ -39,6 +46,10 @@
        login(username, password, code, uuid).then(res => {
          setToken(res.access_token)
          commit('SET_TOKEN', res.access_token)
          setRefreshToken(res.refresh_token)
          commit('SET_REFRESH_TOKEN', res.refresh_token)
          setExpiresIn(res.expires_in)
          commit('SET_EXPIRES_IN', res.expires_in)
          resolve()
        }).catch(error => {
          reject(error)
@@ -67,6 +78,23 @@
      })
    },
    
    // 刷新token
    RefreshToken({commit, state}) {
      return new Promise((resolve, reject) => {
        refreshToken(state.refresh_token).then(res => {
          setToken(res.access_token)
          commit('SET_TOKEN', res.access_token)
          setRefreshToken(res.refresh_token)
          commit('SET_REFRESH_TOKEN', res.refresh_token)
          setExpiresIn(res.expires_in)
          commit('SET_EXPIRES_IN', res.expires_in)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 退出系统
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
ruoyi-ui/src/utils/auth.js
@@ -2,6 +2,10 @@
const TokenKey = 'Admin-Token'
const RefreshTokenKey = 'Admin-Refresh-Token'
const ExpiresInKey = 'Admin-Expires-In'
export function getToken() {
  return Cookies.get(TokenKey)
}
@@ -13,3 +17,27 @@
export function removeToken() {
  return Cookies.remove(TokenKey)
}
export function getRefreshToken() {
  return Cookies.get(RefreshTokenKey) || ``
}
export function setRefreshToken(token) {
  return Cookies.set(RefreshTokenKey, token)
}
export function removeRefreshToken() {
  return Cookies.remove(RefreshTokenKey)
}
export function getExpiresIn() {
  return Cookies.get(ExpiresInKey) || -1
}
export function setExpiresIn(time) {
  return Cookies.set(ExpiresInKey, time)
}
export function removeExpiresIn() {
  return Cookies.remove(ExpiresInKey)
}
ruoyi-ui/src/views/index.vue
@@ -35,6 +35,7 @@
import RaddarChart from './dashboard/RaddarChart'
import PieChart from './dashboard/PieChart'
import BarChart from './dashboard/BarChart'
import { getToken, getExpiresIn, setExpiresIn } from '@/utils/auth'
const lineChartData = {
  newVisitis: {
@@ -66,12 +67,39 @@
  },
  data() {
    return {
      //刷新token锁
      refreshLock: false,
      //刷新token的时间
      refreshTime: '',
      lineChartData: lineChartData.newVisitis
    }
  },
  created() {
    this.refreshToken()
  },
  methods: {
    handleSetLineChartData(type) {
      this.lineChartData = lineChartData[type]
    },
    // 实时检测刷新token
    refreshToken() {
      this.refreshTime = setInterval(() => {
        if (null === getToken()) {
          return;
        }
        const expires_in = getExpiresIn();
        if (expires_in <= 1000 && !this.refreshLock) {
          this.refreshLock = true
          this.$store
            .dispatch('RefreshToken')
            .catch(() => {
              clearInterval(this.refreshTime)
            });
          this.refreshLock = false
        }
        this.$store.commit("SET_EXPIRES_IN", expires_in - 10);
        setExpiresIn(expires_in - 10);
      }, 10000);
    }
  }
}