引言:为什么在 Go 中需要 OAuth 2.0 和 JWT?
现代 Web 开发离不开安全的身份验证和授权。如果您正在用 Go (Golang) 编写您的第一个 API、微服务或 Web 应用,迟早您会面临保护用户数据的需求。两个标准——OAuth 2.0 和 JWT(JSON Web Token)——已成为该领域的黄金标准。
在本文中,我们将解析 OAuth 2.0 和 JWT 的工作原理,并用 Go 编写一个简单但可运行的实现。您将学习如何颁发访问令牌、验证它们以及保护您的端点。本文面向熟悉 Go 和 HTTP 基础的初学者开发者。
什么是 OAuth 2.0 和 JWT?简单解释
OAuth 2.0 — 委托访问协议
OAuth 2.0 不是一个库或函数,而是一个协议。想象一下,您想通过 Google 登录一个网站。OAuth 2.0 允许该网站从 Google 获取对您数据的有限访问权限(例如电子邮件),而无需您向其提供您的 Google 密码。这称为“委托访问”。
OAuth 2.0 中的主要角色:
- 资源所有者 — 用户(您)。
- 客户端 — 想要获得访问权限的应用(我们的网站)。
- 授权服务器 — 颁发令牌的服务器(Google)。
- 资源服务器 — 存储用户数据的服务器(Google API)。
JWT — 令牌格式
JWT(JSON Web Token) 是一种紧凑且自包含的方式,以 JSON 对象的形式在各方之间传输信息。它由三部分组成,用点分隔:
- 头部 — 令牌类型和签名算法(例如 HS256)。
- 载荷 — 数据(声明):用户 ID、角色、过期时间。
- 签名 — 保证令牌未被篡改的签名。
JWT 通常用作 OAuth 2.0 中的 访问令牌。服务器使用密钥对令牌进行签名,客户端将其发送在 Authorization: Bearer <token> 头部中。
实践:在 Go 中实现 JWT 授权
我们将用 Go 编写一个小型 HTTP 服务器,用于颁发 JWT 令牌并在受保护的路由上验证它们。我们将使用流行的库 github.com/golang-jwt/jwt/v5 来处理 JWT。
步骤 1:安装依赖项和项目结构
创建一个新模块并安装库:
go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/crypto文件结构将很简单:
main.go— 入口点和路由。auth.go— 创建和验证 JWT 的逻辑。handlers.go— HTTP 处理器。
步骤 2:创建 JWT 令牌
创建文件 auth.go。在这里,我们将定义密钥(在实际项目中,请将其存储在 .env 文件中)以及生成令牌的函数。
package main
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key-here")
type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}
func GenerateToken(userID int, username string) (string, error) { claims := Claims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "auth-example", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}\