令牌验证

发布: (2025年12月15日 GMT+8 00:42)
3 min read
原文: Dev.to

Source: Dev.to

概览

验证 JWT 的过程包括:

  1. 解析 token 字符串。
  2. 解码 header 和 payload。
  3. 使用相应的 secret/key 验证签名。
  4. 用 payload 数据填充自定义的 Claims 结构体。
  5. 如果 token 有效则返回 claims,否则返回错误。

Claims 结构体

type Claims struct {
    UserID string `json:"user_id"`
    jwt.StandardClaims
}

Claims 结构体嵌入了 jwt.StandardClaims,并添加了自定义的 UserID 字段。

Secret Key

secretKey := GetJWTKey()
  • GetJWTKey() 获取用于签名和验证 JWT 的全局 secret key。
  • 在本例中使用的算法是 HS256,因此密钥是 []byte 类型。
  • 同一密钥用于所有用户。

解析 Token

token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
    return secretKey, nil
})

ParseWithClaims 的工作原理

  1. 拆分 token 为三部分:header、payload 和 signature。
  2. 解码 header 和 payload 到临时的 jwt.Token 结构体。
  3. 调用密钥函数(上面的匿名函数)获取验证密钥(secretKey)。
  4. 使用以下信息重新计算预期的签名
    • 已解码的 header 和 payload。
    • secret key。
    • token.Method 中指定的算法(例如 HS256)。
  5. 比较 重新计算的签名与 token 中的签名。
  6. 若两者匹配,则设置 token.Valid = true 并用 payload 数据填充提供的 Claims 结构体。

内部 Token 表示

type Token struct {
    Raw       string                 // The original token string
    Method    jwt.SigningMethod      // Signing algorithm (e.g., HS256)
    Header    map[string]interface{} // Header fields (e.g., "alg")
    Claims    jwt.Claims             // Claims (populated with &Claims{})
    Signature string                 // Base64‑encoded signature part
    Valid     bool                   // Result of signature & claim validation
}

使用解析后的 Claims

if claims, ok := token.Claims.(*Claims); ok && token.Valid {
    return claims, nil
}
  • 将通用的 token.Claims 进行类型断言,得到具体的 *Claims 结构体。
  • 若 token 有效,函数返回已填充的 claims;否则返回错误。

TL;DR 流程

  1. jwt.ParseWithClaims 接收 tokenString
  2. 拆分 token → header、payload、signature。
  3. 将 header + payload 解码到临时的 jwt.Token
  4. 调用密钥函数 → 返回 secretKey
  5. 使用 secretKey 和 header 中的算法重新计算签名。
  6. 将重新计算的签名与 token 的签名进行比较。
    • 匹配 → token 有效,token.Valid = true
    • 不匹配 → token 无效。
  7. 用 payload 数据填充提供的 &Claims{} 结构体。
  8. 将 claims(或错误)返回给调用方。
Back to Blog

相关文章

阅读更多 »

实验性 Hono auth npm 包

我正在构建的东西:我正在创建一个 auth package,开发者可以将其直接放入他们的应用中,而无需编写常规的登录、注册、JWT、电子邮件验证等样板代码。

创建 Figma Access Token

Forem 概览 !Forem Logo https://media2.dev.to/dynamic/image/width=65,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws...