如何使用 Go 访问 JWT 子声明?

How to access JWT sub-claims using Go?

我需要从 Go 中的 JWT 检索子声明的值。

我有(遗留)JWT,我需要在 go 中解析,它包含一个自定义声明 "data",它包含一个 Json-对象,由一些字段(用户 ID、用户名)组成,所以

{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }

通过使用 github.com/dgrijalva/jwt-go,我可以解析令牌并使用此访问声明:

keyfunc := func(token *jwt.Token) (interface{}, error) {
    return tknkey, nil
}

tkn, err := jwt.Parse(tknStr, keyfunc)
cl, _ := tkn.Claims.(jwt.MapClaims)

这适用于标准声明,我还从 "data" 声明中的 Json-Sub-Object 获取字段名称,但不是字段值(所有空字符串) .我还尝试设置与声明层次结构匹配的结构(外部和内部结构),但没有成功。

访问子声明值的方法是什么?

您可以通过以下步骤将 jwt.MapClaims"data": map[string]string 结合使用。

  • 步骤 1.1 和 1.2 创建令牌
  • 步骤 2.1 和 2.2 解析令牌并提取子声明值。

在下面的示例中,jwtgithub.com/golang-jwt/jwt/v4. Running code for this example is at github.com/grokify/goauth/examples/jwt/main.go

步骤 1.1:创建声明

使用 data 地图创建自定义 MapClaims。添加我们将在下面提取的自定义 data.name 属性。

claims := &jwt.MapClaims{
    "iss": "issuer",
    "exp": time.Now().Add(time.Hour).Unix(),
    "data": map[string]string{
        "id":   "123",
        "name": "JohnDoe",
    },
}

步骤 1.2:创建 JWT

对于这个例子,我们将使用对称密钥。

token := jwt.NewWithClaims(
    jwt.SigningMethodHS256,
    claims)

secretKey := "foobar"

tokenString, err := token.SignedString([]byte(secretKey))

步骤 2.1:解析令牌并将声明投射到 MapClaims

再次使用 secretKey,因为此示例使用 HS256。

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    return []byte(secretKey), nil
})

claims := token.Claims.(jwt.MapClaims)

步骤 2.2:提取自定义子声明

data转换为map[string]interface{}并将data["name"]转换为string

data := claims["data"].(map[string]interface{})
name := data["name"].(string)