Не удалось создать токен JWT при вводе пользовательского утверждения электронной почты

Я пытаюсь сгенерировать токен 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
}

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


person Amanda    schedule 27.01.2020    source источник
comment
Вам нужно передать правильный тип ключа в зависимости от вашего метода подписи, который, я думаю, ecdsa.PrivateKey.   -  person Burak Serdar    schedule 27.01.2020
comment
Вы читали этот выпуск Github? github.com/dgrijalva/jwt-go/issues/65   -  person creekorful    schedule 27.01.2020
comment
@BurakSerdar Мне просто нужно передать строковый ключ. Какой алгоритм я должен выбрать тогда?   -  person Amanda    schedule 27.01.2020
comment
Методы HMAC используют простой строковый ключ. И подписывающий, и проверяющий должны знать этот секретный ключ.   -  person Burak Serdar    schedule 27.01.2020
comment
@BurakSerdar Не могли бы вы привести небольшой пример в качестве ответа?   -  person Amanda    schedule 28.01.2020


Ответы (1)


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, вы можете использовать ключ HMAC. Ключ HMAC — это просто секрет массива байтов, которым вы делитесь со своими пользователями, чтобы они могли подтвердить, что JWT был подписан вами. Просто измените SigningMethod на одну из констант в:

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

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

person Burak Serdar    schedule 28.01.2020