Ответ 1
Существует несколько схем аутентификации запросов API, и они отличаются от обычной проверки подлинности, предоставляемой плагинами вроде restful_authentication или act_as_authenticated. Самое главное, что клиенты не будут поддерживать сеансы, поэтому нет понятия входа в систему.
Аутентификация HTTP
Вы можете использовать базовую HTTP-аутентификацию. Для этого клиенты API будут использовать обычное имя пользователя и пароль и просто поместите его в URL-адрес следующим образом:
http://myusername:[email protected]/
Я считаю, что restful_authentication поддерживает это из коробки, поэтому вы можете игнорировать, использует ли приложение ваше приложение через API или через браузер.
Один недостаток здесь заключается в том, что вы просите пользователей указать свое имя пользователя и пароль в ясности в каждом запросе. Выполняя это через SSL, вы можете сделать это безопасным.
Я не думаю, что когда-либо видел API, который использует это. Мне кажется приличной идеей для меня, тем более, что она поддерживалась из коробки текущими схемами аутентификации, поэтому я не знаю, в чем проблема.
Ключ API
Еще один простой способ включить аутентификацию API - использовать ключи API. Это, по сути, имя пользователя для удаленного сервиса. Когда кто-то подписывается на использование вашего API, вы даете им ключ API. Это необходимо передать с каждым запросом.
Один недостаток заключается в том, что если кто-то получит ключ API другого пользователя, он может делать запросы в качестве этого пользователя. Я думаю, что, заставив все ваши запросы API использовать HTTPS (SSL), вы можете немного компенсировать этот риск.
Другой недостаток заключается в том, что пользователи используют одни и те же учетные данные аутентификации (ключ API) во всем мире. Если они хотят отменить доступ к клиенту API, их единственным вариантом является изменение их ключа API, который также отключит всех других клиентов. Это можно смягчить, разрешив пользователям создавать несколько ключей API.
Ключ API + секретный ключ
Устаревший (вид) - см. ниже OAuth
Значительно сложнее подписать запрос с помощью секретного ключа. Это то, что Amazon Web Services (S3, EC2 и т.д.). По сути, вы даете пользователю 2 ключа: их ключ API (то есть имя пользователя) и их секретный ключ (то есть пароль). Ключ API передается с каждым запросом, но секретный ключ отсутствует. Вместо этого он используется для подписи каждого запроса, обычно путем добавления другого параметра.
IIRC, Amazon выполняет это, беря все параметры для запроса и заказывая их по имени параметра. Затем эта строка хешируется, используя секретный ключ пользователя как хэш-ключ. Это новое значение добавляется как новый параметр запроса перед отправкой. На стороне Амазонки они делают то же самое. Они принимают все параметры (кроме подписи), заказывают их и используют хэш с помощью секретного ключа. Если это соответствует сигнатуре, они знают, что запрос является законным.
Недостатком здесь является сложность. Правильная работа этой схемы - боль, как для разработчика API, так и для клиентов. Ожидайте множество вызовов поддержки и сердитых писем от разработчиков-клиентов, которые не могут заставить работать.
OAuth
Для борьбы с некоторыми проблемами сложности с ключом + секретным подписанием появился стандарт: OAuth. В основе OAuth лежит вкус ключа + секретного подписания, но большая часть его стандартизирована и включена в библиотеки для многих языков.
В целом, как разработчику, так и потребителю API гораздо проще использовать OAuth, а не создавать собственную систему ключей/подписи.
OAuth также по своей сути сегментирует доступ, предоставляя разные учетные данные доступа для каждого пользователя API. Это позволяет пользователям выборочно отзывать доступ, не затрагивая их другие потребляющие приложения.
В частности, для Ruby существует OAuth gem, который обеспечивает поддержку как для производителей, так и для потребителей OAuth. Я использовал этот камень для создания API, а также для использования API OAuth и был очень впечатлен. Если вы считаете, что ваше приложение нуждается в OAuth (в отличие от простой схемы ключей API), то я могу с легкостью рекомендовать использовать драгоценный камень OAuth.