Обеспечение API-интерфейс REST не изобретать велосипед


при проектировании API-интерфейс REST является общим для первой проверки подлинности пользователя?

типичный случай использования, который я ищу-это:

  • пользователь хочет получить данные. Конечно здорово мы хотели бы поделиться! Получите открытый ключ API и читайте дальше!
  • пользователь хочет хранить / обновлять данные... уоу, подожди! кто ты, ты можешь это сделать?

Я хотел бы построить его один раз и разрешить использовать веб-приложение, приложение для android или приложение для iPhone оно.

REST API представляется логичным выбором с такими требованиями

чтобы проиллюстрировать мой вопрос, я буду использовать простой пример.

у меня есть элемент в базе данных, который имеет рейтинг (целое число от 1 до 5).

если я правильно понимаю REST, я бы реализовал запрос GET, используя язык по моему выбору, который возвращает csv, xml или json следующим образом:

http://example.com/product/getrating/{id}/

скажем, мы выбираем JSON мы возвращение:

{
  "id": "1",
  "name": "widget1",
  "attributes": { "rating": {"type":"int", "value":4} }
}

это нормально для публичных API-интерфейсов. Я понимаю эту часть.

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

Я постараюсь использовать другой пример, используя то же самое пункт/рейтинг.

если пользователь "Джо" хочет добавить рейтинг до item

Это можно сделать с помощью:

http://example.com/product/addrating/{id}/{givenRating}/

на данный момент я хочу сохранить данные о том, что "Джо" дал продукту {id} рейтинг {givenRating}.

вопрос: Откуда я знаю, что запрос пришел от "Джо", а не от "Боба".

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

что у меня есть далеко находится:

1) используйте встроенную функцию HTTP для аутентификации при каждом запросе, либо простой HTTP или HTTPS.

Это означает, что каждый запрос теперь принимают вид:

https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/

2) Используйте такой подход, как Amazon S3 с закрытым и открытым ключом: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

3) в любом случае используйте cookie и разбейте часть без состояния REST.

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

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

EDIT: я думаю, я должен был также упомянуть OAuth.

3 73

3 ответа:

изменить 5 лет

Используйте OAuth2!

предыдущие версии

нет, нет абсолютно никакой необходимости использовать куки. Это не так безопасно, как HTTP Digest, OAuth или AWS Amazon (который не трудно скопировать).

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

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

куки-это зло, прекратите их использовать.

Не беспокойтесь о том, чтобы быть" спокойным", беспокоиться о безопасности. Вот как я это делаю:

Шаг 1: пользователь попадает в службу аутентификации с учетными данными.

Шаг 2:Если учетные данные проверяются, верните отпечаток пальца, идентификатор сеанса и т. д... и поместите их в общую память для быстрого извлечения позже или используйте базу данных, если вы не возражаете добавить несколько миллисекунд к времени выполнения веб-службы.

Шаг 3: Добавьте вызов точки входа в верхнюю часть каждой веб-службы скрипт, который проверяет отпечаток пальца и идентификатор сеанса для каждый запрос веб-службы.

Шаг 4: Если отпечаток пальца и идентификатор сеанса недействительны или истекли сроки перенаправления на аутентификацию.

ПРОЧИТАЙТЕ ЭТО:

RESTful Authentication

редактировать 3 лет

Я полностью согласен с Эвертом, используйте OAuth2 С HTTPS,и не изобретайте велосипед! : -)

более простые API REST-не предназначены для сторонних клиентов -JSON Web Tokens может быть хорошо, как хорошо.

предыдущие версии

в любом случае использовать файлы "cookie" и сломать часть отдыха без гражданства.

Не используйте сеансы, с сеансами вашего Служба REST не будет хорошо масштабируемой... Здесь есть 2 состояния: состояние приложения (или состояние клиента или сеанса) и состояние ресурса. Состояние приложения содержит данные сеанса и поддерживается клиентом REST. Состояние ресурса содержит свойства и отношения ресурса и поддерживается службой REST. Вы можете очень легко решить, является ли конкретная переменная частью состояния приложения или состояния ресурса. Если объем данных увеличивается с увеличением количества активных сеансов, тогда он принадлежит государству приложения. Так, например, идентификатор пользователя в текущем сеансе принадлежит состоянию приложения, но список пользователей или разрешений пользователя принадлежит состоянию ресурса.

  • если вы пишете клиентский клиент REST, то это можно сделать с помощью SSL + HTTP auth. В этом случае вы можете создать credentials -> (identity, permissions) кэш на сервере, чтобы сделать проверку подлинности быстрее. Имейте это в виду, если вы очистите этот кэш, и пользователи отправят тот же запрос, они получат тот же ответ, просто это займет немного больше времени. Вы можете сравнить это с сеансами: если вы очистите хранилище сеансов, то пользователи получат status: 401 unauthorized ответ...
  • если вы пишете клиент REST на стороне сервера и отправляете идентификационные факторы в службу REST через curl, то у вас есть 2 варианта. Вы можете использовать HTTP аутентификации, а также, или вы можете использовать диспетчер сеанса в вашем клиенте, а не в служении остальным.
  • если кто-то ненадежные пишет ваш клиент REST, затем вы должны написать приложение для проверки подлинности пользователей и предоставить им доступность, чтобы решить, хотят ли они предоставлять разрешения другим клиентам или нет. OAuth-это уже существующее решение. Oauth1 более безопасен, oauth2 менее безопасен, но проще, и я думаю, что есть несколько других решений для этой проблемы... Тебе не нужно ничего изобретать. Существуют полные решения для аутентификации и авторизации с использованием oauth, например: WSO identity server.

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