我需要从 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 并提取子声明值。
在下面的例子中,jwt
是 github.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/