Хранить пароль в Javascript localStorage - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю надстройку Outlook (которая в основном является iframe, обслуживаемым в клиенте Microsoft Outlook, будь то Windows, Ma c или браузер). Это внутренний инструмент компании, который отправляет данные на наш сервер. Он использует React / JS / Node.

Наши конечные точки используют базовую аутентификацию c, поэтому мне нужно передавать имя пользователя / пароль при каждом запросе.

Проблема в том, что я хотел бы " помните "каждого пользователя, чтобы ему не приходилось вводить учетные данные при каждой загрузке приложения. Я подумал, что могу использовать HTML5 localStorage для сохранения значений имени пользователя / пароля.

Однако мне интересно, насколько это безопасно, и предложения о том, как сохранить копию пароля?

Может быть, сделать кодировку base64 'username: password' (для HTTP-заголовка авторизации) и сохранить ее вместо этого?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Я думаю, что нет безопасного способа сохранить пароль на стороне клиента. Однако у меня есть две рекомендации.

  1. Поскольку вы используете React, у вас нет большого количества обновлений страниц, вы можете запросить пароль на каждой странице refre sh и сохранить его как переменная (очень безопасная).

  2. Если вы хотите сохранить ее, не используйте кодировку base64. Вместо этого подпишите пароль с помощью jwt на клиенте и сохраните подписывающий секрет как переменную конфигурации, затем извлеките файл конфигурации и сверните его. Это затруднит поиск секрета.

0 голосов
/ 20 апреля 2020

Сессионный ключ может быть хорошей альтернативой. Вместо того, чтобы обмениваться парой имя пользователя / пароль, вы можете вместо этого создать сервер для создания сеанса Cook ie, который будет использоваться для аутентификации.

Я не эксперт в этом, но вот один из способов Я бы сделал это, если бы мне пришлось:

  • Клиент должен сгенерировать два ключа: публичный c и закрытый ключ. Сохраните эти ключи в sessionStorage (не localStorage).

  • Когда клиент пытается «пройти аутентификацию» с помощью имени пользователя / пароля, имя пользователя, пароль и секретный ключ должны быть зашифрованы с помощью открытого ключа сервера c сервера и отправлены на сервер.

    Ключ сервера publi c может храниться в localStorage. Найдите способ передать этот ключ клиенту. Может быть, конечная точка, такая как /pub-token?

  • Сервер расшифрует это имя пользователя / пароль и после проверки пары сохранит секретный ключ клиента и сгенерирует сеанс приготовления ie, который отправляется обратно клиенту.

Теперь в последующих запросах клиент зашифровывает любое сообщение, отправляемое на сервер, с помощью ключа publi c и сеанса cook ie будет сопровождать эти запросы.

Сервер будет проверять сессионный повар ie и расшифровывать сообщения, отправленные клиентом, используя секретный ключ клиента.

На стороне сервера вы можете используйте быстрое хранилище значений ключей, такое как redis или memcached, для сопоставления сеансового ключа с секретным ключом клиента.

Когда сервер определяет, что сеанс "закончен", он удаляет сеанс cook ie и клиенту нужно будет снова сгенерировать новую пару ключей (или продолжать использовать ту же самую ...).


Я не уверен, соответствует ли этот поток понятию "ключ сеанса", но я нахожу это более безопасно, чем просто сгенерировать ключ на сервере и использовать только этот ключ в качестве аутентификации.

...