Проблема: у
нас есть RESTful API на основе Spring MVC, который содержит конфиденциальную информацию. API должен быть защищен, однако отправка учетных данных пользователя (user / pass combo) с каждым запросом нежелательна. В соответствии с рекомендациями REST (и внутренними бизнес-требованиями) сервер должен оставаться без состояния. API будет использоваться другим сервером в стиле mashup.
Требования:
Клиент делает запрос
.../authenticate
(незащищенный URL) с учетными данными; Сервер возвращает безопасный токен, который содержит достаточно информации, чтобы сервер мог проверить будущие запросы и остаться без состояния. Скорее всего, он будет содержать ту же информацию, что и токен Spring Security « Remember-Me» .Клиент делает последующие запросы к различным (защищенным) URL-адресам, добавляя ранее полученный токен в качестве параметра запроса (или, менее желательно, заголовок HTTP-запроса).
Нельзя ожидать, что клиент будет хранить куки.
Поскольку мы уже используем Spring, решение должно использовать Spring Security.
Мы бились головой об стену, пытаясь заставить это работать, так что, надеюсь, кто-то там уже решил эту проблему.
Учитывая приведенный выше сценарий, как вы можете решить эту конкретную потребность?
источник
Ответы:
Нам удалось заставить это работать точно так, как описано в OP, и, надеюсь, кто-то другой может использовать решение. Вот что мы сделали:
Установите контекст безопасности следующим образом:
Как видите, мы создали кастом
AuthenticationEntryPoint
, который в основном просто возвращает a,401 Unauthorized
если наш запрос не был аутентифицирован в цепочке фильтровAuthenticationTokenProcessingFilter
.CustomAuthenticationEntryPoint :
AuthenticationTokenProcessingFilter :
Очевидно,
TokenUtils
содержит некоторый секретный (и очень специфичный для конкретного случая) код и не может быть легко распространен. Вот его интерфейс:Это должно дать вам хорошее начало. Удачного кодирования. :)
источник
validate(...)
метод). Это важно, потому что я хочу, чтобы сервер оставался без сохранения состояния. Я полагаю, вы могли бы использовать этот подход без необходимости использования Spring.Вы могли бы рассмотреть Дайджест-аутентификацию доступа . По сути, протокол выглядит следующим образом:
Все это сообщение осуществляется через заголовки, которые, как указывает jmort253, в целом более безопасны, чем передача чувствительного материала в параметрах URL.
Дайджест-аутентификация доступа поддерживается Spring Security . Обратите внимание, что, хотя в документах говорится, что у вас должен быть доступ к текстовому паролю вашего клиента, вы можете успешно пройти аутентификацию, если у вас есть хэш HA1 для вашего клиента.
источник
Что касается токенов, несущих информацию, JSON Web Tokens ( http://jwt.io ) - блестящая технология. Основная идея состоит в том, чтобы встраивать информационные элементы (утверждения) в токен, а затем подписывать весь токен, чтобы проверяющая сторона могла убедиться, что утверждения действительно заслуживают доверия.
Я использую эту реализацию Java: https://bitbucket.org/b_c/jose4j/wiki/Home
Существует также модуль Spring (spring-security-jwt), но я не изучал, что он поддерживает.
источник
Почему бы вам не начать использовать OAuth с JSON WebTokens
http://projects.spring.io/spring-security-oauth/
OAuth2 - это стандартизированный протокол / среда авторизации. Согласно официальной спецификации OAuth2 :
Вы можете найти больше информации здесь
источник