Refresh token on 401

This commit is contained in:
rxdn 2021-02-27 20:48:21 +00:00
parent 933db789d0
commit 1d943d8c56
3 changed files with 31 additions and 23 deletions

View File

@ -3,6 +3,7 @@ package middleware
import ( import (
"fmt" "fmt"
"github.com/TicketsBot/GoPanel/config" "github.com/TicketsBot/GoPanel/config"
"github.com/TicketsBot/GoPanel/utils"
"github.com/dgrijalva/jwt-go" "github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"strconv" "strconv"
@ -20,38 +21,26 @@ func AuthenticateToken(ctx *gin.Context) {
}) })
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(403, gin.H{ ctx.AbortWithStatusJSON(401, utils.ErrorJson(err))
"success": false,
"error": err.Error(),
})
return return
} }
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
userId, hasUserId := claims["userid"] userId, hasUserId := claims["userid"]
if !hasUserId { if !hasUserId {
ctx.AbortWithStatusJSON(403, gin.H{ ctx.AbortWithStatusJSON(401, utils.ErrorStr("Token is invalid"))
"success": false,
"error": "Token is invalid",
})
return return
} }
parsedId, err := strconv.ParseUint(userId.(string), 10, 64) parsedId, err := strconv.ParseUint(userId.(string), 10, 64)
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(403, gin.H{ ctx.AbortWithStatusJSON(401, utils.ErrorStr("Token is invalid"))
"success": false,
"error": "Token is invalid",
})
return return
} }
ctx.Keys["userid"] = parsedId ctx.Keys["userid"] = parsedId
} else { } else {
ctx.AbortWithStatusJSON(403, gin.H{ ctx.AbortWithStatusJSON(401, utils.ErrorStr("Token is invalid"))
"success": false,
"error": "Token is invalid",
})
return return
} }
} }

View File

@ -60,7 +60,7 @@ func StartServer() {
authorized := router.Group("/", middleware.AuthenticateCookie) authorized := router.Group("/", middleware.AuthenticateCookie)
{ {
authorized.POST("/token", middleware.VerifyXTicketsHeader, api.TokenHandler) authorized.POST("/token", createLimiter(2, 10 * time.Second), middleware.VerifyXTicketsHeader, api.TokenHandler)
authenticateGuildAdmin := authorized.Group("/", middleware.AuthenticateGuild(false, permission.Admin)) authenticateGuildAdmin := authorized.Group("/", middleware.AuthenticateGuild(false, permission.Admin))
authenticateGuildSupport := authorized.Group("/", middleware.AuthenticateGuild(false, permission.Support)) authenticateGuildSupport := authorized.Group("/", middleware.AuthenticateGuild(false, permission.Support))

View File

@ -1,5 +1,7 @@
const _tokenKey = 'token';
async function getToken() { async function getToken() {
let token = window.localStorage.getItem('token'); let token = window.localStorage.getItem(_tokenKey);
if (token == null) { if (token == null) {
let res = await axios.post('/token', undefined, { let res = await axios.post('/token', undefined, {
withCredentials: true, withCredentials: true,
@ -15,7 +17,7 @@ async function getToken() {
} }
token = res.data.token; token = res.data.token;
localStorage.setItem('token', token); localStorage.setItem(_tokenKey, token);
} }
return token; return token;
@ -26,10 +28,27 @@ function clearLocalStorage() {
} }
async function setDefaultHeader() { async function setDefaultHeader() {
const token = await getToken(); axios.defaults.headers.common['Authorization'] = await getToken();
axios.defaults.headers.common['Authorization'] = token; axios.defaults.headers.common['x-tickets'] = 'true'; // arbitrary header name and value
axios.defaults.headers.common['x-tickets'] = 'true'; // abritrary header name and value
axios.defaults.validateStatus = false; axios.defaults.validateStatus = false;
} }
async function _refreshToken() {
window.localStorage.removeItem(_tokenKey);
await getToken();
}
function addRefreshInterceptor() {
axios.interceptors.response.use(async (res) => { // we set validateStatus to false
if (res.status === 401) {
await _refreshToken();
}
}, async (err) => {
if (err.response.status === 401) {
await _refreshToken();
}
});
}
setDefaultHeader(); setDefaultHeader();
addRefreshInterceptor();