Я пытаюсь создать REST API для своего следующего проекта. Я думаю, что понимаю большинство концепций, но я немного уверен в безопасности. Очевидно, что безопасность - это единственная вещь, которую вы не хотите ошибаться даже с первого выпуска производственного кода.
Я понимаю, что REST является апатридом, поэтому вместо того, чтобы войти в систему и их сеанс храниться на сервере и перезапускаться каждый раз, когда они делают запрос, они отправляют серверу свой уникальный ключ API, а сервер аутентифицирует их при каждом запросе.
Итак, как пользователь, входящий в систему, выглядит "под капотом"? Это что-то вроде:
Тогда клиент обязан хранить ключ API и отправлять его с каждым запросом. Этот ключ хранится на сервере в базе данных и используется для идентификации пользователя и его разрешений и т.д. По каждому запросу.
Это звучит разумно, но также нарушает истинную безгражданность приложения, потому что для большинства запросов требуется, чтобы начальный запрос "сделайте меня API-ключ" отправлен.
Заранее спасибо за то, что помогли мне разобраться!
API GroupMe, например, использует подход на основе токенов для аутентификации пользователей своего API (это позволяет пользователям их API создавать скрипты для вызова API от их имени).
Чтобы успешно совершать вызовы API, я (как пользователь API) должен был войти в систему и создать приложение, которое предоставило мне токен доступа (см. Изображение).
Этот токен доступа (в случае groupme) - это то, что я должен был включить со всеми запросами, чтобы запрос был успешным. Формат может отличаться в зависимости от того, какой API вы используете, но в случае groupme он выглядит так:
https://api.groupme.com/v3/PAGE_TO_CALL?token=YOUR_ACCESS_TOKEN
Это позволит API GroupMe идентифицировать меня и выполнить любое действие, которое я указал. Этот токен доступа похож на мое имя пользователя и пароль, тот, у кого он есть, сможет делать вызовы API как я, включая любые скрипты, которые я создаю...
Если вы заинтересованы в создании своего собственного REST API, я бы рассмотрел эту статью, в частности последний раздел о создании метода проверки подлинности на токенах, который другие пользователи могли бы использовать для аутентификации с вашим API.
Вот наиболее актуальная выдержка:
Проверка подлинности API
В обычных веб-приложениях обработка аутентификации обычно осуществляется путем принятия имени пользователя и пароля и сохранения идентификатора пользователя в сеансе. Пользовательский браузер сохраняет cookie с идентификатором сеанса. Когда пользователь посещает страницу на сайте, для которой требуется аутентификация, браузер отправляет файл cookie, приложение просматривает сеанс по идентификатору (если он еще не истек), и поскольку идентификатор пользователя был сохранен в сеансе, пользователь разрешено просматривать страницу.
С API, использование сессий для отслеживания пользователей не обязательно является наилучшим подходом. Иногда ваши пользователи могут получить доступ к API напрямую, в то время как пользователь может авторизовать другое приложение для доступа к API от их имени.
Решением этого является использование аутентификации на основе токенов. Пользователь регистрируется со своим именем пользователя и паролем, и приложение отвечает уникальным маркером, который пользователь может использовать для будущих запросов. Этот токен может быть передан в приложение, чтобы пользователь мог отозвать этот токен позже, если они откажутся от этого приложения.
Существует стандартный способ сделать это, что стало очень популярным. Он назывался OAuth. В частности, версия 2 стандарта OAuth. Есть много отличных ресурсов в Интернете для реализации OAuth, поэтому я бы сказал, что выходит за рамки этого урока. Если вы используете Ruby, есть несколько больших библиотек, которые обрабатывают большую часть работы для вас, например OmniAuth.