В вашем коде нет проверки ошибок.Особенно, если JWKS пуст или содержит что-то, что не является ключом RSA, ваша программа просто аварийно завершает работу, и это обычно не приветствуется в Go.Я бы добавил некоторые проверки вокруг всего этого;например,
func GetSigningKey() *rsa.PublicKey, error {
...
if rsaKey, ok := publicKey.(*rsa.PublicKey); ok {
return rsaKey, nil
}
return nil, errors.New("not an RSA key")
}
Помните, что существуют другие методы подписи , и в принципе вы можете получить ключ ECDSA или (теоретически) необработанный ключ для симметричной подписи, поэтому проверка здесьценный.
Другая высокоуровневая вещь, которую вы должны попробовать, это взять необработанный веб-токен JSON и декодировать его;https://jwt.io/ имеет отладчик, который я использую.Если в заголовке содержится утверждение с именем "kid"
, то есть идентификатор ключа, и вы должны иметь возможность передать этот идентификатор ключа в качестве входных данных в библиотеку JWKS.Это должно быть более надежным, чем слепое использование первого ключа в JWKS.
Онлайн-документы JWKS могут изменяться, но, как правило, это происходит нечасто (в масштабе месяцев).(Если они меняются, вполне вероятно, что JWKS будет включать как старые, так и новые ключи.) Кэширование их в процессе чрезвычайно разумно.Если вы видите "kid"
, вы не можете распознать, что это может быть сигналом для попытки повторного получения документа.
Ваш вывод fmt.Printf
выглядит так, как будто это, вероятно, необработанный открытый ключ RSA.Сам открытый ключ состоит из двух чисел, одно из которых является произведением двух больших простых чисел, а второе часто точно равно 65537. Об этом более подробно говорится в описании Википедии RSA .