Refresh token on 401
This commit is contained in:
parent
933db789d0
commit
1d943d8c56
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
setDefaultHeader();
|
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();
|
||||||
|
addRefreshInterceptor();
|
Loading…
x
Reference in New Issue
Block a user