#javascript #electron #vue-cli-4
Вопрос:
Я пытаюсь разработать настольное приложение, для которого потребуется выполнить несколько частных вызовов API, аутентифицированных с помощью некоторых секретных ключей.
Ключи создаются для меня внешними поставщиками ИТ — услуг за пределами моей организации-они отвечают за безопасность, поэтому существует несколько ограничений:
- Они сказали, что, несмотря на то, что они уже предприняли шаги со своей стороны для защиты API, и существуют стратегии смягчения последствий, даже если произойдет нарушение, но все же они хотели бы убедиться, что я отношусь к ключам с пониманием безопасности и предпринимаю все возможные шаги с моей стороны, чтобы убедиться, что они остаются защищенными.
- Мне не разрешается просто создавать случайное промежуточное программное обеспечение / шлюз на частном сервере или бессерверной платформе для выполнения вызовов API от имени моего приложения, поскольку эти вызовы могут содержать бизнес-данные.
Я провел некоторое исследование, и из того, что я могу найти, общая рекомендация состоит в том, чтобы создать файл «.env» в папке проекта и использовать переменные среды в этом файле для хранения ключей API.
Но, прочитав документацию Vue CLI, я обнаружил следующее:
предупреждение
Не храните никаких секретов (таких как личные ключи API) в своем приложении!
Переменные среды встроены в сборку, что означает, что любой может просмотреть их, проверив файлы вашего приложения.
Итак, учитывая ограничения, есть ли способ безопасно хранить эти ключи в проекте настольного приложения Vue CLI 4 Electron?
Спасибо.
Ответ №1:
В целом, особенно если у вас много переменных среды, было бы лучше хранить переменные среды в файле dot env (.env), однако возможно, что этот файл может быть утечен при упаковке приложения electron. Таким образом, в этом случае было бы лучше хранить переменные среды из терминала/командной строки. Для этого следуйте этому руководству (https://www.electronjs.org/docs/api/environment-variables).
Имейте в виду, что все, что требует ключа API/личной информации, старайтесь хранить в бэкэнде, то есть в электронном процессе, и отправляйте результаты на интерфейс Vue.
Вот пример того, как вы могли бы это реализовать:
В Windows из CMD:
set SOME_SECRET="a cool secret"
На POSIX:
$ export SOME_SECRET="a cool secret"
Основной процесс:
// Other electron logic
const { ipcMain } = require("electron");
// Listen for an event sent from the client to do something with the secret
ipcMain.on("doSomethingOnTheBackend", (event, data) => {
API.post("https://example.com/some/api/endpoint", {token: process.env.SOME_SECRET, data});
});
Сторона клиента:
const { ipcRenderer } = require("electron");
ipcRenderer.send("doSomethingOnTheBackend", {username: "test", password: "some password"});
Также обратите внимание, что для использования ipcRenderer на стороне клиента nodeIntegration
необходимо включить.
Вот еще несколько ресурсов, которые помогут вам начать работу: