go语言中实现jwt认证的核心是生成和验证token,使用github.com/golang-jwt/jwt/v5库可完成该流程;首先定义包含用户信息和标准声明的claims结构,通过jwt.newwithclaims结合hmac-sha256算法生成签名token,有效期通常设为24小时;在验证时,从请求头authorization: bearer 中提取token,利用jwt.parsewithclaims解析并校验签名和过期时间;可通过中间件封装验证逻辑,保护特定路由,确保只有合法token才能访问受保护接口;实际应用中需将密钥存于环境变量、避免硬编码,设置合理过期时间并启用https传输以提升安全性,完整流程包括登录生成token、接口验证、中间件拦截和安全防护措施,适用于中小型项目身份认证需求。

在 Go 语言(Golang)中实现 JWT(JSON Web Token)认证,主要涉及两个核心流程:生成 Token 和 验证 Token。JWT 常用于用户登录后的身份认证,比如 Web API 的权限控制。
下面是一个完整的、实用的 JWT 实现流程,使用广泛使用的第三方库
github.com/golang-jwt/jwt/v5
(原
golang-jwt/jwt
)。
一、安装依赖
go get github.com/golang-jwt/jwt/v5
二、定义密钥和 Token 结构
JWT 通常使用 HMAC、RSA 等算法签名。这里以对称加密的 HMAC-SHA256 为例,使用一个密钥字符串。
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "fmt" "net/http" "time" "github.com/golang-jwt/jwt/v5")// 密钥,应保存在环境变量中var jwtKey = []byte("your-secret-key-change-in-production")// 定义用户声明(Claims)type Claims struct { UserID uint `json:"user_id"` Email string `json:"email"` jwt.RegisteredClaims}
RegisteredClaims 包含标准字段如 ExpiresAt、Issuer、Subject 等。
三、生成 JWT Token
当用户登录成功后,生成一个 Token 并返回给客户端。
func generateToken(userID uint, email string) (string, error) { expirationTime := time.Now().Add(24 * time.Hour) // 24小时有效期 claims := &Claims{ UserID: userID, Email: email, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expirationTime), IssuedAt: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()), Issuer: "your-app-name", Subject: fmt.Sprintf("user-%d", userID), }, } // 创建 token 对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 签名并生成字符串 tokenString, err := token.SignedString(jwtKey) if err != nil { return "", err } return tokenString, nil}
四、验证 JWT Token
在受保护的接口中,从请求头(通常是
Authorization: Bearer
)中提取 Token 并验证。
func validateToken(tokenString string) (*Claims, error) { claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, 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 jwtKey, nil }) if err != nil { return nil, err } if !token.Valid { return nil, fmt.Errorf("invalid token") } return claims, nil}
五、中间件封装(用于 Web 路由)
你可以写一个中间件来保护某些路由。
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, "Authorization header missing", http.StatusUnauthorized) return } // Bearer var tokenString string if len(authHeader) > 7 && authHeader[:7] == "Bearer " { tokenString = authHeader[7:] } else { http.Error(w, "Invalid authorization format", http.StatusUnauthorized) return } claims, err := validateToken(tokenString) if err != nil { http.Error(w, "Invalid or expired token", http.StatusUnauthorized) return } // 可将用户信息存入上下文,供后续处理使用 // 这里简单打印 fmt.Printf("Authenticated user: %s (ID: %d)n", claims.Email, claims.UserID) next(w, r) }}
六、完整使用示例
func loginHandler(w http.ResponseWriter, r *http.Request) { // 模拟登录验证(实际应查数据库) email := r.FormValue("email") password := r.FormValue("password") // 简单模拟验证 if email == "user@example.com" && password == "pass123" { token, err := generateToken(123, email) if err != nil { http.Error(w, "Failed to generate token", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") fmt.Fprintf(w, `{"token": "%s"}`, token) return } http.Error(w, "Invalid credentials", http.StatusUnauthorized)}func protectedHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("This is a protected route!"))}func main() { http.HandleFunc("/login", loginHandler) http.HandleFunc("/protected", authMiddleware(protectedHandler)) fmt.Println("Server starting on :8080") http.ListenAndServe(":8080", nil)}
七、测试流程
登录获取 Token:
curl -X POST http://localhost:8080/login -d "email=user@example.com" -d "password=pass123"
返回:
{"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx"}
访问受保护接口:
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx" http://localhost:8080/protected
八、安全建议
密钥不要硬编码:使用环境变量或配置中心管理
jwtKey
。设置合理过期时间:如 15 分钟到 24 小时,可配合 refresh token。HTTPS 传输:防止 Token 被窃取。避免存储敏感信息:JWT 可被解码(只是不加密),不要放密码等。考虑使用
jti
防重放攻击:为每个 Token 设置唯一 ID。刷新机制:长期登录可用 Refresh Token 机制。
总结
Golang 实现 JWT 认证的关键步骤:
定义自定义
Claims
结构使用
jwt.NewWithClaims
生成 Token使用
jwt.ParseWithClaims
验证 Token中间件提取并验证
Authorization
头合理设置过期时间与密钥管理
这套流程足够用于中小型项目。如需更高安全级别,可升级为 RSA 非对称加密或集成 OAuth2。
基本上就这些,不复杂但容易忽略细节。
以上就是Golang实现JWT认证怎么做 生成和验证Token完整流程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1397398.html
微信扫一扫
支付宝扫一扫