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

标签 go jwt jwt-go

我需要从 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/

相关文章:

Gorilla Mux 处理 curl 请求

go - 什么是快路径、慢路径、热路径

docker - Docker容器中的服务器空响应

java - 升级到 Spring Boot 2.0.2 后,Spring Security .permitAll() 不再有效

jwt - 手动计算 JWT 签名永远不会输出真正的签名

docker - 使用 Go 和 GoLand IDE 远程调试 HTTP 请求

node.js - 从服务器获取当前用户信息的同时获取304状态代码

带有 Martini 的 GoLang JWT 抛出 <invalid Value>?

go - 如何在 Go 中将 JWT 的过期日期解析为 time.Time() ?

json - 如何检查 JWT 的角色声明(值数组)的某个值?