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)