У меня есть многострочный закрытый ключ в файле 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 не работает, предположительно, потому что она многострочная.
Есть ли способ обойти это?
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать 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?
Похоже, что вы добавили строку за пределы области применения - я обновил, чтобы более точно соответствовать вашему вопросу.
Та же ошибка, к сожалению. Кажется, я не могу использовать .replace для process.env
Странно - у меня сработало. Можете ли вы проверить с помощью отладчика, что GATSBY_GOOGLE_PRIVATE_KEY определенно имеет назначенную ему строку?
Вставьте в файл 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'
});
Спасибо! На самом деле у меня это уже было, но путь был неправильным. Я не уверен, почему другие работали, а это не так, но исправление пути решило проблему.
Оказывается, путь к моему .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. Вы можете объяснить?
@yogescicak отредактируйте значение, чтобы оно оставалось в одной строке.
У меня похожие проблемы, когда мне приходится читать содержимое файла .pem. У меня сработал следующий подход.
Решение, которое сработало для меня - Кодирование закрытого ключа в базе 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 ключа.
.env.PRIVATE_KEY = 'akgjhakdgjhasgf'
const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.
Похоже, в приведенном выше коде был лишний
{и отсутствовал,. Я исправил это, но я не уверен, что в вашей исходной версии такая же ошибка?