当前位置: 首页 > news >正文

Go语言实战案例:使用模板渲染HTML页面

在 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. 1. 用户登录 → 校验账号密码正确 → 生成 JWT 返回给前端。
  2. 2. 前端请求 API → 在 Authorization 头中携带 JWT。
  3. 3. 后端中间件 → 解析 JWT,验证有效性与过期时间。
  4. 4. 通过验证 → 执行后续业务逻辑。

三、代码实现

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

1. 初始化依赖

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

2. 定义 JWT 工具

package mainimport ("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, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims, nil}return nil, err
}

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

package mainimport ("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)if len(parts) != 2 || parts[0] != "Bearer" {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. 1. 登录获取 Token
curl -X POST "http://localhost:8080/login" -d "username=alice&password=123456"

返回:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI..."}
  1. 2. 访问受保护接口
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI..." http://localhost:8080/protected

输出:

欢迎访问受保护的资源!

四、注意事项

  1. 1. Token 过期处理:前端需在过期后重新获取 Token。
  2. 2. Secret 安全性:切勿将 jwtSecret 写死在代码里,可用环境变量管理。
  3. 3. HTTPS:避免 Token 在明文传输中被窃取。
  4. 4. 黑名单机制:如果需要即时让某个 Token 失效,可以维护一个黑名单。

五、总结

JWT 在 Go 中实现并不复杂,但它带来的无状态身份验证机制,非常适合 RESTful API 和分布式架构场景。
通过本示例,你可以快速搭建一个基于 JWT 的登录验证系统,并根据业务需求进行扩展,比如刷新 Token角色权限控制等。


http://www.lryc.cn/news/618195.html

相关文章:

  • Go之封装Http请求和日志
  • mysql登录失败 ERROR1698
  • Elasticsearch Node.js 客户端连接指南(Connecting)
  • 实现一个二维码让 iOS 和 Android 用户自动跳转到对应下载链接
  • java面试题储备4: 谈谈对es的理解
  • 基于跨平台的svg组件编写一个svg编辑器
  • 【狂热算法篇】探寻图论幽径之SPFA算法:图论迷宫里的闪电寻径者(通俗易懂版)
  • 【门诊进销存出入库管理系统】佳易王医疗器械零售进销存软件:门诊进销存怎么操作?系统实操教程 #医药系统进销存
  • 需求分发机制如何设定
  • 飞算 JavaAI 电商零售场景实践:从订单峰值到供应链协同的全链路技术革新
  • 元器件--自恢复保险丝
  • 疏老师-python训练营-Day43复习日
  • 基于大数据的在线教育评估系统 Python+Django+Vue.js
  • 【代码随想录day 18】 力扣 501.二叉搜索树中的众数
  • 我的 LeetCode 日记:Day 35 - 解构动态规划,初探 0/1 背包问题
  • 如何检查pip版本
  • Spring Boot项目中调用第三方接口
  • 【Unity】GraphicRaycaster点击失效问题
  • 邦纳BANNER相机视觉加镜头PresencePLUSP4 RICOH FL-CC2514-2M工业相机
  • 一周学会Matplotlib3 Python 数据可视化-绘制饼状图(Pie)
  • 【Activiti】要点初探
  • SQL tutorials
  • 当 GitHub 宕机时,我们如何协作?
  • 【C#】正则表达式
  • 计算机视觉(4)-相机基础知识恶补
  • 计算机网络2-3:传输方式
  • 集合,完整扩展
  • AWS EKS 常用命令大全:从基础管理到高级运维
  • 面试八股之从Java到JVM层面深入解析ReentrantLock实现原理
  • c++的四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)详解和代码示例