You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从JWT令牌中提取自定义Claims?附生成代码示例

解码JWT令牌并提取自定义Claims的实现方法

当然可以!既然你已经用dgrijalva/jwt-go库生成了带自定义Claims的JWT,解码起来思路很直接——核心就是和生成时使用完全一致的Claims结构体以及签名密钥。下面是具体的实现步骤和代码:

1. 确保Claims结构体完全匹配

首先要保证解码用的Claims和你生成令牌时的结构体丝毫不差(包括字段名、类型、嵌套的StandardClaims以及JSON tag),你已经定义好了这个结构体,直接复用就行:

type Claims struct {
    Username string `json:"username"`
    Id uint32
    jwt.StandardClaims
}

2. 编写解码函数

下面是完整的解码函数,它会自动验证令牌的签名、过期时间,并把解析后的Claims返回给你:

import (
    "fmt"
    "os"
    "log"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func ParseToken(tokenString string) (*Claims, error) {
    // 初始化一个用于接收解析结果的Claims指针
    claims := &Claims{}

    // 解析令牌:传入令牌字符串、Claims指针,以及签名密钥获取函数
    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
        // 验证签名算法是否和生成时一致(必须是HS256)
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        // 返回生成令牌时使用的密钥
        return []byte(os.Getenv("SECRET_CODE")), nil
    })

    if err != nil {
        return nil, err
    }

    // 验证令牌整体有效性(签名正确、未过期等)
    if !token.Valid {
        return nil, fmt.Errorf("invalid token")
    }

    return claims, nil
}

3. 调用示例

你可以像这样使用解码函数,轻松提取里面的自定义字段和标准Claims信息:

func main() {
    tokenString := "这里替换成你的JWT令牌字符串"
    claims, err := ParseToken(tokenString)
    if err != nil {
        log.Fatalf("解码失败: %v", err)
    }

    // 提取自定义字段
    fmt.Printf("用户名: %s\n", claims.Username)
    fmt.Printf("用户ID: %d\n", claims.Id)
    // 提取标准Claims字段
    fmt.Printf("过期时间: %s\n", time.Unix(claims.ExpiresAt, 0))
    fmt.Printf("签发者: %s\n", claims.Issuer)
}

关键注意事项

  • 签名密钥必须一致:解码用的SECRET_CODE要和生成令牌时的完全相同,否则会直接验证失败。
  • 算法必须匹配:一定要确保解码时验证的签名算法和生成时的SigningMethodHS256一致,不然会抛出"unexpected signing method"错误。
  • 错误要细化处理:解码过程中可能遇到令牌格式错误、签名无效、令牌过期等多种错误,建议根据业务需求做针对性处理(比如区分过期错误和签名错误)。

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:04