REST-подобный API: как идентифицировать клиентов?

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

Бэкэнд/промежуточное ПО написано на PHP, и до сих пор я использовал $_SESSION для идентификации пользователей.

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

Вопросы:

  1. Означает ли это, что использование $_SESSION[some_identifier] для сохранения состояния между вызовами не соответствует стилю REST?

  2. Теперь я рассматриваю возможность использования логики «недолговечный токен». Этот токен обменивается с сервером при каждом запросе, и сервер предоставляет новый токен в ответ на каждый запрос. Является ли этот подход более RESTful?


person martinethyl    schedule 13.03.2017    source источник
comment
Есть много способов сделать это, которые зависят от вашего приложения, от того, насколько безопасно оно вам нужно, от вашей модели угроз... То, что вы описываете, не очень хорошо, потому что заставляет клиента постоянно сохранять токены из предыдущих запросов. Это также небезопасно против повторных атак. Взгляните на описанный там метод, который немного похож на OAuth: stackoverflow.com/a/11028528/561309   -  person laurent    schedule 13.03.2017
comment
хорошо... кажется, это то, что я ищу... но тогда мне нужно сгенерировать пару закрытый/открытый ключ для каждого клиента? я думаю, что упомянутый ключ API может быть постоянным для всех пользователей .... но может также предоставляться на основе уровней доступа пользователей?   -  person martinethyl    schedule 13.03.2017
comment
Вы должны сгенерировать ключ API и секрет для каждого клиента. Ключ API сообщает вам, какой клиент выдает запрос. Отсюда вы можете получить связанный с ними секретный ключ и аутентифицировать запрос.   -  person laurent    schedule 13.03.2017
comment
хорошо, да, я понимаю. затем клиент будет хранить ключ API и секрет в течение одного сеанса, и ключи API могут быть подключены к заданному уровню доступа на сервере. я попробую это! Спасибо!   -  person martinethyl    schedule 13.03.2017
comment
меня беспокоит то, что ключ API и секрет будут в открытом тексте на клиенте после извлечения из сети. Но это наверное не считается проблемой?   -  person martinethyl    schedule 13.03.2017


Ответы (1)


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

person Evert    schedule 13.03.2017