Преглед на файлове

update jwt 自动刷新token策略

master
dengbiao преди 2 месеца
родител
ревизия
08de635755
променени са 5 файла, в които са добавени 26 реда и са изтрити 15 реда
  1. +13
    -5
      app/lib/auth/auth.go
  2. +1
    -1
      app/lib/auth/base.go
  3. +1
    -1
      app/md/app_redis_key.go
  4. +4
    -1
      app/mw/mw_auth.go
  5. +7
    -7
      app/svc/svc_auth.go

+ 13
- 5
app/lib/auth/auth.go Целия файл

@@ -24,16 +24,24 @@ func GenToken(admId int, username string) (string, error) {
}

// ParseToken 解析JWT
func ParseToken(tokenString string) (*JWTUser, error) {
func ParseToken(tokenString string) (*JWTUser, string, error) {
// 解析token
token, err := jwt.ParseWithClaims(tokenString, &JWTUser{}, func(token *jwt.Token) (i interface{}, err error) {
return Secret, nil
})
if err != nil {
return nil, err
return nil, "", err
}
if claims, ok := token.Claims.(*JWTUser); ok && token.Valid { // 校验token
return claims, nil
if claims, ok := token.Claims.(*JWTUser); ok && token.Valid { // 校验token正确性
if claims.StandardClaims.ExpiresAt < time.Now().Unix() { // 校验token时效性
return nil, "", errors.New("token is expired")
}

if !claims.VerifyExpiresAt(time.Now().Add(time.Minute*30).Unix(), false) { // TODO::判断Token快过期,就创建新的token(30分钟)
newToken, _ := GenToken(claims.AdmId, claims.Username)
return claims, newToken, nil
}
return claims, "", err
}
return nil, errors.New("invalid token")
return nil, "", errors.New("invalid token")
}

+ 1
- 1
app/lib/auth/base.go Целия файл

@@ -7,7 +7,7 @@ import (
)

// TokenExpireDuration is jwt 过期时间
const TokenExpireDuration = time.Hour * 24
const TokenExpireDuration = time.Hour * 2

var Secret = []byte("micro_group_admin")



+ 1
- 1
app/md/app_redis_key.go Целия файл

@@ -4,7 +4,7 @@ package md
const (
JwtTokenKey = "%s:super_advertisement_jwt_token:%s" // jwt, 占位符:ip, admin:id

JwtTokenCacheTime = 3600 * 24
JwtTokenCacheTime = 3600 * 2

AppCfgCacheKey = "%s:cfg_cache:%s" // 占位符: masterId, key的第一个字母



+ 4
- 1
app/mw/mw_auth.go Целия файл

@@ -8,7 +8,7 @@ import (

// 检查权限, 签名等等
func Auth(c *gin.Context) {
admin, err := svc.CheckUser(c)
admin, newToken, err := svc.CheckUser(c)
if err != nil {
switch err.(type) {
case e.E:
@@ -22,5 +22,8 @@ func Auth(c *gin.Context) {
}
// 将当前请求的username信息保存到请求的上下文c上
c.Set("admin", admin)
if len(newToken) > 0 {
c.Header("new-token", newToken) // TODO::将新Token添加到返回的Header里,方便前端使用
}
c.Next()
}

+ 7
- 7
app/svc/svc_auth.go Целия файл

@@ -27,27 +27,27 @@ func GetUser(c *gin.Context) *model.Admin {
return user.(*model.Admin)
}

func CheckUser(c *gin.Context) (*model.Admin, error) {
func CheckUser(c *gin.Context) (*model.Admin, string, error) {
token := c.GetHeader("Authorization")
if token == "" {
return nil, errors.New("token not exist")
return nil, "", errors.New("token not exist")
}
// 按空格分割
parts := strings.SplitN(token, " ", 2)
if !(len(parts) == 2 && parts[0] == "Bearer") {
return nil, errors.New("token format error")
return nil, "", errors.New("token format error")
}
// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
mc, err := auth.ParseToken(parts[1])
mc, newToken, err := auth.ParseToken(parts[1])
if err != nil {
return nil, err
return nil, "", err
}

// 获取admin
adminDb := implement.NewAdminDb(db.Db)
admin, err := adminDb.GetAdmin(mc.AdmId)
if err != nil {
return nil, err
return nil, "", err
}
return admin, nil
return admin, newToken, nil
}

Зареждане…
Отказ
Запис