Я создаю PHP REST API, который будет использоваться от клиента JavaScript, и у меня есть некоторые проблемы, которые определяют, как реализовать авторизацию и доступную сторону вещей. Будет несколько приложений, которые будут использовать библиотеку JavaScript, которую я буду разрабатывать, чтобы говорить и взаимодействовать с моим приложением. Я буду предоставлять ключи API каждому из них, так что это не проблема.
Когда я начинаю запутываться, так это то, как пользователи на этих сайтах аутентифицируются в моем приложении. Похоже, что плохая идея заключается в том, чтобы этот внешний сайт хранил информацию о моем аккаунте и пароле пользователя; поэтому, я думаю, мне нужно, чтобы моя библиотека JavaScript включала виджет входа, который запрашивает информацию об учетной записи пользователя для моего приложения.
Если аутентификация прошла успешно, поскольку я работаю с REST API, мне нужно будет сохранить токен, полученный в cookie на стороне клиента, или что-то еще, чтобы пользователю не нужно было снова войти в мое приложение на каждой странице внешний сайт. Однако, что произойдет, если пользователь выходит из внешнего сайта, а затем другой пользователь входит в тот же браузер? Что касается моей библиотеки JavaScript, старый пользователь все равно будет войти в мое приложение, потому что cookie / токен еще не истек – как я могу очистить свой файл cookie, когда заканчивается сеанс предыдущего пользователя? Или я совершенно не прав, здесь?
Итак, я думаю, что процесс будет примерно таким:
var token; // Some hashed string containing an expiration date and user id var apiKey = '123abc'; // Read the cookie and check if it already contains the token token = readCookie('token'); if (token == '') { // get username and password from user through some prompt var request_data = {apiKey: apiKey, user: username, pass: password}; $.post('https://service.com/api/user/login', request_data, function(data) { token = data; document.cookie = "token=" + token; }); } ... var get_data = {apiKey: apiKey, token: token}; $.get('http://service.com/api/<object>', get_data, function(data) { // Do something with data });
Извините, здесь есть несколько вопросов. Я предполагаю, что главное – сохранить ли ящик в cookie, как я могу убедиться, что он очищается, когда пользователь выходит из внешнего приложения? Или, если я не должен хранить его в файле cookie, как я могу информировать клиента о состоянии пользователя?
Я предлагаю вам прочитать это очень хорошее сообщение в блоге о защите RESTful API.
(В случае, если эта ссылка не работает – она уже прошла один раз и должна быть извлечена из archive.org. Я нашел, что это выглядит как PDF-рендеринг этой страницы, доступный здесь: https: //www.ida. liu.se/~TDDD97/labs/hmacarticle.pdf .)
Примечание: мой ответ не соответствует теме, потому что решение, представленное выше в блоге, не защищено от клиента Javascript. Фактически, в основном это объясняется тем, как обеспечить защиту REST API на стороне сервера.
«Когда я начинаю запутываться, так это то, как пользователи на этих сайтах аутентифицируются в моем приложении. Похоже, что плохая идея заключается в том, чтобы этот внешний сайт хранил информацию о моем пользователе и пароле»; –
С помощью API REST лучшим способом справиться с этим является использование ваших клиентов (веб-страниц, мобильных приложений), контролируемых вашим доменом или внешним, через учетные данные пользователя, введенные пользователем (на странице входа). У вас будет API входа / выхода, который будет проверять подлинность.
Когда аутентификатор входа в систему аутентифицируется, он возвращает токен (односторонний хэш, возможно, пользовательских настроек любого), который может храниться в зашифрованном файле cookie на стороне клиента. Таким образом, ваши клиенты никогда не будут обрабатывать учетные данные пользователя напрямую. Срок действия маркера истекает, когда вы хотите.
Для всех последующих вызовов REST API ваши клиенты будут отправлять этот токен вместе с запросом API (который отличается от API входа / выхода из системы). Возможно, API может проверить локальный кеш (на сервере REST), чтобы убедиться, что это действительный токен. Если найдено, соблюдает запрос. В противном случае выдается ошибка.
Если пользователь выходит из системы до истечения срока действия маркера, API входа / выхода из системы удалит этот токен из локального кеша, и вашим клиентам необходимо будет удалить сеанс / файл cookie.
Таким образом, ваши учетные данные никогда не передаются на стороне клиента.
И, конечно же, безопасность данных в движении также должна достигаться с помощью SSL и HTTP Digest.
Если это частный API (у вас есть таблица пользователей), переходящий междоменный домен с другого имени хоста на ваше собственное имя хоста, я согласен с вышеизложенным и предлагаю простой (SSL) вход / выход из системы, с которого вы можете дать пользователю (или забрать) cookies из вашего домена.
Если это общедоступный API (любой может получить ключ API, например), я бы предложил использовать метод в блоге из ответа выше.
Для клиента JavaScript попробуйте https://github.com/jpillora/jquery.rest, если что-то не хватает, отправьте запрос функции или внесите свой вклад, если вам нравится 🙂