文章目录
- go get github.com/golang-jwt/jwt/v5
- 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, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, err }
- 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) 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解析结果: %+vn”, 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) }
- 1. 登录获取 Token curl -X POST “http://localhost:8080/login” -d “username=alice&password=123456” 返回: {“token”:”eyJhbGciOiJIUzI1NiIsInR5cCI…”} 2. 访问受保护接口 curl -H “Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI…” http://localhost:8080/protected 输出: 欢迎访问受保护的资源!
目录
- 一、什么是 JWT
- 二、实现思路
- 三、代码实现
- 1. 初始化依赖
- 2. 定义 JWT 工具
- 3. 构建简单登录和受保护接口
- 4. 测试流程
- 四、注意事项
- 五、总结
在 Web 开发中,身份验证是一个绕不开的话题。传统的 Session 机制依赖服务器存储用户状态,而在微服务、分布式架构下,这种方式可能会导致状态同步困难。
JWT(JSON Web Token)是一种无状态的、跨平台的身份验证解决方案,非常适合现代 Web API 场景。
本文将带你用 Go 实现一个 JWT 登录验证示例,掌握它的基本原理与使用方式。
JWT 的结构由三部分组成:
header.payload.signature
- • Header:声明类型(JWT)和加密算法(如 HMAC SHA256)。
- • Payload:存放业务数据(如用户ID、角色、过期时间)。
- • Signature:对前两部分进行签名,保证数据不可篡改。
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VyX2lkIjoxLCJleHAiOjE3MDAwMDAwMDB9
.abc123456789xyz
1. 用户登录 → 校验账号密码正确 → 生成 JWT 返回给前端。
2. 前端请求 API → 在 Authorization 头中携带 JWT。
3. 后端中间件 → 解析 JWT,验证有效性与过期时间。
4. 通过验证 → 执行后续业务逻辑。
我们使用 github.com/golang-jwt/jwt/v5 作为 JWT 库。
go get github.com/golang-jwt/jwt/v5
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, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
}
return nil, err
}
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)
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解析结果: %+vn", 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)
}
1. 登录获取 Token
curl -X POST "http://localhost:8080/login" -d "username=alice&password=123456"
返回:
{"token":"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登录验证内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Go语言中使用JWT进行身份验证的几种方式
- 一文详解如何在Golang中实现JWT认证与授权
- Go语言中Gin框架使用JWT实现登录认证的方案
- Golang实现JWT身份验证的示例详解
- 使用Golong实现JWT身份验证的详细过程
- 使用Golang轻松实现JWT身份验证的示例代码