Вопрос
Я хотел бы хранить секретный ключ API для googleapis в безопасном месте. Когда я сохраняю секретный ключ API из googleapis в качестве переменной среды Firebase, private_key
не обрабатывается так же, как когда я require("./privatekey.json");
см. проблему ниже:
Контекст
Я скачал и расшифровал секретный ключ API от Google. В большинстве примеров показано сохранение декодированного файла JSON в пути к проекту. и используя require
, чтобы вставить токен в код.
const SERVICE_ACCOUNT_KEY_FILE = require("./privatekey.json"); <----- This is Bad!!
const SERVICE_ACCOUNT_EMAIL = '[email protected]';
const jwt = new googleapis.auth.JWT(
SERVICE_ACCOUNT_EMAIL,
SERVICE_ACCOUNT_KEY_FILE.private_key,
null,
['https://www.googleapis.com/auth/analytics.readonly']);
Я использовал переменные окружения Firebase от firebase-cli
до firebase functions:config:set
. После завершения и повторного развертывания я запускаю firebase functions:config:get
и вижу:
"googleapi_credentials": {
"private_key": "-----BEGIN PRIVATE KEY-----\\nMIIE ... q0DEg==\\n-----END PRIVATE KEY-----\\n",
Проблема
При настройке googleapis.auth.JWT()
мне нужно предоставить секретный ключ API googleapis. Когда я использую require
для извлечения секретного ключа API, запросы работают.
Однако если я попытаюсь получить доступ к переменной среды Firebase для предоставления секретного ключа API запросы не выполняются.
var jwt = new googleapis.auth.JWT(
functions.config().googleapi_credentials.client_email,
functions.config().googleapi_credentials.private_key, <----- NOPE!
null,
['https://www.googleapis.com/auth/analytics.readonly']);
Отлаживать
Чтобы увидеть, в чем разница, я сравнил console.log()
двух токенов в представлении журнала функций Firebase. Токен, который я сохранил в файле JSON и в переменных среды Firebase, выглядит одинаково в коде, то есть обе строки совпадают и содержат много \n
(разрывов строк).
Теперь, когда я просматриваю, что возвращает console.log()
в журналах функций Firebase, я вижу разные токены.
console.log("JSON Private.Key", privatekey.private_key)
представление в журналах возвращает отформатированную строку, в которой все \n
заменены разрывами строк, и токен принимается.
console.log("Private.Key", functions.config().googleapi_credentials.private_key)
Журналы возвращают сообщение, в котором все \n
заменяются на \\n
, а токен не принимается.
Заключительное примечание
Функция googleapis.auth.JWT()
может принимать объект в качестве аргументов? Нужно ли учитывать это при использовании переменных среды Firebase?
googleapis.auth.JWT()
. - person Chadd   schedule 12.04.2018