Files
sa-token-go/examples/jwt-example/README.md
T
c 04a9e5a72f 1、init project
2、完善部分功能
2025-10-18 06:38:51 +07:00

211 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JWT Token 示例
本示例演示如何在 Sa-Token-Go 中使用 JWTJSON Web Token)。
## JWT 简介
JWT 是一种无状态的 Token 方案,Token 本身包含了用户信息和过期时间,适合分布式系统。
### JWT 优势
-**无状态**:不需要服务端存储 Session
-**分布式友好**:多个服务可以独立验证
-**信息自包含**Token 包含用户信息
-**跨域支持**:可以跨不同域使用
### JWT 结构
JWT 由三部分组成,用 `.` 分隔:
```
Header.Payload.Signature
```
- **Header**Token 类型和加密算法
- **Payload**:用户数据(loginId, device, exp等)
- **Signature**:签名(使用密钥加密)
## 运行示例
```bash
go run main.go
```
## 基本使用
### 1. 配置 JWT
```go
import (
"github.com/click33/sa-token-go/core"
"github.com/click33/sa-token-go/stputil"
"github.com/click33/sa-token-go/storage/memory"
)
func init() {
stputil.SetManager(
core.NewBuilder().
Storage(memory.NewStorage()).
TokenStyle(core.TokenStyleJWT). // 使用 JWT
JwtSecretKey("your-256-bit-secret-key-here"). // 设置密钥
Timeout(3600). // 过期时间
Build(),
)
}
```
### 2. 登录获取 JWT Token
```go
token, _ := stputil.Login(1000)
// 返回类似:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```
### 3. 验证 JWT Token
```go
// 验证 Token 是否有效
if stputil.IsLogin(token) {
fmt.Println("Token 有效")
}
// 获取登录 ID
loginID, _ := stputil.GetLoginID(token)
```
### 4. 解析 JWT
你可以使用 [jwt.io](https://jwt.io) 在线解析 JWT Token 查看内容。
**Payload 示例:**
```json
{
"loginId": "1000",
"device": "",
"iat": 1697234567,
"exp": 1697238167
}
```
## JWT 配置选项
```go
core.NewBuilder().
TokenStyle(core.TokenStyleJWT). // 启用 JWT
JwtSecretKey("your-secret-key"). // 密钥(必需)
Timeout(3600). // Token 过期时间(秒)
IsPrintBanner(true). // 显示启动 Banner
Build()
```
## 安全建议
### 1. 使用强密钥
```go
// ❌ 弱密钥
JwtSecretKey("secret")
// ✅ 强密钥(建议至少 32 字节)
JwtSecretKey("a-very-long-and-random-secret-key-at-least-256-bits")
```
### 2. 设置合理的过期时间
```go
// 短期 Token(推荐)
Timeout(3600) // 1小时
// 长期 Token(需要配合刷新机制)
Timeout(86400) // 24小时
```
### 3. 在生产环境中保护密钥
```go
// ✅ 从环境变量读取
import "os"
JwtSecretKey(os.Getenv("JWT_SECRET_KEY"))
```
## JWT vs 普通 Token
| 特性 | JWT | UUID/Random |
|------|-----|-------------|
| 状态 | 无状态 | 有状态 |
| 服务端存储 | 不需要 | 需要 |
| Token 大小 | 较大 | 较小 |
| 可撤销性 | 困难 | 容易 |
| 分布式 | 优秀 | 需要共享存储 |
| 性能 | 高(不查数据库) | 中等(需查数据库) |
## 使用场景
### 适合 JWT 的场景
- ✅ 微服务架构
- ✅ 无状态 API
- ✅ 跨域认证
- ✅ 短期访问令牌
### 不适合 JWT 的场景
- ❌ 需要立即撤销 Token
- ❌ Token 包含敏感信息
- ❌ 需要频繁更新权限
## 完整示例
```go
package main
import (
"fmt"
"github.com/click33/sa-token-go/core"
"github.com/click33/sa-token-go/stputil"
"github.com/click33/sa-token-go/storage/memory"
)
func main() {
// 初始化 JWT
stputil.SetManager(
core.NewBuilder().
Storage(memory.NewStorage()).
TokenStyle(core.TokenStyleJWT).
JwtSecretKey("your-256-bit-secret").
Timeout(3600).
Build(),
)
// 登录
token, _ := stputil.Login(1000)
fmt.Println("Token:", token)
// 验证
if stputil.IsLogin(token) {
loginID, _ := stputil.GetLoginID(token)
fmt.Println("登录ID:", loginID)
}
// 权限管理
stputil.SetPermissions(1000, []string{"admin:*"})
if stputil.HasPermission(1000, "admin:read") {
fmt.Println("有权限")
}
}
```
## 相关文档
- [Authentication Guide](../../docs/guide/authentication.md)
- [Token Configuration](../../docs/guide/configuration.md)
- [Quick Start](../../docs/tutorial/quick-start.md)
## 在线工具
- [JWT.io](https://jwt.io) - JWT 调试工具
- [JWT Inspector](https://jwt-inspector.netlify.app/) - JWT 检查器