Какие способы аутентификации и интеграции с внешними сервисами вы знаете
Что проверяют
Отличаете ли вы аутентификацию от авторизации и умеете ли выбрать схему под сценарий: пользователь в браузере, сервис к сервису, корпоративный SSO. Следом обычно спрашивают, как вы проверяете JWT и что делаете, когда внешний сервис отвечает медленно.
Как отвечать
Способы аутентификации:
- Basic и API-ключи: только поверх TLS, для простых интеграций. Ключ хранят в Vault или переменных окружения, не в репозитории;
- OAuth 2.0: делегированная авторизация. Для пользователей Authorization Code с PKCE, для сервисов Client Credentials. Implicit и Password grant актуальные рекомендации по безопасности не допускают;
- OpenID Connect: слой аутентификации поверх OAuth 2.0, выдаёт ID token с данными пользователя. Частый выбор провайдера у себя: Keycloak;
- JWT: формат токена, подписанный, но не зашифрованный. Сервис проверяет подпись по JWKS, а также
exp,issиaud; - SAML и mTLS: SAML для корпоративного SSO, mTLS для взаимной проверки сервисов по сертификатам.
В Spring это spring-boot-starter-oauth2-resource-server с issuer-uri для приёма токенов и oauth2-client с OAuth2AuthorizedClientManager, который сам получает и кэширует токен для исходящих запросов.
Способы интеграции: REST через RestClient или WebClient (RestTemplate в режиме поддержки, новый код на нём не пишут), декларативные клиенты @HttpExchange или OpenFeign, SOAP через Spring WS или Apache CXF с генерацией из WSDL, gRPC, асинхронно через Kafka или RabbitMQ, вебхуки с проверкой HMAC-подписи. Добавьте устойчивость: таймауты, ретраи с backoff только для идемпотентных операций, circuit breaker из Resilience4j.
Где спотыкаются
Называют OAuth 2.0 протоколом аутентификации. Сам по себе он про доступ к ресурсам, личность пользователя подтверждает OIDC.
Думают, что JWT шифрует данные, и кладут в него персональные данные, хотя прочитать их может любой владелец токена. Ещё проверяют только подпись и принимают просроченный токен или токен, выданный для другого сервиса.
Не задают таймауты. У многих HTTP-клиентов в Java ожидание по умолчанию не ограничено, и один зависший внешний сервис съедает все потоки пула.