Не удалось создать токен JWT при вводе пользовательской претензии по электронной почте - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь сгенерировать токен JWT, используя Go, и я создал следующую функцию. Мне нужно добавить адрес электронной почты в jwt, но при этом я получаю сообщение об ошибке: key is of invalid type

func GenerateUserToken(expiryHours time.Duration, email string, secretKey string) (string, error) {
    // Create a new token object, specifying signing method and the claims
    // you would like it to contain.
    token := jwt.New(jwt.SigningMethodES256)
    claims := token.Claims.(jwt.MapClaims)
    claims["exp"] = time.Now().Add(time.Hour * expiryHours).Unix()
    claims["email"] = email

    tokenStr, err := token.SignedString([]byte(secretKey))
    if err != nil {
        return "", err
    }

    return tokenStr, nil
}

В чем может быть причина этого? Какую ошибку я делаю?

1 Ответ

0 голосов
/ 28 января 2020

JWT поддерживает множество алгоритмов подписи, и это является проблемой для этого конкретного API: в зависимости от алгоритма подписи он ожидает увидеть ключ, соответствующий этому алгоритму.

Если вы посмотрите документы API для этой конкретной библиотеки:

https://godoc.org/github.com/dgrijalva/jwt-go

Вы увидите SigningMethodXXX типов. Эти подписавшиеся выбираются выбранным вами методом подписи. Для ES256 он использует SigningMethodECDSA:

https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA

Если вы посмотрите документы по Sign, вы увидите, что в нем написано:

Для этого метода подписи ключ должен быть структурой ecdsa.PrivateKey

, которую можно проанализировать из файла PEM, используя:

https://godoc.org/github.com/dgrijalva/jwt-go#ParseECPrivateKeyFromPEM

Например:

pk, err:= jwt.ParseECPrivateKeyFromPEM(pemData)
tokenStr, err := token.SignedString(pk)

Это должно дать вам подписанный токен с ES256.

Итак, вы должны сначала выяснить, какого рода ключ у вас есть. Если у вас есть PEM-кодировка ключа ECDSA в строке, используйте этот метод для его анализа и передачи получившегося секретного ключа подписавшему.

Если, однако, у вас просто есть строковый секретный ключ (например, пароль) ), и вы передадите этот секретный ключ пользователям JWT, после чего вы сможете использовать ключ HMA C. Ключ HMA C - это просто секрет байтового массива, которым вы делитесь со своими пользователями, чтобы они могли подтвердить, что JWT был подписан вами. Просто измените SigningMethod на одну из констант в:

https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC

Затем ваш код будет работать, за исключением того, что вы должны изменить метод подписи на что-то вроде jwt.New(jwt.SigningMethodHS256)

...