JWT令牌验证

JWT令牌验证
安安jwt
一.JWT简介
官方仓库:golang-jwt/jwt: Community maintained clone of https://github.com/dgrijalva/jwt-go
官方文档:jwt package - github.com/golang-jwt/jwt/v4 - Go Packages
一、JWT 是什么 & 工作原理
JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在客户端和服务端之间安全地传递 JSON 格式的信息。
结构:
JWT 分为三部分,用 . 连接:
1 | Header.Payload.Signature |
Header(头部)
- 声明类型(JWT)和算法(HS256、RS256 等)。
1
2
3
4{
"alg": "HS256",
"typ": "JWT"
}Payload(负载)
- 存放业务信息,比如用户 ID、用户名、过期时间等。
1
2
3
4
5{
"user_id": 123,
"username": "tom",
"exp": 1695200400
}Signature(签名)
- 防止篡改,用 Header + Payload + 秘钥(secret)通过算法签名。
- 校验时,服务端重新生成签名,若不同说明数据被篡改。
完整 Token 示例:
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
二、JWT 的工作流程
用户登录
- 用户提交账号密码 → 服务端验证 → 生成 JWT 返回给客户端。
客户端保存 Token
- 一般存放在浏览器
localStorage/sessionStorage/ 移动端缓存 / Cookie。
- 一般存放在浏览器
后续请求
客户端在请求头里加上:
1
Authorization: Bearer <JWT_TOKEN>
服务端校验 Token
- 解码 + 校验签名 + 校验过期时间 → 通过则放行,否则拒绝。
四、Go 操作 JWT 的讲解
安装依赖:
1 | go get github.com/golang-jwt/jwt/v5 |
1. 定义秘钥和声明
1 | package main |
1 | // 生成 JWT Token |
3. 解析 & 校验 Token
1 | // 解析 JWT Token |
五、完整 Demo 小项目(基于 Gin + JWT)
下面是一个简单的 用户登录 + 鉴权接口 小项目:
1 | package main |
测试流程:
POST /login1
{"username": "tom", "password": "123456"}
返回一个 Token。
GET /profile
请求头加:1
Authorization: Bearer <token>
返回:
1
{"user_id":1,"username":"tom","msg":"这是一个受保护的接口"}
一.JWT常用API
一、核心结构 & 概念
- Token 结构
1 | type Token struct { |
- Claims(声明)
- 标准声明(RegisteredClaims)
exp:过期时间(Expiration Time)iat:签发时间(Issued At)nbf:生效时间(Not Before)iss:签发人(Issuer)sub:主题(Subject)aud:接收方(Audience)jti:JWT ID(唯一标识)
- 自定义声明
可以扩展字段,比如UserID、Role。
1 | type MyClaims struct { |
二、常用 API
1. 创建 Token
1 | // 方式 1:使用标准声明 |
2. 签发 Token
1 | tokenString, err := token.SignedString([]byte("mySecretKey")) |
3. 解析 & 验证 Token
1 | parsedToken, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) { |
4. 解码 Header 和 Payload(无校验)
1 | // 仅解码,不验证签名 |
5. 预置的签名算法
jwt.SigningMethodHS256jwt.SigningMethodHS384jwt.SigningMethodHS512jwt.SigningMethodRS256(需要 RSA 私钥/公钥)jwt.SigningMethodES256(需要 ECDSA 密钥)
三、常见错误处理
1 | parsedToken, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) { |
四、常用 API 总结(速查表)
| 功能 | API/方法 |
|---|---|
| 创建 Token | jwt.NewWithClaims(method, claims) |
| 签发 Token | token.SignedString(secret) |
| 解析 & 校验 Token | jwt.ParseWithClaims(tokenStr, claims, keyFunc) |
| 自定义声明 | 自定义 struct + jwt.RegisteredClaims |
| 过期时间 | ExpiresAt: jwt.NewNumericDate(time.Now().Add(x)) |
| 签名算法 | jwt.SigningMethodHS256 / RS256 / ES256 |
| 错误处理 | jwt.ErrTokenExpired / jwt.ErrTokenMalformed |
[up主专用,视频内嵌代码贴在这]

