Подтвердить что ты не робот

Авторизация и аутентификация API REST от клиента JavaScript

Я создаю 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, как я могу информировать клиента о состоянии пользователя?

4b9b3361

Ответ 1

Я предлагаю вам прочитать это очень хорошее сообщение в блоге об обеспечении RESTful API.

(В случае, если ссылка не работает — она уже прошла один раз и должна быть извлечена из archive.org — я обнаружил, что это выглядит как PDF-рендеринг этой страницы, доступной здесь: https://www.ida.liu.se/~TDDD97/labs/hmacarticle.pdf.)

Примечание. мой ответ не соответствует теме, потому что решение, представленное выше в блоге, не защищено от клиента Javascript. Фактически, в основном это объясняется тем, как защитить API REST на стороне сервера.

Ответ 2

"Когда я начинаю путаться, так это то, как пользователи на этих сайтах аутентифицируются в моем приложении. Похоже, что плохая идея иметь этот внешний сайт для хранения моей учетной записи пользователя и паролей"; -

С API-интерфейсом REST лучшим способом справиться с этим является использование ваших клиентов (веб-страниц, мобильных приложений), контролируемых вашим доменом или внешним, через учетные данные пользователя, введенные пользователем (на странице входа). У вас будет API входа/выхода, который будет проверять подлинность.

Когда API входа в систему аутентифицируется, он возвращает маркер (один из способов хэша, возможно, пользовательских настроек любого), который может храниться в зашифрованном файле cookie на стороне клиента. Таким образом, ваши клиенты никогда не будут обрабатывать учетные данные пользователя напрямую. Срок действия маркера истекает, когда вы хотите.

Для всех последующих вызовов REST API ваши клиенты будут отправлять этот токен вместе с запросом API (который отличается от API входа/выхода). Возможно, API может проверить локальный кеш (на сервере REST), чтобы убедиться, что это действительный токен. Если найдено, соблюдает запрос. В противном случае выдается ошибка.

Если пользователь выходит из системы до истечения срока годности маркера, API входа/выхода из системы удалит этот токен из локального кеша, и вашим клиентам необходимо будет удалить сеанс/файл cookie.

Таким образом, ваши учетные данные никогда не передаются на стороне клиента.

И, конечно же, безопасность данных в движении также должна достигаться с помощью SSL и HTTP-дайджеста.

Ответ 3

Если это частный API (у вас есть таблица пользователей), переходящий междоменный домен с другого имени хоста на ваше собственное имя хоста, я согласен с вышеизложенным и предлагаю простой (SSL) вход/выход из системы, с которого вы можете дать (или отнять) файлы cookie из вашего домена.

Если это общедоступный API (любой может получить ключ API, например), я бы предложил использовать метод в сообщении в блоге из вышеприведенного ответа.

Для клиента JavaScript попробуйте https://github.com/jpillora/jquery.rest, если что-то не хватает, отправьте запрос функции или внесите вклад, если хотите:)