2016-02-09 3 views
5

В настоящее время я пишу приложение командной строки NodeJS. Приложение выполняет вызов API и возвращает некоторые данные пользователю. Учитывая, что это общедоступный API, пользователю требуется токен API. Этот CLI будет установлен глобально на машине пользователя через npm i -g super-cool-api-cli.Безопасное хранение данных в приложении CLI узла

При первом запуске CLI им предлагается токен, а затем я храню его так, что каждый последующий раз, когда он запускается, им не нужно его вводить. Я предоставил пользователю способ перезагрузите его. Я храню его в актуальном каталоге моего модуля CLI, который, как указано установлен во всем мире, и это выглядит примерно так:

fs.writeFile(__dirname+'/.token.json', JSON.stringify({ "token": token }, null, 2), 'utf8', (e)=>{ 
    // error handling and whatever 
}); 

I Название файла .token.json, используя точку, по крайней мере, сделать файл скрытым по умолчанию.

Я предполагаю, что я спрашиваю, есть ли более безопасный способ хранения конфиденциальной информации в приложении командной строки NodeJS, который вы будете запускать более одного раза. Я думал об использовании таких вещей, как environment variables, но они, похоже, истекают в конце процесса.

Вопросы безопасности - это навык, который мне не хватает, но очень хочу узнать больше, поэтому заблаговременно за ваши советы.

+0

Мне нужно сделать то же, что и вы, с помощью моего приложения CLI для узла. Я заметил, что вы не приняли никакого ответа, что вы в итоге сделали? Благодаря! –

+0

@JoshPinter Мы закончили использование модуля под названием [buttercup] (https://buttercup.pw/) для хранения данных за паролем. [Было мало споров] (https://github.com/himynameisdave/git-labelmaker/issues/14) об этом, потому что это просто казалось простым. Проект [здесь] (https://github.com/himynameisdave/git-labelmaker) и имеет много активных пользователей, поэтому это решение, похоже, хорошо сработало для нас :) –

+0

Интересно ... спасибо за ответный ответ ! Buttercup выглядит как приятная замена 1Password. Не думал об использовании его ядра для хранения паролей. Ура! –

ответ

1

Вы можете сохранить свой маркер в SQLite, а также установить имя пользователя/пароль для файла sqlite.db, вот привязок для SQLite https://github.com/mapbox/node-sqlite3

+0

Итак, мне все еще нужно, чтобы пользователь на локальном компьютере обладал конфиденциальным именем пользователя/паролем? Мне жаль, что я, как правило, парень-фронтмен, поэтому этот материал DB/security немного над моей головой ... –

+0

@DaveLunny не беспокоится. Да, вам все равно потребуется, чтобы пользователь вводил имя пользователя и пароль, но сохраненный токен будет безопасным и зашифрованным в файловой системе (что я считал проблемой безопасности). Для CLI вы можете закодировать кеш для каждого сеанса (в памяти, а не в файловой системе) имени пользователя/пароля, чтобы пользователь мог только ввести имя пользователя и пароль один раз за сеанс (в окне CLI/terminal). То есть, пользователю нужно будет только ввести имя пользователя и пароль при первом открытии терминала и запустить приложение CLI. –

+0

Хм, это очень хорошо, но мне не очень нравится, что он хранится только для сеанса. Это сделает его менее удобным для пользователя, но, очевидно, это решит проблему незашифрованного токена, который будет храниться в виде файла JSON, и помнить, что комбинация имени пользователя и пароля все же лучше запоминания/копирования + вставки цельного маркера каждый раз. Будем больше смотреть в это решение, спасибо! –

4

Я думаю, что лучше использовать учетные хранилища, предоставляемые ОС для такого рода вещей, предполагая, конечно, что каждый пользователь имеет свою собственную учетную запись на машине. Единственный пакет NPM, который я знаю, обрабатывает node-keytar.

+0

Звучит довольно законно на самом деле, спасибо! Поэтому, по сути, я бы создал новую «службу» в цепочке ключей для моего приложения, где я могу сохранить токен в качестве пароля? –

+0

Да, это идея. –