Сообщение об ошибке
oidc: malformed jwt: unexpected signature algorithm "ES256"; expected ["RS256"]
Также выводится как
- oidc: id token signed with unsupported algorithm, expected ["RS256"] got "ES256"
go-oidc v3.0–v3.5 проверяла алгоритм после разбора и формулировала ошибку так: «oidc: id token signed with unsupported algorithm, expected [\"RS256\"] got \"ES256\"»; более поздние версии (проверено на v3.10, v3.14, v3.17 и v3.21) отклоняют токен ещё при разборе, отсюда «malformed jwt».
coreos/go-oidc (Go) — IDTokenVerifier.Verify with the default SupportedSigningAlgs
Что это означает
ID-токен подписан алгоритмом, которого нет в `SupportedSigningAlgs` объекта проверки. Если этот список пуст, а объект проверки создан не из провайдера, полученного через документ обнаружения, go-oidc принимает только RS256 (это значение по умолчанию предписывает спецификация OpenID Connect), поэтому любой токен ES256, PS256 или EdDSA отклоняется ещё до проверки подписи. go-oidc сообщает об этом как о «malformed jwt», потому что проверка происходит при разборе JWS.
Почему это происходит
Объект проверки создан вручную без списка алгоритмов
часто`oidc.NewVerifier(issuer, keySet, &oidc.Config{ClientID: …})` без `SupportedSigningAlgs` принимает только RS256. С провайдерами, которые подписывают токены алгоритмом ES256 (а так делают многие развёрнутые самостоятельно), проверка сразу завершается ошибкой.
Провайдер сменил алгоритм подписи
иногдаОбъект проверки с явным списком перестаёт работать, когда провайдер при ротации переходит на ключ другого типа. Объекты проверки, созданные на основе документа обнаружения, получают новое значение из `id_token_signing_alg_values_supported`.
Токен выдан не этим провайдером
иногдаТокены другого издателя с другим алгоритмом попадают на эту проверку раньше, чем на проверку издателя.
Как исправить
- 1.
Явно укажите алгоритм провайдера
Задайте в `SupportedSigningAlgs` алгоритм или алгоритмы, которые использует провайдер. Не раздувайте список: это список разрешённых алгоритмов.
go verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{ ClientID: clientID, SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with }) - 2.
Берите алгоритмы из документа обнаружения
`provider.Verifier` читает поддерживаемые алгоритмы из метаданных провайдера, поэтому ничего не нужно синхронизировать вручную.
go // provider.Verifier takes the algorithms from id_token_signing_alg_values_supported. provider, err := oidc.NewProvider(ctx, issuer) if err != nil { return err } verifier := provider.Verifier(&oidc.Config{ClientID: clientID})