

JWT(JSON Web Token) 是一种无状态的身份验证机制,因其轻量、安全、跨域友好等特性,广泛应用于现代 Web 应用中。
什么是 JWT?
JWT(JSON Web Token)是一种开放标准,用于在网络应用环境安全地传递声明。它将用户信息(如用户ID、角色、权限等)编码为一个 JSON 对象,并使用数字签名确保其完整性和真实性。
JWT 的最大特点是:
JWT 的结构
JWT 由三部分组成:
这三部分通过点号(`.`)连接,最终形成一个字符串,例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh93h9FqAHeader(头部)
Header 通常包含令牌的类型和所使用的签名算法。
json
{
"alg": "HS256",
"typ": "JWT"
}Payload(负载)
Payload 是 JWT 的有效负载,包含声明(claims)。声明分为三类:
示例:
json
{
"sub": "1234567890",
"name": "xxx",
"admin": true,
"iat": 1516239022,
"exp": 1516242622
}Signature(签名)
签名部分是对头部和负载的签名,使用头部中声明的算法和密钥生成。其目的是确保数据未被篡改。
公式如下:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret_key
)JWT 的工作流程
Go 语言中使用 JWT 的实战示例
下面以 Go 语言为例,展示如何生成和解析 JWT。
go get -u github.com/golang-jwt/jwt/v5package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
)
// jwtKey 是用于签名和验证JWT令牌的秘密密钥
var jwtKey = []byte("your-secret-key")
// Claims 定义了自定义声明,包括用户名和标准JWT声明
type Claims struct {
Username string `json:"username"`
jwt.RegisteredClaims
}
// generateToken 函数生成一个新的JWT令牌
func generateToken(username string) (string, error) {
// 设置令牌过期时间为当前时间加上5分钟
expirationTime := time.Now().Add(5 * time.Minute)
// 创建包含用户名和标准JWT声明的声明对象
claims := &Claims{
Username: username,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expirationTime), // 过期时间
IssuedAt: jwt.NewNumericDate(time.Now()), // 签发时间
Issuer: "test", // 签发者
},
}
// 使用HS256算法创建新的JWT令牌,并返回签名后的字符串形式
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(jwtKey)
}// parseToken 函数解析JWT令牌并返回其中的声明
func parseToken(tokenStr string) (*Claims, error) {
claims := &Claims{}
// 解析JWT令牌,使用提供的claims对象存储声明,并使用jwtKey进行验证
token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if err != nil {
return nil, err // 返回解析过程中发生的错误
}
if !token.Valid {
return nil, fmt.Errorf("invalid token") // 如果令牌无效,返回错误
}
return claims, nil // 返回有效的声明
}以上就是本文全部内容,感谢观看。
本文分享自 FreeSWITCH中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!