Как сохранить учетные данные для аутентификации REST API - PullRequest
0 голосов
/ 12 апреля 2020

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

Текущая ситуация

У меня есть веб-приложение с JavaScript внешним интерфейсом (vue . js) и серверная часть Python (flask).
Для аутентификации я реализовал сеанс, который хранится с использованием http-only cook ie на клиенте (состояние сеанса сохраняется на стороне сервера, повар ie - это просто подписанный уникальный ключ).
Для форм я реализовал CSRF защита по руководству ow asp . Я знаю, что вам не следует изобретать велосипед, особенно когда речь идет о безопасности, однако мне не понравились детали реализации существующих решений для flask. Мое решение основано на передовом опыте и существующих flask расширениях, и я планирую открыть его.

Проблема

В дополнение к данным форм я также реализую REST API .
Поскольку REST API по своей природе не имеет состояния , я бы предпочел не использовать сеанс и сеанс Cook * ie для аутентификации. Вместо этого я хотел бы использовать HTTP-заголовок Authentication для предоставления учетных данных или токена API. Это также уменьшит риск CSRF-атаки, так как для аутентификации не используется cook ie.
Однако, если я сейчас решу использовать заголовок Authentication, мне придется хранить учетные данные (в любой форме ) на стороне клиента, поскольку я не хочу, чтобы пользователь предоставлял учетные данные при каждом запросе.
Однако хранение учетных данных на стороне клиента сделало бы меня уязвимым для XSS атаки. Но давайте будем честными, если речь идет об уязвимости XSS , защита CSRF, вероятно, бесполезна, поскольку у злоумышленника есть возможность запустить любой JavaScript на моем веб-сайте.

Существует так много способов хранения учетных данных. Или как повар ie или внутри HTML5 хранилища. Я мог бы использовать JWT или просто простой токен. И есть так много руководств, которые научат вас, как их хранить. Однако я не удовлетворен решениями, так как меня беспокоит XSS при их хранении на клиенте - с другой стороны, я хочу избежать использования токенов CSRF и файлов cookie сеанса в API.

Другой вопрос как получить токен аутентификации. Это должно быть сделано во время входа в систему (например, путем реализации чего-то вроде OpenID Connect или OAuth).

Буду признателен, если кто-нибудь поделится со мной своими знаниями, опытом и лучшими практиками. Я не ищу подробные подробности реализации (например, использовать ли JWT или обычные токены и т. Д. c.), А скорее для общего совета, если это имеет смысл.

...