Erlang / OTP: авторизация / аутентификация в приложениях RESTful

Я занимаюсь разработкой приложения Erlang / OTP, которое будет предоставлять свои сервисы (SOA) через RESTful API.

Сервисы, составляющие бэкэнд, будут сервисом базы данных, сервисом расчета цен и т. Д.

Клиенты могут быть разных типов: веб-клиент, мобильные клиенты, клиент сервера Asterisk (который должен искать записи пользователей в службе базы данных) и даже клиенты, которые я не планирую иметь и о которых еще не знаю. Клиенты будут использовать RESTful API по-разному: некоторые будут использовать все службы, некоторые будут использовать только некоторые из служб (способ SOA).

Основная проблема, которая у меня есть, - это аутентификация / авторизация.

Веб-приложение RESTful

Я не могу использовать встроенную аутентификацию / авторизацию Ruby on Rails, потому что веб-клиент - это всего лишь один из множества возможных клиентов, которые будут использовать приложение через RESTful API.

Итак, мой вопрос:

  • какова общая концепция аутентификации / авторизации для типичного веб-приложения RESTful, которое, как ожидается, будет использоваться с множеством разных клиентов?
  • каков наиболее практичный шаблон проектирования программного обеспечения для авторизации / аутентификации в веб-приложении RESTful?
  • Какие библиотеки программного обеспечения с открытым исходным кодом Erlang / OTP вы могли бы порекомендовать для реализации аутентификации / авторизации для такого приложения?

person skanatek    schedule 03.08.2012    source источник
comment
учли ли вы: (Open Id) openid.net и OAuth (oauth.net/2)? Существуют библиотеки erlang, которые взаимодействуют с этими протоколами.   -  person Muzaaya Joshua    schedule 03.08.2012
comment
Не выдвигать это как ответ, поскольку он еще не прошел боевых испытаний. В настоящее время я работаю над чем-то подобным со своей компанией; централизованная служба аутентификации, которая будет вызываться рядом различных приложений и клиентов, которые мы собираемся создать. Компонент аутентификации, который мы собрали, находится на github.   -  person Inaimathi    schedule 03.08.2012


Ответы (1)


Просто проверьте, как это делают другие, например, в этой статье: Аутентификация в Facebook.

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

В REST токен может быть отправлен просто как другой параметр в URL-адресе, в POST или как дополнительное поле непосредственно в JSON. Отправка его как POST или в JSON, вероятно, лучше всего, поскольку он сохраняет URL-адрес в чистоте (и не будет конфликтовать с каким-либо кешированием, которое может быть основано на URL-адресах).

В этом заслуга идеи, но, как обычно, есть еще кое-что, что нужно учесть. Например, токен должно быть трудно угадать, поэтому клиент не сможет воссоздать действительный токен без аутентификации в системе. Кроме того, системе может потребоваться истечь токен, если в течение указанного периода времени не вызывается API.

Чтобы ответить на последнюю часть вашего вопроса, некоторые библиотеки должны указать:

  • erlang: phash2 или crypto библиотеку можно использовать для создания уникальных токенов, которые нелегко угадать.
  • Webmachine в качестве отличного фреймворка или инструментария REST, как они его называют, для создания интерфейсов REST в Erlang
  • логика вызовов API может быть реализована в Erlang и обслуживаться непосредственно с веб-сервера, например inets или yaws, или это может быть реализовано с использованием веб-фреймворка, такого как Nitrogen или Chicago Boss. Просмотрите этот список веб-фреймворков Erlang.
person Greg    schedule 15.08.2012