Skip to content

Commit 59c9057

Browse files
committed
feat(auth): 自动生成JWT密钥,减少用户设置成本。单实例每次重启后端会需要用户重新登录
1 parent 97c08d2 commit 59c9057

1 file changed

Lines changed: 18 additions & 2 deletions

File tree

internal/auth/jwt.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package auth
22

33
import (
4+
"crypto/rand"
5+
"encoding/base64"
46
"errors"
7+
"log"
58
"os"
69
"time"
710

@@ -27,12 +30,25 @@ type JWTClaims struct {
2730
func getJWTSecret() string {
2831
secret := os.Getenv("JWT_SECRET")
2932
if secret == "" {
30-
// 默认密钥(生产环境应该设置环境变量)
31-
return "nodepass-default-jwt-secret-please-change-in-production"
33+
// 每次启动时自动生成随机密钥(注意:重启应用会导致所有 token 失效)
34+
randomSecret := generateRandomSecret(32)
35+
log.Println("JWT_SECRET not set, using randomly generated secret (tokens will expire on restart)")
36+
return randomSecret
3237
}
3338
return secret
3439
}
3540

41+
// generateRandomSecret 生成指定长度的随机密钥
42+
func generateRandomSecret(length int) string {
43+
bytes := make([]byte, length)
44+
if _, err := rand.Read(bytes); err != nil {
45+
// 如果随机生成失败,使用 UUID 作为后备方案
46+
log.Printf("Failed to generate random secret: %v, using UUID fallback", err)
47+
return uuid.New().String() + uuid.New().String()
48+
}
49+
return base64.URLEncoding.EncodeToString(bytes)
50+
}
51+
3652
// GenerateToken 生成 JWT token,返回 token 字符串、过期时间和 JTI
3753
func (s *Service) GenerateToken(username string) (tokenString string, expiresAt time.Time, jti string, err error) {
3854
expirationTime := time.Now().Add(jwtExpiration)

0 commit comments

Comments
 (0)