开发者

Go语言实现简单JWT登录验证的示例代码

开发者 https://www.devze.com 2025-08-14 11:36 出处:网络 作者: 程序员爱钓鱼
目录一、什么是 JWT二、实现思路三、代码实现1. 初始化依赖2. 定义 JWT 工具3. 构建简单登录和受保护接口4. 测试流程四、注意事项五、总结在 Web 开发中,身份验证是一个绕不开的话题。传统的 Session 机制依赖服务器
目录
  • 一、什么是 JWT
  • 二、实现思路
  • 三、代码实现
    • 1. 初始化依赖
    • 2. 定义 JWT 工具
    • 3. 构建简单登录和受保护接口
    • 4. 测试流程
  • 四、注意事项
    • 五、总结

      在 Web 开发中,身份验证是一个绕不开的话题。传统的 Session 机制依赖服务器存储用户状态,而在微服务、分布式架构下,这种方式可能会导致状态同步困难。

      JWT(jsON Web Token)是一种无状态的、跨平台的身份验证解决方案,非常适合现代 Web API 场景。

      本文将带你用 Go 实现一个 JWT 登录验证示例,掌握它的基本原理与使用方式。

      一、什么是 JWT

      JWT 的结构由三部分组成:

      header.payload.signature
      
      • • Header:声明类型(JWT)和加密算法(如 HMAC SHA256)。
      • • Payload:存放业务数据(如用户ID、角色、过期时间)。
      • • Signature:对前两部分进行签名,保证数据不可篡改。

      例如:

      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

      .eyJ1c2VyX2lkIjoxLCJleHAiOjE3MDAwMDAwMDB9

      .abc123456789xyz

      二、实现思路

      1. 用户登录 → 校验账号密码正确 → 生成 JWT 返回给前端。

      2. 前端请求 API → 在 Authorization&nbandroidsp;头中携带 JWT。

      3. 后端中间件 → 解析 JWT,验证有效性与过期时间。

      4. 通过验证 → 执行后续业务逻辑。

      三、代码实现

      我们使用 github.com/golang-jwt/jwt/v5 作为 JWT 库。

      1. 初始化依赖

      go get github.com/golang-jwt/jwt/v5
      

      2. 定义 JWT 工具

      package main
      
      import (
          "fmt"
          "time"
      
          "github.com/golang-jwt/jwt/v5"
      )
      
      var jwtSecret = []byte("my_secret_key")
      
      // 生成Token
      func GenerateToken(username string) (string, error) {
          claims := jwt.MapClaims{
              "username": username,
              "exp":      time.Now().Add(2 * time.Hour).Unix(),
              "iat":      time.Now().Unix(),
          }
      
          token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
          return token.SignedString(jwtSecret)
      }
      
      // 验证Token
      func ParseToken(tokenString string) (jwt.MapClaims, error) {
          token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
              return jwtSecret, nil
          })
      
          if claims, o编程客栈k := token.Claims.(jwt.MapClaims); ok && token.Valid {
              return claims, nil
          }
          return nil, err
      }
      

      3. 构建简单登录和受保护接口

      package main
      
      import (
          "encoding/json"
          "fmt"
          "net/http"
          "strings"
      )
      
      // 模拟用户数据
      var users = map[string]string{
          "alice": "123456",
          "bob":   "654321",
      }
      
      func loginHandler(w http.ResponseWriter, r *http.Request) {
          username := r.FormValue("username")
          password := r.FormValue("password")
      
          if pwd, ok := users[username]; !ok || pwd != password {
              http.Error(w, "用户名或密码错误", http.StatusUnauthorized)
              return
          }
      
          token, _ := GenerateToken(username)
          w.Header().Set("Content-Type", "application/json")
          json.NewEncoder(w).Encode(map[string]string{"token": token})
      }
      
      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头", http.StatusUnauthorized)
                  return
              }
      
              parts := strings.SplitN(authHeader, " ", 2)
         python     if len(parts) != 2 || parts[0] != "Bearer" {
      php            http.Error(w, "Authorization格式错误", http.StatusUnauthorized)
                  return
              }
      
              claims, err := ParseToken(parts[1])
              if err != nil {
                  http.Error(w, "无效Token", http.StatusUnauthorized)
                  return
              }
      
              fmt.Printf("JWT解析结果: %+v\n", claims)
              next.ServeHTTP(w, r)
          }
      }
      
      func protectedHandler(w http.ResponseWriter, r *http.Request) {
          fmt.Fprintln(w, "欢迎访问受保护的资源!")
      }
      
      func main() {
          http.HandleFunc("/login", loginHandler)
          http.HandleFunc("/protected", authMiddleware(protectedHandler))
      
          fmt.Println("服务器启动:http://localhost:8080")
          http.ListenAndServe(":8080", nil)
      }
      

      4. 测试流程

      1. 登录获取 Token

      curl -X POST "http://localhost:8080/login" -d "username=alice&password=123456"
      

      返回:

      {"token":android"eyJhbGciOiJIUzI1NiIsInR5cCI..."}
      

      2. 访问受保护接口

      curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI..." http://localhost:8080/protected
      

      输出:

      欢迎访问受保护的资源!

      四、注意事项

      1. Token 过期处理:前端需在过期后重新获取 Token。

      2. Secret 安全性:切勿将 jwtSecret 写死在代码里,可用环境变量管理。

      3. HTTPS:避免 Token 在明文传输中被窃取。

      4. 黑名单机制:如果需要即时让某个 Token 失效,可以维护一个黑名单。

      五、总结

      JWT 在 Go 中实现并不复杂,但它带来的无状态身份验证机制,非常适合 RESTful API 和分布式架构场景。

      通过本示例,你可以快速搭建一个基于 JWT 的登录验证系统,并根据业务需求进行扩展,比如刷新 Token角色权限控制等。

      到此这篇关于Go语言实现简单JWT登录验证的示例代码的文章就介绍到这了,更多相关Go JWT登录验证内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号