2026-07-09 23:28:43
在Go语言中,使用jwt-go库(推荐活跃维护的github.com/golang-jwt/jwt)实现JWT身份验证的核心步骤如下:
1. 安装依赖库推荐使用活跃维护的分叉版本:
go get github.com/golang-jwt/jwt
关键步骤:
说明:
验证逻辑:
错误处理:
中间件实现:
func AuthMiddleware(secretKey string) gin.HandlerFunc { return func(c *gin.Context) { tokenStr := c.GetHeader("Authorization") if len(tokenStr) <= 7 || tokenStr[:7] != "Bearer " { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token format"}) return } userID, err := ParseToken(tokenStr[7:], secretKey) if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"}) return } c.Set("user_id", userID) c.Next() }}路由保护:
r := gin.Default()r.GET("/protected", AuthMiddleware(secretKey), func(c *gin.Context) { userID, _ := c.Get("user_id") c.JSON(http.StatusOK, gin.H{"message": "access granted", "user": userID})})5. 安全增强方案
关键安全措施:
密钥管理:
secretKey := os.Getenv("JWT_SECRET") // 从环境变量读取Token刷新机制:
短期Access Token(15分钟) + 长期Refresh Token(7天)
实现/refresh端点验证Refresh Token并颁发新Access Token
黑名单机制:
var blacklist = make(map[string]time.Time)func Logout(tokenStr string) { claims := &CustomClaims{} jwt.ParseWithClaims(tokenStr, claims, nil) blacklist[tokenStr] = time.Now().Add(24 * time.Hour) // 加入黑名单}自定义Claims结构:
type SecureClaims struct { UserID string `json:"user_id"` Roles []string `json:"roles"` DeviceID string `json:"device_id"` jwt.RegisteredClaims}用户登录:
func LoginHandler(c *gin.Context) { userID := "123" // 从数据库获取 token, _ := GenerateToken(userID, os.Getenv("JWT_SECRET")) c.JSON(http.StatusOK, gin.H{"token": token})}访问受保护接口:
curl -H "Authorization: Bearer <token>"注销处理:
func LogoutHandler(c *gin.Context) { tokenStr := c.GetHeader("Authorization")[7:] blacklist[tokenStr] = time.Now().Add(24 * time.Hour) c.Status(http.StatusOK)}通过以上实现,可以构建一个安全、高效的JWT身份验证系统,适用于分布式系统和前后端分离架构。实际开发中需根据业务需求调整过期时间、刷新策略等参数。