Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 25s
feat(admin): 新增工会管理功能 feat(activity): 添加活动管理相关服务 feat(user): 实现用户道具卡和积分管理 feat(guild): 新增工会成员管理功能 fix: 修复数据库连接配置 fix: 修正jwtoken导入路径 fix: 解决端口冲突问题 style: 统一代码格式和注释风格 style: 更新项目常量命名 docs: 添加项目框架和开发规范文档 docs: 更新接口文档注释 chore: 移除无用代码和文件 chore: 更新Makefile和配置文件 chore: 清理日志文件 test: 添加道具卡测试脚本
81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package jwtoken
|
|
|
|
import (
|
|
"time"
|
|
|
|
"bindbox-game/internal/proposal"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
)
|
|
|
|
var _ Token = (*token)(nil)
|
|
|
|
type Token interface {
|
|
i()
|
|
Sign(jwtInfo proposal.SessionUserInfo, expireDuration time.Duration) (tokenString string, err error)
|
|
Parse(tokenString string) (*claims, error)
|
|
Refresh(tokenString string) (refreshTokenString string, err error)
|
|
}
|
|
|
|
type token struct {
|
|
secret string
|
|
}
|
|
|
|
type claims struct {
|
|
proposal.SessionUserInfo
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
func New(secret string) Token {
|
|
return &token{
|
|
secret: secret,
|
|
}
|
|
}
|
|
|
|
func (t *token) i() {}
|
|
|
|
func (t *token) Sign(sessionUserInfo proposal.SessionUserInfo, expireDuration time.Duration) (tokenString string, err error) {
|
|
claims := claims{
|
|
sessionUserInfo,
|
|
jwt.RegisteredClaims{
|
|
NotBefore: jwt.NewNumericDate(time.Now()),
|
|
IssuedAt: jwt.NewNumericDate(time.Now()),
|
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(expireDuration)),
|
|
},
|
|
}
|
|
|
|
tokenString, err = jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(t.secret))
|
|
return
|
|
}
|
|
|
|
func (t *token) Parse(tokenString string) (*claims, error) {
|
|
tokenClaims, err := jwt.ParseWithClaims(tokenString, &claims{}, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(t.secret), nil
|
|
})
|
|
|
|
if tokenClaims != nil {
|
|
if claims, ok := tokenClaims.Claims.(*claims); ok && tokenClaims.Valid {
|
|
return claims, nil
|
|
}
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
func (t *token) Refresh(tokenString string) (refreshTokenString string, err error) {
|
|
tokenClaims, err := jwt.ParseWithClaims(tokenString, &claims{}, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(t.secret), nil
|
|
})
|
|
|
|
if tokenClaims != nil {
|
|
if claims, ok := tokenClaims.Claims.(*claims); ok && tokenClaims.Valid {
|
|
claims.IssuedAt = jwt.NewNumericDate(time.Now())
|
|
claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(time.Hour * 24))
|
|
refreshTokenString, err = jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(t.secret))
|
|
return
|
|
}
|
|
}
|
|
|
|
return refreshTokenString, err
|
|
}
|