2 Star 0 Fork 0

TeamsHub/backend-gopkg

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
jwt.go 3.51 KB
一键复制 编辑 原始数据 按行查看 历史
HCY 提交于 2024-05-10 13:07 . edit pkg
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"`
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wuzheng0709/backend-gopkg.git
git@gitee.com:wuzheng0709/backend-gopkg.git
wuzheng0709
backend-gopkg
backend-gopkg
v1.4.1

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385