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

Go语言实战:JWT鉴权全流程开发指南(附完整代码)
一、什么是JWT?
JWT(JSON Web Token)由三部分构成(中间用.
连接):
- Header:声明加密算法(如HS256)
- Payload:携带用户身份信息(如用户ID)
- 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()
}
}
三、生产环境最佳实践
- 密钥管理:使用环境变量存储密钥,长度建议≥32位
- HTTPS强制:避免Token在传输中被截获
- 黑名单机制:实现Token主动失效功能
- 刷新令牌:通过refresh_token延长会话时间
四、常见问题排查
🔍 签名无效错误:检查服务端和客户端的密钥一致性
🔍 Token过期:客户端需重新登录获取新Token
🔍 解析失败:确认Token格式正确(Bearer + 空格 + Token)
