Golang实现JWT认证怎么做 生成和验证Token完整流程

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

Golang实现JWT认证怎么做 生成和验证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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
处理Google App Engine Go中HTTP请求超时问题
上一篇 2025年12月15日 14:47:19
现代并发编程:Actor模型、软件事务内存与自动并行化
下一篇 2025年12月15日 14:47:35

相关推荐

发表回复

登录后才能评论
关注微信