Firebaseapperror: не удалось проанализировать закрытый ключ: ошибка: неверное сообщение в формате pem

#node.js #parsing #environment-variables #firebase-admin #multiline

#node.js #синтаксический анализ #переменные среды #firebase-администратор #многострочный

Вопрос:

Я получил эту ошибку firebaseapperror: failed to parse private key: error: invalid pem formatted message , когда я отправил свое приложение nodejs в heroku.

Все мои переменные среды были установлены следующим образом

 # .env file
    
project_id=project_id
private_key='-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----n'
client_email=client_email
 

И получил к ним доступ вот так:

 export const sa = {
    privateKey: process.env.private_key,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};
 

На моем локальном компьютере все работало нормально, но на производстве (heroku) Я получил ошибку, упомянутую выше. Закрытый ключ является многострочной переменной среды, и его невозможно проанализировать.

Пожалуйста, как мне это исправить?

Ответ №1:

Исправление

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

Следуйте инструкциям, и вы также должны это исправить.

Краткое изложение сообщения таково:

Сохраните длинный многострочный ключ в виде строки json следующим образом:

 # .env file

project_id=project_id
private_key='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----n"}'
client_email=client_email
 

Затем проанализируйте его и разрушьте ключ следующим образом:

 const { privateKey } = JSON.parse(process.env.private_key);

export const sa = {
    privateKey,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};
 

Это будет работать на локальном, но на производстве (heroku) вы получите ошибку синтаксического анализа из-за одинарной кавычки до и после того самого ключа, о котором идет речь. Поэтому удалите одинарные кавычки до и после ключа в вашей рабочей переменной env. Я также попробовал без одинарной кавычки на локальном, и это сработало.

Дополнительная выгода

Дополнительное преимущество этого метода

Исходя из этого, вы даже можете сохранить все переменные среды как один объект следующим образом

 # .env file

sa='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----n", "clientEmail": "client_email", "projectId": "project_id"}'
 

Затем получите к нему доступ следующим образом:

 export const sa = JSON.parse(process.env.sa);
 

Вот и все.

Напоминание: помните, что я сказал об одинарных кавычках!

Комментарии:

1. Также ознакомьтесь с тем, как сохранить длинный многострочный закрытый ключ в переменной среды