Я создаю REST API, внимательно следуя советам Apigee, используя существительные, а не глаголы, версию API, запеченную в URL, два пути API для каждой коллекции, использование GET POST PUT DELETE и т. Д.
Я работаю над системой входа в систему, но не уверен в правильном способе REST для входа пользователей. Я не работаю над безопасностью на данный момент, просто шаблон входа или поток. (Позже мы будем добавлять 2 шага oAuth с HMAC и т. Д.)
Возможные варианты
- ПОЧТА что-то вроде
https://api...com/v1/login.json
- Положить на что-то вроде
https://api...com/v1/users.json
- Что-то у меня нет, хотя ...
Каков правильный стиль REST для входа в систему пользователей?
api
rest
design-patterns
Скотт Рипнак
источник
источник
Accept
заголовок HTTP.Accept
заголовок, у вас также был быVary: Accept
, поэтому кеширование не пострадает. Conneg в расширении обсуждался ранее ; Я бы согласился с ответом Shonzilla там, хотя.Ответы:
Принципиальное проектирование современной веб-архитектуры Роя Т. Филдинга и Ричарда Н. Тейлора , т. Е. Последовательность работ из всей терминологии REST, содержит определение взаимодействия клиент-сервер:
Это ограничение выполняет четыре функции, 1-я и 3-я важны в данном конкретном случае:
А теперь давайте вернемся к вашему делу безопасности. Каждый запрос должен содержать всю необходимую информацию, и авторизация / аутентификация не является исключением. Как этого добиться? Буквально отправляйте всю необходимую информацию по проводам с каждым запросом.
Одним из примеров того, как это можно заархивировать, является код аутентификации сообщений на основе хэша или HMAC . На практике это означает добавление хеш-кода текущего сообщения к каждому запросу. Хеш-код, рассчитанный с помощью криптографической хеш-функции в сочетании с секретным криптографическим ключом . Криптографическая хеш-функция либо предопределена, либо является частью концепции REST кода по требованию (например, JavaScript). Секретный криптографический ключ должен быть предоставлен сервером клиенту в качестве ресурса, и клиент использует его для вычисления хеш-кода для каждого запроса.
Есть много примеров реализации HMAC , но я бы хотел, чтобы вы обратили внимание на следующие три:
Как это работает на практике
Если клиент знает секретный ключ, он готов работать с ресурсами. В противном случае он будет временно перенаправлен (код состояния 307 Temporary Redirect) для авторизации и получения секретного ключа, а затем перенаправлен обратно на исходный ресурс. В этом случае нет необходимости заранее знать (т. Е. Где-то жестко), какой URL-адрес для авторизации клиента , и можно со временем изменить эту схему.
Надеюсь, что это поможет вам найти правильное решение!
источник
TL; DR Логин для каждого запроса не является обязательным компонентом для реализации безопасности API, аутентификация есть.
Трудно ответить на ваш вопрос о входе в систему, не говоря о безопасности в целом. С некоторыми схемами аутентификации нет традиционного входа в систему.
REST не предписывает никаких правил безопасности, но наиболее распространенной практической реализацией является OAuth с трехсторонней аутентификацией (как вы упомянули в своем вопросе). Сам по себе вход в систему отсутствует, по крайней мере, не для каждого запроса API. При трехсторонней аутентификации вы просто используете токены.
Эта схема дает пользователю возможность аннулировать доступ в любое время. Практически все общедоступные API RESTful, которые я видел, используют OAuth для реализации этого.
Я просто не думаю, что вы должны формулировать свою проблему (и вопрос) с точки зрения входа в систему, а скорее думать о защите API в целом.
Для получения дополнительной информации об аутентификации REST API в целом вы можете обратиться к следующим ресурсам:
источник
Большая часть философии REST заключается в использовании как можно большего количества стандартных функций протокола HTTP при разработке вашего API. Применяя эту философию к аутентификации, клиент и сервер будут использовать стандартные функции HTTP-аутентификации в API.
Экраны входа в систему отлично подходят для случаев использования пользователем: зайдите на экран входа в систему, введите имя пользователя и пароль, установите cookie, клиент предоставляет этот cookie во всех будущих запросах. Нельзя ожидать, что люди, использующие веб-браузеры, будут предоставлять идентификатор пользователя и пароль при каждом отдельном HTTP-запросе.
Но для REST API экран входа в систему и сеансовые куки не являются строго необходимыми, поскольку каждый запрос может включать учетные данные, не влияя на пользователя; и если клиент не сотрудничает в любое время,
401
может быть дан «несанкционированный» ответ. RFC 2617 описывает поддержку аутентификации в HTTP.TLS (HTTPS) также может быть опцией, и он позволит аутентифицировать клиента на сервере (и наоборот) при каждом запросе путем проверки открытого ключа другой стороны. Кроме того, это обеспечивает канал для бонуса. Конечно, обмен парой ключей перед связью необходим для этого. (Обратите внимание, что речь идет именно об идентификации / аутентификации пользователя с помощью TLS. Защита канала с помощью TLS / Diffie-Hellman всегда хорошая идея, даже если вы не идентифицируете пользователя по его открытому ключу.)
Пример: предположим, что токен OAuth - это ваши полные учетные данные для входа. Если у клиента есть токен OAuth, он может быть предоставлен в качестве идентификатора пользователя в стандартной HTTP-аутентификации для каждого запроса. Сервер может проверить токен при первом использовании и кэшировать результат проверки с указанием времени жизни, которое обновляется при каждом запросе. Любой запрос, требующий аутентификации, возвращается,
401
если не предоставлен.источник