使用 github.com/golang-jwt/jwt/v5 库实现JWT认证,通过定义载荷生成Token并用密钥签名;2. 解析时从Authorization头提取Token,验证签名有效性并在中间件中拦截未授权请求;3. 在Golang Web服务中结合中间件保护接口,确保安全需使用强密钥、合理过期时间及刷新机制。

在Go语言中实现JWT(JSON Web Token)认证并不复杂。借助第三方库如 github.com/golang-jwt/jwt/v5,我们可以快速完成Token的生成与验证。下面介绍如何用Golang实现一个简单的JWT认证流程。
安装JWT库
使用以下命令安装官方推荐的JWT库:
go get github.com/golang-jwt/jwt/v5生成JWT Token
生成Token时需要定义用户信息(载荷),并使用密钥进行签名。常见做法是将用户ID、用户名和过期时间放入Claims中。
示例代码:
立即学习“go语言免费学习笔记(深入)”;
func GenerateJWT(userID string) (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 72).Unix(), // 72小时后过期
})
// 使用你的密钥签名Token
secret := []byte("your-secret-key")
tokenString, err := token.SignedString(secret)
if err != nil {
return "", err
}
return tokenString, nil
}
注意:密钥应保存在配置文件或环境变量中,不要硬编码在代码里。
解析与验证JWT
从HTTP请求中提取Token,并验证其有效性。通常Token放在Authorization头中,格式为 Bearer
示例代码:
立即学习“go语言免费学习笔记(深入)”;
func ParseJWT(tokenString string) (*jwt.Token, error) {secret := []byte("your-secret-key")
return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 确保签名方法正确
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return secret, nil
})
}
调用该函数后,可通过返回的Token对象检查是否有效,并获取Claims中的数据:
token, err := ParseJWT(tokenString)if err != nil || !token.Valid {
log.Println("无效的Token")
return
}
if claims, ok := token.Claims.(jwt.MapClaims); ok {
userID := claims["user_id"].(string)
fmt.Println("用户ID:", userID)
}
中间件中使用JWT验证
在实际Web服务中,常通过中间件统一验证Token。例如使用 net/http 或 Gin 框架。
以标准库为例:
func AuthMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
if authHeader == "" {
http.Error(w, "未提供Token", http.StatusUnauthorized)
return
}
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
token, err := ParseJWT(tokenString)
if err != nil || !token.Valid {
http.Error(w, "无效的Token", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
}
}
这样就可以保护需要认证的接口:
http.HandleFunc("/protected", AuthMiddleware(func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("你已通过认证"))
}))
基本上就这些。只要掌握生成、解析和中间件集成,就能在Golang项目中轻松实现JWT认证。安全方面记得使用强密钥、设置合理过期时间,并考虑刷新机制。










