Files
rag-local/common/auth.go
T
2026-08-05 13:39:37 +08:00

64 lines
1.4 KiB
Go

package common
import (
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
)
const jwtSecret = "rag-local-jwt-secret-2026"
const TokenExpireSeconds = 24 * 3600
type JwtClaims struct {
Role string `json:"role"`
TokenFp string `json:"token_fp"`
jwt.RegisteredClaims
}
func GetJwtSecret() string {
return jwtSecret
}
func SignToken(role, tokenFp string, expireSeconds int64) (string, error) {
claims := JwtClaims{
Role: role,
TokenFp: tokenFp,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(expireSeconds) * time.Second)),
},
}
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(jwtSecret))
}
// ---------- 访问令牌(内存持有,每次启动重新生成,不落库) ----------
var accessToken string
func SetAccessToken(token string) {
accessToken = token
}
func CheckAccessToken(token string) bool {
return accessToken != "" && token == accessToken
}
func AccessTokenFingerprint() string {
return TokenFingerprint(accessToken)
}
func ParseToken(tokenStr string) (*JwtClaims, error) {
token, err := jwt.ParseWithClaims(tokenStr, &JwtClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(jwtSecret), nil
})
if err != nil {
return nil, err
}
claims, ok := token.Claims.(*JwtClaims)
if !ok || !token.Valid {
return nil, errors.New("invalid token")
}
return claims, nil
}