RESTful API Auth flow

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

Поток, который я сейчас реализую, выглядит следующим образом. Angular публикует учетные данные пользователя (через https) в моем остальном бэкэнде, и это просто возвращает сгенерированную строку (это, вероятно, будет случайным или сгенерированным криптографически). Затем эта строка сохраняется в виде файла cookie или любого другого состояния браузера, которое я нахожу подходящим, и затем присоединяется к каждому запросу API вместе с идентификатором пользователя, который angular создает в качестве дополнительного параметра или заголовка запроса или чего-то еще. API использует это, чтобы проверить, имеет ли пользователь доступ к запрошенному ресурсу и отвечает соответственно. Возможно, я бы также добавил время истечения в строку, которая будет сбрасываться после каждого запроса.

Мой вопрос действительно ли это приемлемый поток? С точки зрения безопасности, с какими проблемами я, скорее всего, столкнусь? CSRF? Сессия фиксации?

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

2

Решение

Если я вас правильно понимаю, это модель, которую я видел во многих API, особенно в мире SOA без состояния. «Строка», о которой вы говорите, чаще всего называется «токеном авторизации». И все непубличные методы API требуют, чтобы токен (и для того, чтобы он был действителен — срок действия важен, в противном случае кто-то может получить старый токен) должен быть включен в каждый запрос (с именем пользователя или без него — токен должен быть уникально идентифицируемым чтобы сделать это ненужным, но это не повредит), что означает, что перед тем, как что-либо делать, нужно вызвать API входа в систему (который не требует токена, естественно), чтобы получить его, прежде чем что-либо делать.

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

1

Другие решения

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

1

Спасибо за ваш вклад всем. В конечном итоге я решил снова взглянуть на OAuth 2, как и было предложено. То, что я пытался создать, было в значительной степени потоком OAuth в любом случае … Вместо попытки воссоздать колесо, я посмотрел на реализации OAuth в PHP других людей (и Laravel), и эта практическая реализация действительно помогла мне понять.

Я использовал этот пакет в конце

https://github.com/thephpleague/oauth2-server

Обернутый для Laravel

https://github.com/lucadegasperi/oauth2-server-laravel

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

Единственная реальная проблема, с которой я сталкиваюсь сейчас — это защита идентификатора клиента и его секрета. Хранение на стороне клиента определенно является проблемой, но, насколько я понимаю, это только одна из проблем OAuth. К счастью, если это когда-либо скомпрометировано, я могу отозвать и переиздать.

Всем, кто сталкивается с подобным вопросом, следует взглянуть на следующие ссылки:

http://alexbilbie.com/2013/02/a-guide-to-oauth-2-grants/

http://tools.ietf.org/html/rfc6749

Они действительно помогли мне понять OAuth 2.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector