如何使用 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 解析令牌并提取子声明值。
在下面的示例中,jwt
是 github.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)
我需要从 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 解析令牌并提取子声明值。
在下面的示例中,jwt
是 github.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)