|
@@ -7,11 +7,12 @@ import (
|
|
"gin-vue-admin/model/request"
|
|
"gin-vue-admin/model/request"
|
|
"gin-vue-admin/model/response"
|
|
"gin-vue-admin/model/response"
|
|
"gin-vue-admin/service"
|
|
"gin-vue-admin/service"
|
|
|
|
+ "strconv"
|
|
|
|
+ "time"
|
|
|
|
+
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap"
|
|
- "strconv"
|
|
|
|
- "time"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
func JWTAuth() gin.HandlerFunc {
|
|
func JWTAuth() gin.HandlerFunc {
|
|
@@ -48,7 +49,7 @@ func JWTAuth() gin.HandlerFunc {
|
|
}
|
|
}
|
|
if claims.ExpiresAt-time.Now().Unix() < claims.BufferTime {
|
|
if claims.ExpiresAt-time.Now().Unix() < claims.BufferTime {
|
|
claims.ExpiresAt = time.Now().Unix() + global.GVA_CONFIG.JWT.ExpiresTime
|
|
claims.ExpiresAt = time.Now().Unix() + global.GVA_CONFIG.JWT.ExpiresTime
|
|
- newToken, _ := j.CreateToken(*claims)
|
|
|
|
|
|
+ newToken, _ := j.CreateTokenByOldToken(token, *claims)
|
|
newClaims, _ := j.ParseToken(newToken)
|
|
newClaims, _ := j.ParseToken(newToken)
|
|
c.Header("new-token", newToken)
|
|
c.Header("new-token", newToken)
|
|
c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt, 10))
|
|
c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt, 10))
|
|
@@ -91,6 +92,14 @@ func (j *JWT) CreateToken(claims request.CustomClaims) (string, error) {
|
|
return token.SignedString(j.SigningKey)
|
|
return token.SignedString(j.SigningKey)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// CreateTokenByOldToken 旧token 换新token 使用归并回源避免并发问题
|
|
|
|
+func (j *JWT) CreateTokenByOldToken(oldToken string, claims request.CustomClaims) (string, error) {
|
|
|
|
+ v, err, _ := global.GVA_Concurrency_Control.Do("JWT:"+oldToken, func() (interface{}, error) {
|
|
|
|
+ return j.CreateToken(claims)
|
|
|
|
+ })
|
|
|
|
+ return v.(string), err
|
|
|
|
+}
|
|
|
|
+
|
|
// 解析 token
|
|
// 解析 token
|
|
func (j *JWT) ParseToken(tokenString string) (*request.CustomClaims, error) {
|
|
func (j *JWT) ParseToken(tokenString string) (*request.CustomClaims, error) {
|
|
token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
|
|
token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
|