OAuth 2.0 和 JWT 授权在 Go 语言中:初学者完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么在 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)}
\

博客

书籍推荐