2

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

我有(旧版)JWT 我需要在 go 中解析,其中包含一个自定义声明“数据”,其中包含一个由一些字段(用户 ID、用户名)组成的 Json-Object,所以

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

使用 using 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)

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

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

4

1 回答 1

5

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

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

在下面的示例中,jwtgithub.com/dgrijalva/jwt-go。此示例的运行代码位于github.com/grokify/oauth2more/examples/jwt/main.go

步骤 1.1:创建声明

MapClaims使用地图创建自定义data。添加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:提取自定义子声明

投射datamap[string]interface{}并投射data["name"]string

data := claims["data"].(map[string]interface{})
name := data["name"].(string)
于 2020-04-18T04:37:18.373 回答