Аутентификация REST API

148

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

Например, когда пользователь вошел в систему, а затем хочет создать тему форума. Как я узнаю, что пользователь уже зарегистрировался?

  • 3
    Вы, вероятно, должны искать «REST-аутентификацию» здесь. Это было рассмотрено во многих других вопросах.
  • 10
    В двух словах, пусть клиент отправляет имя пользователя и пароль с каждым запросом, используя HTTP Basic Auth (через SSL!), Или проходит аутентификацию один раз, чтобы у клиента был аутентифицированный сеанс, срок действия которого истечет после некоторого периода бездействия (или если вы решите переопределить его) обработка вашего веб-фреймворка). Затем указанный сеанс может быть сохранен в файле cookie или может быть параметром, передаваемым при каждом запросе (например, JSESSIONID на земле Java).
Показать ещё 5 комментариев
Теги:
rest

4 ответа

56
Лучший ответ

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

OAuth - лучшее, что может получить. Обратитесь к инструкции о том, как реализовать:

Рабочая ссылка из комментария: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

  • 4
    Пожалуйста, прочитайте этот вопрос и ответ, предоставленный Les Hazelwood (автор Apache Shiro).
  • 3
    Ссылка не работает.
Показать ещё 3 комментария
100

Например, когда пользователь имеет login.Now позволяет сказать, что пользователь хочет создать тему форума, Как я узнаю, что пользователь уже вошел в систему?

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

Проверьте, как Amazon AWS выполняет аутентификацию. Это прекрасный пример "передачи доллара" от одного API к другому.

* Я подумал о добавлении некоторого практического ответа на мой предыдущий ответ. Попробуйте Apache Shiro (или любую библиотеку аутентификации/авторизации). Итог, старайтесь избегать пользовательского кодирования. После того, как вы включили свою любимую библиотеку (я использую Apache Shiro, btw), вы можете сделать следующее:

  • Создайте API входа/выхода из системы, например: /api/v1/login и api/v1/logout
  • В этих API входа и выхода из системы выполните проверку подлинности с помощью пользовательский магазин
  • Результат - это токен (обычно, JSESSIONID), который отправляется обратно клиенту (веб, мобильный, любой)
  • С этого момента все последующие вызовы, сделанные вашим клиентом будет включать этот токен
  • Предположим, что ваш следующий вызов выполняется в API под названием /api/v1/findUser
  • Первое, что должен сделать этот код API, это проверить токен ("is этот пользователь аутентифицирован? ")
  • Если ответ возвращается как НЕТ, то вы выбрасываете статус HTTP 401 обратно на клиента. Пусть они справятся с этим.
  • Если ответ "ДА", затем верните запрошенный пользователь

Это все. Надеюсь это поможет.

  • 0
    Итак, то, что вы описываете, по сути является сессионным cookie, верно?
  • 0
    да, но сеанс "поддерживается" в 2 разных местах. Один на сервере API, другой в браузере. Ответ JSON (или любой другой), возвращаемый браузеру после успешной регистрации, должен сообщать идентификатор сеанса на сервере API обратно браузеру. Эти сеансы независимо управляются их соответствующими агентами.
Показать ещё 9 комментариев
31
  • Используйте HTTP Basic Auth для проверки подлинности клиентов, но обрабатывайте имя пользователя/пароль только как временный токен сеанса.

    Маркер сеанса - это только заголовок, прикрепленный к HTTP-запросу каждый, например: Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    Строка Ym9ic2Vzc2lvbjE6czNjcmV0 выше - это строка "bobsession1: s3cret" (которая является именем пользователя/паролем), закодированная в Base64.

  • Чтобы получить маркер временного сеанса выше, укажите функцию API (например: http://mycompany.com/apiv1/login), которая принимает имя мастера-мастера и мастер-пароль в качестве ввода, создает на сервере временное имя пользователя/пароль HTTP Basic Auth и возвращает токен (например: Ym9ic2Vzc2lvbjE6czNjcmV0). Это имя пользователя/пароль должно быть временным, оно должно истечь через 20 минут или около того.

  • Для дополнительной безопасности убедитесь, что служба REST обслуживается через HTTPS, так что информация не передается открытым текстом

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

  • 1
    Почему он должен истечь через 20 минут? Что делать, если это веб-сайт, как Facebook, что логин, пока пользователь не выйдет?
  • 1
    @dejel Я предполагал, что «сессия» носит временный характер. Обычно он истекает, если пользователь бездействует
Показать ещё 1 комментарий
6

Я думаю, что лучший подход - использовать OAuth2. Google, и вы найдете много полезных сообщений, которые помогут вам настроить его.

Это упростит разработку клиентских приложений для вашего API из веб-приложения или мобильного устройства.

Надеюсь, это поможет вам.

  • 2
    Пожалуйста, прочитайте этот вопрос и ответ Les Hazelwood (автор Apache Shiro).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню