RESTful сервис аутентификации пользователей - PullRequest
9 голосов
/ 07 января 2010

Привет, ребята, это, кажется, обсуждалось довольно часто, но я хочу задать простой, размытый вопрос о выполнении аутентификации с помощью сервисов RESTful. Сценарий таков:

  • Существует система, в которой размещаются зарегистрированные пользователи для приложения. Система предоставляет RESTful API для доступа к этим пользователям.
  • Существует интерфейсное приложение с формой входа. Приложение может быть как внутренним, так и внешним.
  • Внешнему приложению необходимо использовать данные в системе пользователя для аутентификации пользователя.

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

Я понимаю идею о том, что приложение "управляется гипермедиа", но мы должны иметь возможность предоставлять услуги фильтрации / поиска. Например, рассмотрим ресурсы и API, как показано ниже:

  • http://example.com/users
    • GET - извлекает всех пользователей (управляемых, управляемых гипермедиа)
    • POST - создает нового пользователя
    • PUT / DELETE не поддерживается
  • http://example.com/users/[id]
    • GET - возвращает полное представление пользователя с id = {id}
    • PUT - обновляет пользователя, принимает любой предопределенный тип носителя
    • DELETE - удаляет пользователя (с соответствующей авторизацией)
    • POST не поддерживается

Исходя из вышеизложенного, моя идея заключается в том, чтобы клиентское приложение GET отображало список пользователей, фильтруя по имени пользователя. Служба вернет хешированный пароль и соль клиенту, клиент выполнит аутентификацию.

Мысли

Ответы [ 5 ]

6 голосов
/ 08 января 2010

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

Я предлагаю вам взглянуть на OAuth , который был создан именно для этой проблемной области.

4 голосов
/ 02 февраля 2014

Stormpath

Stormpath компания, специализирующаяся на предоставлении API-интерфейса управления входом в систему и сервиса для разработчиков. Они используют подход REST JSON .

Есть некоторые другие компании, которые, кажется, балуются этой новой областью аутентификации как услуги, но Stormpath - единственная, кого я знаю, которая посвящена этому.

4 голосов
/ 15 января 2010

Передача имени пользователя и соли назад не является необходимой и реальной угрозой безопасности.

Возможно, вы могли бы рассмотреть этот подход:

Пусть клиент передаст имя пользователя и пароль на сервер через Базовая аутентификация

Сервер извлекает зашифрованный пароль для имени пользователя вместе с солью

Сервер шифрует данный пароль, используя некоторый метод шифрования, используя соль для помощи алгоритму (следующий код Ruby):

def User.authenticate(login, password)
    ok = false

    user = User.find_by_login(login)

    if user
        #
        #   user contains the salt, it isn't passed from the client
        #  
        expected_password = hash_password(password, user.salt)

        ok = (user.password == expected_password)
    end

    return ok
end

Есть несколько мест, где можно использовать такой подход, но мне нравится делать это в Rack.

Последний пункт, делайте все это по HTTPS-соединению

3 голосов
/ 07 января 2010

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

Вместо этого просто используйте механизм аутентификации, например HTTP Basic или HTTP Digest .

Обратите внимание, что если вы используете Java, платформа Restlet предоставляет перехватчики, называемые Guards, которые поддерживают эти и другие механизмы. Я настоятельно рекомендую Рестлет.

0 голосов
/ 02 февраля 2014

Mozilla Persona

С тех пор как этот вопрос был опубликован, Mozilla Foundation (создатель браузера Firefox ) взялся за проблему простой аутентификации пользователей. Их решение - Mozilla Persona , «система входа в Интернет». Разработанный, чтобы быть легким для пользователей и для разработчиков. Идентификацией пользователя является адрес электронной почты. См. статью в Википедии .

Обновление

Mozilla в основном отказалась от работы над Persona, но не совсем убил проект.

...