You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.3 KiB
59 lines
1.3 KiB
package jwt
|
|
|
|
import (
|
|
"crypto/rsa"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/dgrijalva/jwt-go"
|
|
)
|
|
|
|
// TokenService 是用于 JWT 操作的服务
|
|
type TokenService struct {
|
|
publicKey *rsa.PublicKey
|
|
}
|
|
|
|
// NewTokenService 创建一个新的 TokenService 实例
|
|
func NewTokenService(publicKeyString string) (*TokenService, error) {
|
|
publicKey, err := jwt.ParseRSAPublicKeyFromPEM([]byte(publicKeyString))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("解析公钥失败: %v", err)
|
|
}
|
|
|
|
return &TokenService{
|
|
publicKey: publicKey,
|
|
}, nil
|
|
}
|
|
|
|
// TokenData 用于存储解析的 token 数据
|
|
type TokenData struct {
|
|
Expired float64
|
|
Frequency float64
|
|
}
|
|
|
|
// VerifyToken 解析并验证 JWT,返回 TokenData 或错误
|
|
func (j *TokenService) VerifyToken(tokenString string) (*TokenData, error) {
|
|
// 解析并验证 JWT
|
|
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
|
return j.publicKey, nil
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("令牌解析失败: %v", err)
|
|
}
|
|
|
|
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
|
|
expired, okExp := claims["expired"].(float64)
|
|
frequency, okFreq := claims["frequency"].(float64)
|
|
|
|
if !okExp || !okFreq {
|
|
return nil, errors.New("无效的令牌负载")
|
|
}
|
|
|
|
return &TokenData{
|
|
Expired: expired,
|
|
Frequency: frequency,
|
|
}, nil
|
|
} else {
|
|
return nil, errors.New("无效令牌")
|
|
}
|
|
}
|
|
|