gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:26:42 24 4
gpt4 key购买 nike

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

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

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

通过使用 github.com/dgrijalva/jwt-go,我可以解析 token 并通过以下方式访问声明:

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

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

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

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

最佳答案

您可以将 jwt.MapClaims"data": map[string]string 一起使用,步骤如下。

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

在下面的例子中,jwtgithub.com/golang-jwt/jwt/v4 .此示例的运行代码位于 github.com/grokify/goauth/examples/jwt/main.go .

步骤 1.1:创建声明

使用 data map 创建自定义 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

在本例中,我们将使用对称 key 。

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

secretKey := "foobar"

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

步骤 2.1:解析 token 并将声明转换为 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)

关于go - 如何使用 Go 访问 JWT 子声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61281636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com