我需要从 Go 中的 JWT 检索子声明的值。
我有(旧的)JWT,我需要在 go 中解析,其中包含一个自定义声明“数据”,其中包含一个由一些字段(用户 ID、用户名)组成的 Json 对象,所以
{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)
通过 using github.com/dgrijalva/jwt-go,我可以解析令牌并通过以下方式访问声明:
{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)
这对于标准声明来说效果很好,而且我还从“数据”声明中的 Json-Sub-Object 获取字段名称,但不是字段值(所有空字符串)。我还尝试设置与声明层次结构匹配的结构(外部和内部结构),但没有成功。
访问子声明值的方法是什么?
您可以按照以下步骤使用jwt.MapClaimswith 。"data": map[string]string
在下面的示例中,jwt是github.com/golang-jwt/jwt/v4. 此示例的运行代码位于github.com/grokify/goauth/examples/jwt/main.go。
MapClaims使用地图创建自定义data。添加data.name我们将在下面提取的自定义属性。
claims := &jwt.MapClaims{
"iss": "issuer",
"exp": time.Now().Add(time.Hour).Unix(),
"data": map[string]string{
"id": "123",
"name": "JohnDoe",
},
}
Run Code Online (Sandbox Code Playgroud)
对于本示例,我们将使用对称密钥。
token := jwt.NewWithClaims(
jwt.SigningMethodHS256,
claims)
secretKey := "foobar"
tokenString, err := token.SignedString([]byte(secretKey))
Run Code Online (Sandbox Code Playgroud)
MapClaims.由于本示例使用 HS256,因此请再次使用secretKey。
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
})
claims := token.Claims.(jwt.MapClaims)
Run Code Online (Sandbox Code Playgroud)
投射data到map[string]interface{}并投射data["name"]到string。
data := claims["data"].(map[string]interface{})
name := data["name"].(string)
Run Code Online (Sandbox Code Playgroud)