2014-01-23 3 views
6

Цель: Мой сервер должен направлять не-пользователей на посадку/домашнюю страницу и регистрироваться в реальном приложении. Когда приложение будет загружено, оно сделает аутентифицированным HTTP-запросы к API RESTful (через Ajax).«Общая» аутентификация для веб-сайта и RESTful API

У меня есть API RESTful, который нуждается в аутентификации. На другом сервере у меня есть свой веб-сайт, для которого также требуется аутентификация, поэтому я могу определить, отображать ли вы посадку/домашнюю страницу для не-пользователей или приложение для зарегистрированных пользователей.

Первоначально я думал, что этого достаточно, чтобы реализовать HTTP Basic Auth для RESTful API. Однако, чтобы получить аутентификацию для моего веб-сайта, мне также необходимо настроить аутентификацию, что означало бы дублирование низкоуровневого кода для проверки учетных данных в базе данных как в REST API, так и на серверах веб-сайта.

В качестве альтернативы, я задавался вопросом, может ли веб-сайт аутентифицироваться через API RESTful. Например, в моем обработчике запросов для POST /login я мог бы сделать запрос GET к моему API, передав учетные данные пользователя из тела запроса. Если запрос возвращает 200 OK, я могу подписать сеанс пользователя, тем самым подтвердив его. Оттуда и далее, запросы Ajax к REST API должны быть заверены с теми же учетными данными, так что я мог:

  • установить кук, содержащих учетные данные, таким образом, позволяя JavaScript, чтобы получить учетные данные, прежде чем делать запрос (OK с SSL?)
  • dump учетные данные в обслуживаемом HTML для веб-приложения, позволяя JavaScript получить учетные данные перед выполнением запроса (ОК с SSL?)
  • прокси API через сервер веб-приложений, где Я могу получить учетные данные из сеанса и добавить их в заголовок Authorization прокси-запроса?

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

Что было бы не так с этим? Есть ли лучший способ выполнить мою задачу?

ответ

0

Я думаю, что ваш подход с использованием базовой HTTP-аутентификации в службе REST и проверка подлинности вашего приложения с помощью сервиса отлично. Единственное предостережение (которое, я уверен, вы знаете), заключается в том, что ваша служба REST должна работать через SSL, поскольку базовая HTTP-аутентификация не очень безопасна - имя пользователя и пароль просто закодированы в Base64.

+0

Какую конечную точку я должен определить в своем API, к которому веб-приложение отправит запрос? Будет ли простой 'GET' что-то вроде'/auth' быть в порядке (определяя заголовок 'Authorization' в запросе)? –

+0

Это было бы прекрасно - тогда вы можете вернуть 200, если аутентификация прошла успешно, а 401 - нет. У меня был аналогичный случай, но я сделал это без специального вызова auth, в основном со страницы входа. Я делаю вызов API для отдыха, чтобы получить пользователя с конкретным именем пользователя, передав имя пользователя и пароль в заголовке проверки подлинности - тогда, если вход в систему не выполнен Я возвращаю 401, если мне удастся выполнить вход в систему, я возвращаю 200 и пользовательский ресурс (который требуется приложению независимо - так что он сохраняет дополнительный вызов). –

+0

Хорошо, отлично, спасибо! –

3

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

  • Есть на стороне сервера вашего веб-приложения всегда аутентификации с определенным именем пользователя/пароля при доступе к REST API, гарантируя, что ваш веб-приложение всегда доверяли и предполагая, что пользователи должным образом вошли в систему на web- приложение, если запрос аутентифицирован как приложение.
    • Плюсы: Простая в применении, понятная и простая в использовании для других приложений (у нас была CLI, которая также обращалась к тому же REST API).
    • Недостатки: API REST не может знать, какой пользователь фактически обращается к нему. Если доверенный клиент взломан, вся система скомпрометирована.
  • Имеет ли серверная часть вашего веб-приложения информацию о пользователе в сеансе и аутентифицируется с использованием учетных данных пользователей при каждом доступе к API REST.
    • Плюсы: Довольно легко реализовать (хотя некоторые механизмы аутентификации затрудняют сохранение пароля пользователя - по уважительной причине). Вся процедура прозрачна для API REST.
    • Недостатки: теперь вы сохраняете (для всех целей и целей в текстовом виде) имя пользователя и пароль пользователя в сеансе веб-сервера - одну из самых главных целей для атаки в системе.
  • Создайте систему аутентификации в REST API, которая аутентифицирует запрос с авторизацией имени пользователя и пароля и возвращает токен, действительный в течение ограниченного времени.
    • Плюсы: более безопасно, если ваше веб-приложение скомпрометировано, вы не предоставляете злоумышленнику имя пользователя/пароли пользователей, но вместо этого разрешаете им ограниченный доступ времени.
    • Против: Намного сложнее реализовать. Возможно, вам придется иметь дело с тайм-аутами токенов. Для пуристов это также означает, что ваша реализация REST (или, по крайней мере, система аутентификации) будет, возможно, «stateful».

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

+0

Я понимаю последние два варианта, но не первый. Можете ли вы рассказать о том, как это будет соответствовать моей цели, позволяя аутентифицировать веб-приложение, а также запросы Ajax непосредственно к API? –

+0

Веб-приложение будет аутентифицироваться как любой другой клиент API REST, он просто будет иметь свои собственные данные для входа, не связанные с каким-либо пользователем.Не зная вашей точной ситуации, я не могу сказать вам, является ли это хорошим вариантом или нет, хотя я вообще избегал этого - мы делали это прежде всего из-за внешнего давления и того факта, что мы не можем разрешать AJAX запросы непосредственно в REST API (он считался угрозой безопасности со стороны полномочий), поэтому веб-приложение стало чем-то вроде прокси для запросов AJAX. – Thor84no

+0

Я не получаю часть «он будет иметь свои данные для входа». Если пользователю необходимо выполнить аутентификацию с помощью веб-приложения (для получения приложения вместо документа домашней страницы), им обязательно нужно будет ввести свое имя пользователя и пароль? Там, где я думал, затем отправил введенные учетные данные в REST API. Как только пользователь будет аутентифицирован с помощью веб-приложения, они получат документ приложения и могут сделать аутентифицированные запросы в API, используя учетные данные, хранящиеся в сеансе. –

Смежные вопросы