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)
🛒 站长推荐(京东联盟)
- 《Go 程序设计语言》(Go 语言圣经,机械工业出版社) —— Go 官方团队出品,公认入门第一书
- 《Go 语言实战》(异步图书,人民邮电出版社) —— 实战导向,面试前巩固工程手感
- 《Go 语言编程之旅:一起用 Go 做项目》(博文视点,电子工业出版社) —— 项目驱动入门,从零写出完整应用
- Keychron K1Max 矮轴机械键盘(Mac/Win 双系统,QMK/VIA 开源改键) —— 轻薄矮轴 + 开源固件,程序员桌面常客
- 罗技 MX Master 3S 无线鼠标(Flow 跨屏,静音电磁滚轮) —— 人体工学设计,写代码一整天手不酸
以上链接含京东联盟推广代码;通过链接购买本站可能获得少量佣金,不影响你的购买价格。
📮 关注公众号「GO语言入门之路」
每周更新 Go + AI 应用开发实战:AI 面试官完整项目、MCP、Agent 工程化,完整源码随文章首发。
微信扫码,或搜索「GO语言入门之路」关注,第一时间获取系列更新与源码,不再错过任何一篇。