From 43bc0ca39be664ffaeea6256a9f2160f5a8f7e40 Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: Sat, 01 Aug 2020 18:28:30 +0800
Subject: [PATCH] OAuth自动刷新续签Token
---
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java | 11 +++++
ruoyi-ui/src/store/modules/user.js | 32 +++++++++++++++-
ruoyi-ui/src/api/login.js | 12 +++++
ruoyi-ui/src/views/index.vue | 28 ++++++++++++++
ruoyi-ui/src/utils/auth.js | 28 ++++++++++++++
5 files changed, 108 insertions(+), 3 deletions(-)
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
index e2cbd0b..6172c8d 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
@@ -31,6 +31,10 @@
private static final String CODE = "code";
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)
@@ -43,6 +47,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);
diff --git a/ruoyi-ui/src/api/login.js b/ruoyi-ui/src/api/login.js
index 9aa93ca..f72fe46 100644
--- a/ruoyi-ui/src/api/login.js
+++ b/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({
diff --git a/ruoyi-ui/src/store/modules/user.js b/ruoyi-ui/src/store/modules/user.js
index 5c8a33f..c097710 100644
--- a/ruoyi-ui/src/store/modules/user.js
+++ b/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) => {
diff --git a/ruoyi-ui/src/utils/auth.js b/ruoyi-ui/src/utils/auth.js
index 88d7b6c..59b55cd 100644
--- a/ruoyi-ui/src/utils/auth.js
+++ b/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)
+}
diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue
index 4828d88..2fda0b8 100644
--- a/ruoyi-ui/src/views/index.vue
+++ b/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);
}
}
}
--
Gitblit v1.9.3