Использование закрытого ключа в файле .env

У меня есть многострочный закрытый ключ в файле gatsby .env:

GATSBY_GOOGLE_CLIENT_ID = "12345"
GATSBY_GOOGLE_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\nflkdflkdf...\n-----END PRIVATE KEY-----"

В моем файле gatsby-config у меня есть:

module.exports = {
    resolve: 'gatsby-source-google-sheets',
    options: {
        credentials: {
            "type": "service_account",
            "private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY,
            "client_id": process.env.GATSBY_GOOGLE_CLIENT_ID
        }
    }
}

client_id работает нормально, потому что это всего лишь однострочная строка, но private_key не работает, предположительно, потому что она многострочная.

Есть ли способ обойти это?

Спасибо

Похоже, в приведенном выше коде был лишний { и отсутствовал ,. Я исправил это, но я не уверен, что в вашей исходной версии такая же ошибка?

John Sibly 02.04.2019 10:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
20
1
21 616
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Вы можете использовать string.replace с регулярным выражением, как показано ниже, чтобы снова экранировать символы \n:

"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),

Я получаю: Cannot read property 'replace' of undefined: const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'); module.exports = {...} Может быть, что-то связано с объявлением const вне module.exports?

mckeever02 01.04.2019 18:52

Похоже, что вы добавили строку за пределы области применения - я обновил, чтобы более точно соответствовать вашему вопросу.

John Sibly 01.04.2019 23:44

Та же ошибка, к сожалению. Кажется, я не могу использовать .replace для process.env

mckeever02 01.04.2019 23:53

Странно - у меня сработало. Можете ли вы проверить с помощью отладчика, что GATSBY_GOOGLE_PRIVATE_KEY определенно имеет назначенную ему строку?

John Sibly 02.04.2019 10:28

Вставьте в файл pem, а затем замените его на свой .env с заменами.

echo "export test_key=\"`sed -E 's/$/\\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env

Вам нужно будет загрузить переменные env в gatsby. Самый простой способ — использовать dotenv:

Настраивать:

yarn add -D dotenv # or npm install -D dotenv

Затем в вашем gatsby-config.js:

require('dotenv').config();

module.exports = {
  plugins: [ ... ]
}

Если имя вашего файла отличается от .env или вы храните его в другом месте, вы можете указать путь:

require('dotenv').config({
  path: 'path/to/env/file'
});

Спасибо! На самом деле у меня это уже было, но путь был неправильным. Я не уверен, почему другие работали, а это не так, но исправление пути решило проблему.

mckeever02 02.04.2019 12:19

Оказывается, путь к моему .env был неправильным. По какой-то причине другие ключи работали, а закрытый ключ - нет.

Правильная установка:

require("dotenv").config({
    path: `./.env.${process.env.NODE_ENV}`,
});
const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n');

module.exports = {
    resolve: 'gatsby-source-google-sheets',
    options: {
        credentials: {
            "private_key": private_key,
        }
    }
}

Я добавляю ручной подход, который сработал для меня. Шаг 1:

echo "PRIVATE_KEY=\"`sed -E 's/$/\\\n/g' my_rsa_2048_priv.pem`\"" >> .env

Ваш ключ в файле .env будет выглядеть примерно так:

PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"

Шаг 2. Печать значения process.env.PRIVATE_KEY в вашем коде покажет только первую строку: -----BEGIN RSA PRIVATE KEY-----\n. Чтобы это исправить, измените переменную в .env на одну строку. Так:

PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"

Теперь process.env.PRIVATE_KEY будет выводиться правильно.

Я могу прочитать закрытый ключ и экспортировать его в файл env. Но я не понимаю, о чем шаг 2. Вы можете объяснить?

yoges nsamy 04.02.2021 04:20

@yogescicak отредактируйте значение, чтобы оно оставалось в одной строке.

Marcelo Fonseca 04.02.2021 18:56

У меня похожие проблемы, когда мне приходится читать содержимое файла .pem. У меня сработал следующий подход.

  • Преобразуйте содержимое .pem в формат base64.
  • Поместите преобразованное содержимое base64 (это будет однострочная строка) в файл .env.
  • Теперь декодируйте переменную env в исходное содержимое.

Решение, которое сработало для меня - Кодирование закрытого ключа в базе 64

Шаг 1 — конвертировать ключ в Base 64

// Run this code in a JS file on your Dev Machine.
const privateKey= `-----BEGIN PRIVATE KEY-----\nMIIEvSomeMoreCharacterHererplw==\n-----END PRIVATE KEY-----\n`
const buff = Buffer.from(privateKey).toString('base64');
console.info(buff);

Примечание. Вам не нужно коммитить/включать приведенный выше код в свой проект. Это просто для генерации строки base64 ключа.

Шаг 2. Скопируйте данные журнала консоли в файл .env.

PRIVATE_KEY = 'akgjhakdgjhasgf'

Шаг 3 - Использование ключа в коде

const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.

Другие вопросы по теме