Как получить доступ к суб-претензиям JWT, используя Go? - PullRequest
1 голос
/ 18 апреля 2020

Мне нужно получить значения под-заявок из JWT в Go.

У меня есть (устаревшие) JWT, которые мне нужно проанализировать в go, которые содержат пользовательские претензии "данные" который содержит Json -объект, состоящий из нескольких полей (идентификатор пользователя, имя пользователя), поэтому

{ [...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)

Это прекрасно работает для стандартных утверждений, и я также получаю имена полей из Json -Sub-Object в утверждении «данные», но не значения полей (все пустые строки). Я также попытался настроить структуры, соответствующие иерархии утверждений (внешняя и внутренняя структура), но безуспешно.

Каким образом можно получить доступ к значениям вложенных утверждений?

1 Ответ

2 голосов
/ 18 апреля 2020

Вы можете использовать jwt.MapClaims с "data": map[string]string со следующими шагами:

  • Шаги 1.1 и 1.2 создают токен
  • Шаги 2.1 и 2.2 анализируют токен и извлекают значения под-претензий.

В приведенном ниже примере jwt - это github.com/dgrijalva/jwt-go.

Шаг 1.1: создание претензий

Создание пользовательских MapClaims с data картой. Добавьте пользовательское свойство 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

В этом примере мы будем использовать ключ симметрии c.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...