Единая страница входа на сервер авторизации с использованием Spring Boot и OAUTH2

Мне нужен сервер аутентификации OAUTH2 для моих одностраничных веб-приложений. Мне удалось создать сервер аутентификации OAuth2, который поддерживает тип гранта PASSWORD, используя Spring Boot. Но Spring требует секрет клиента для базовой аутентификации на конечной точке /auth/token. Я красный, это небезопасно, любой может извлечь секрет клиента из кода JS. Поэтому я пытаюсь выяснить, как это сделать, не раскрывая секрет клиента. Также я хочу, чтобы у каждого моего SPA не было собственной страницы входа, но на сервере аутентификации была бы одна страница входа, на которую будут перенаправляться пользователи моих SPA, и они будут перенаправлены обратно после входа в систему. Я знаю, что это распространенный сценарий, но мне не удалось найти учебник, как это сделать с помощью Spring Boot. Буду благодарен за совет.


person Vojtech    schedule 25.04.2017    source источник


Ответы (1)


Для общедоступного клиента, такого как веб-приложение, вы можете указать пустой пароль в заголовке базовой аутентификации. Например, если client_id мобильного приложения равен abcd (используйте длинную случайную строку в рабочей среде), вы можете использовать abcd:, закодированный в Base64. Заголовок будет Authorization: Basic YWJjZDo=, где YWJjZDo= -> Base64("abcd:").
Фактически, вы можете указать что угодно в качестве основного пароля авторизации, сервер авторизации не будет проверять его, если вы не назначите client_secret для ваш клиент.

Вы должны использовать предоставление пароля только для своих собственных приложений (никогда не давайте своим партнерам право собирать учетные данные ваших собственных пользователей) и когда неявное предоставление не обеспечивает достаточного пользовательского опыта для вас — например, если вы этого не делаете. хотите, чтобы ваше мобильное приложение переключалось с собственного пользовательского интерфейса на браузер и обратно.

Одностраничные веб-приложения идеально подходят для неявного предоставления.

На сервере авторизации убедитесь, что в сведениях о клиенте вашего веб-приложения есть authorized_grant_type, которые содержат implicit, и redirect_uri, равный конечной точке, которая получит токен в конце процесса. В одностраничном приложении у вас должен быть некоторый обработчик, который может подобрать токен доступа в URL-адресе, когда сервер авторизации перенаправляет пользователя обратно на вашу страницу.

Со своей веб-страницы вы должны перенаправить пользователей на https://your-authz-server/oauth/authorize?response_type=token&client_id=$CLIENT_ID_YOU_JUST_CONFIGURED&redirect_uri=$YOUR_APPLICATION_PAGE.

После того как пользователь предоставил доступ к вашему приложению, он возвращается на ваш URI перенаправления с параметром access_token, который вы можете выбрать в URL-адресе.
Примечание. В рабочей среде всегда следует устанавливать фиксированный redirect_uris (можно указать несколько, разделенных запятыми) для клиентов, использующих грант implicit или authorization_code. Для гранта implicit это единственный способ усложнить получение злоумышленниками токенов от ваших пользователей.

Если вы не хотите, чтобы ваши собственные пользователи видели список областей (разрешений), которые требуются вашему сайту, вы можете настроить свой клиент так, чтобы он имел предварительно проверенные области. Таким образом, ваш пользователь может войти в систему и быть перенаправленным прямо на страницу вашего приложения с токеном, без необходимости видеть сантехнику OAuth 2.0.

Обратите внимание, что сервер авторизации предоставляет страницы входа по умолчанию, но вы можете настроить их с помощью классического Spring MVC @Controller, сопоставленного с /oauth/authorize, и реализовать представление с помощью механизма шаблонов, который вам нравится (thymeleaf, Velocity, JSP...). Вы также можете настроить страницу входа с помощью классической Spring Security, убедитесь, что вы обрабатываете запросы только по пути /oauth/authorize.

Ознакомьтесь с этим превосходным руководством от разработчика Spring Security OAuth 2.0: https://spring.io/guides/tutorials/spring-security-and-angular-js/

И длинная версия здесь с пояснениями: https://spring.io/blog/2015/01/12/spring-and-angular-js-a-secure-single-page-application

person Michael Técourt    schedule 26.04.2017