Go语言实战:JWT鉴权全流程开发指南(附完整代码)


Go语言实战:JWT鉴权全流程开发指南(附完整代码)

一、什么是JWT?

JWT(JSON Web Token)由三部分构成(中间用.连接):

  1. Header:声明加密算法(如HS256)
  2. Payload:携带用户身份信息(如用户ID)
  3. Signature:防止数据篡改的数字签名

二、Go实现JWT鉴权

1️⃣ 安装依赖库

go get github.com/golang-jwt/jwt/v5

2️⃣ 定义Claims结构体

type CustomClaims struct {
	UserID   int    `json:"user_id"`
	jwt.RegisteredClaims
}

3️⃣ 生成Token(带2小时过期)

func GenerateToken(userID uint, secret string) (string, error) {
    claims := CustomClaims{
		UserID:   userID,
		Username: username,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(a.jwt.Expire)), // 过期时间
			IssuedAt:  jwt.NewNumericDate(time.Now()),                   // 签发时间
			Issuer:    "study_gin",                                      // 签发者
		},
	}
    
    // 创建Token对象
	token := jwt.NewWithClaims(signingMethod, claims)

	// 生成签名字符串
	tokenString, err := token.SignedString([]byte(secret))
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

4️⃣ 解析Token(带错误处理)

func ParseToken(tokenString, secret string) (*CustomClaims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte(secret), nil
    })

    if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
        return claims, nil
    }
    return nil, err
}

5️⃣ Gin中间件示例

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.GetHeader("Authorization")
        if tokenString == "" {
            c.AbortWithStatusJSON(401, gin.H{"error": "未提供认证凭证"})
            return
        }

        claims, err := ParseToken(strings.Replace(tokenString, "Bearer ", "", 1), SecretKey)
        if err != nil {
            c.AbortWithStatusJSON(401, gin.H{"error": "无效token"})
            return
        }

        c.Set("userID", claims.UserID)
        c.Next()
    }
}

三、生产环境最佳实践

  1. 密钥管理:使用环境变量存储密钥,长度建议≥32位
  2. HTTPS强制:避免Token在传输中被截获
  3. 黑名单机制:实现Token主动失效功能
  4. 刷新令牌:通过refresh_token延长会话时间

四、常见问题排查

🔍 签名无效错误:检查服务端和客户端的密钥一致性
🔍 Token过期:客户端需重新登录获取新Token
🔍 解析失败:确认Token格式正确(Bearer + 空格 + Token)

wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo