Я предлагаю вам внедрить систему аутентификации без сохранения состояния в сочетании с провайдером идентификатора входа в систему Google.
«Используя JWT в качестве канала для авторизации, вы можете без проверки состояния проверить, является ли пользовательаутентифицируется, просто проверяя, не истек ли срок действия в полезной нагрузке и действительна ли подпись ». - Джонатан Нильссон
Некоторые полезные ресурсы по теме:
Общая идея такова:
- веб-интерфейс получает аутентификацию для входа в GoogleТокен JWT.
- веб-интерфейс отправляет токен JWT с каждым HTTP-запросом (с заголовком авторизации)
- бэкэнд извлекает JWT для каждого запроса, проверяет его подпись и получает атрибуты полезной нагрузки (электронная почта, идентификатор ...)
- затем бэкэнд проверяет 'email' или 'id' в базе данных пользователей, чтобы разрешить или не запросить.
Бэкэнд не имеет состояния и прост в реализации.Этот дизайн становится хорошей практикой в облачной платформе, и, например, Google Cloud часто использует это в своих новых продуктах: Cloud Run
Некоторые подробности на каждом этапе:
1) веб-интерфейс получает токен аутентификации JWT для входа в Google.
Для этого вы можете использовать библиотеку входа в Google напрямую или использовать ng-gapi для управления входом в Google в Angular.
2) Каждый http-вызов к бэкэнду имеет заголовок авторизации с токеном JWT (id_token), полученный из GoogleВход в систему.
Для этого вы можете использовать HttpInterceptor.
headers: {
Authorization: Bearer ___JWT ID TOKEN___
}
См. 10 лучших способов использования перехватчиков в Angular от Michael Karén.
Обратите внимание, чтобы не хранить Google JWT Id_token в переменной.Его можно обновить, если срок его действия истек (автоматически выполняется при входе в Google), поэтому при каждом использовании внутри HttpInterceptor вы должны брать новую версию.
3) Внедрить фильтр в Spring Boot
Для каждого запроса этот фильтр безопасности будет извлекать JWT ID TOKEN
и проверять его с помощью библиотеки Google.
NetHttpTransport transport = new NetHttpTransport();
JsonFactory jsonFactory = new GsonFactory();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Collections.singletonList(clientId))
.build();
GoogleIdToken idToken = GoogleIdToken.parse(verifier.getJsonFactory(), token);
boolean tokenIsValid = (idToken != null) && verifier.verify(idToken);
if (tokenIsValid) {
GoogleIdToken.Payload payload = idToken.getPayload();
// Get profile information from payload
payload.getEmail())...
...
Но будьте осторожны, чтобы не создавать GoogleIdTokenVerifier
для каждого запроса,используйте шаблон factory
.Этот класс будет извлекать сертификаты и автоматически их кэшировать, чтобы избежать бесполезного запроса к серверам Google.
Некоторые ресурсы: Вход в Google, аутентификация на бэкэнд-сервере