代码拉取完成,页面将自动刷新
package jwt
import (
"errors"
"gitee.com/wuzheng0709/backend-gopkg/infrastructure/connector/redis"
"gitee.com/wuzheng0709/backend-gopkg/infrastructure/pkg/gin/log"
"time"
"gitee.com/wuzheng0709/backend-gopkg/infrastructure/config"
"github.com/dgrijalva/jwt-go"
)
// 一些常量
var (
TokenExpired = errors.New("Token 已过期")
TokenNotValidYet = errors.New("Token 未激活")
TokenMalformed = errors.New("这不是 Token")
TokenInvalid = errors.New("无法解析的 Token")
SignKey = []byte(config.C.Jwt.SignKey)
)
// 载荷,可以加一些自己需要的信息
type customClaims struct {
UID string `json:"uid"`
jwt.StandardClaims
}
type TokenField struct {
AppId string `json:"app_id"`
UserId string `json:"user_id"`
Platform string `json:"platform"`
DeviceId string `json:"device_id"`
DeviceName string `json:"device_name"`
}
// CreateToken 生成一个token
func CreateToken(uid string) (string, error) {
claims := &customClaims{}
claims.UID = uid
claims.ExpiresAt = time.Now().Add(config.C.Jwt.TimeOut * time.Hour).Unix()
log.Debug("token内容:", claims)
token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(SignKey)
return token, err
}
// CreateToken 生成一个token
func CreateLongToken(uid string) (*customClaims, string, error) {
claims := &customClaims{}
claims.UID = uid
claims.ExpiresAt = time.Now().Add(30 * config.C.Jwt.TimeOut * time.Hour).Unix()
log.Debug("token内容:", claims)
token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(SignKey)
return claims, token, err
}
// 解析Token
func ParseToken(tokenString string) (*customClaims, error) {
token, err := jwt.ParseWithClaims(tokenString, &customClaims{}, func(token *jwt.Token) (interface{}, error) {
return SignKey, nil
})
if err != nil {
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return nil, TokenMalformed
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
// Token is expired
return nil, TokenExpired
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
return nil, TokenNotValidYet
} else {
return nil, TokenInvalid
}
}
}
if claims, ok := token.Claims.(*customClaims); ok && token.Valid {
return claims, nil
}
return nil, TokenInvalid
}
// 解析Token
func ParseTokenFromRedis(tokenString string) (*TokenField, error) {
var res TokenField
result, err := redis.HashGetAll(redis.ImRedisDB, "access_token_"+tokenString)
res.UserId = result["user_id"]
res.DeviceId = result["device_id"]
res.AppId = result["app_id"]
res.DeviceName = result["device_name"]
res.Platform = result["platform"]
return &res, err
}
// 更新token
func RefreshToken(tokenString string, appid int) (string, error) {
jwt.TimeFunc = func() time.Time {
return time.Unix(0, 0)
}
token, err := jwt.ParseWithClaims(tokenString, &customClaims{}, func(token *jwt.Token) (interface{}, error) {
return SignKey, nil
})
if err != nil {
return "", err
}
if claims, ok := token.Claims.(*customClaims); ok && token.Valid {
jwt.TimeFunc = time.Now
claims.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
return CreateToken(claims.UID)
}
return "", TokenInvalid
}
// OBS 企业服务总线token认证接口返回数据结构
type OBSAuthToken struct {
Code int `json:"code"`
Data OBSAuthTokenData `json:"data"`
Message string `json:"message"`
}
type OBSAuthTokenData struct {
ExpiresIn int `json:"expires_in"`
Token string `json:"token"`
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。