16

Mam aplikację węzła korzystającą z konta usługi firebase. Chciałbym wdrożyć aplikację na Heroku, ale nie chcę, aby moje tajne klucze były publiczne. Wdrażam bezpośrednio z publicznego repozytorium github, więc nie chcę dołączać pliku konta usługi do wdrożenia.Wdrażanie aplikacji Firebase z kontem usługi w Heroku (zmienne środowiskowe z dotenv)

Mogę pobrać plik json konta usługi, ustawić każdą właściwość jako zmienną środowiskową, dodać każdą z tych zmiennych do Heroku i wdrożyć ją. Wszystko działa świetnie (po autoryzowaniu nowej domeny Heroku w mojej aplikacji firebase), ale czy jest lepszy sposób na zrobienie tego? To działa, ale było to trochę kłopotliwe (kopiowanie i wklejanie każdej zmiennej i przenoszenie jej). Czy brakuje mi prostszego sposobu na zrobienie tego?

Oto zmiana, którą wprowadzam. Od tej linii, gdzie jest ciągnięcie poświadczeń z pliku:

admin.initializeApp({ 
    credential: admin.credential.cert('./path/firebase-service-account.json'), 
    databaseURL: "https://my-firebase-app.firebaseio.com" 
}); 

do tego obiektu, który przynosi w wszystkie te same rzeczy od zmiennych środowiskowych:

admin.initializeApp({ 
    credential: admin.credential.cert({ 
    "type": process.env.FIREBASE_TYPE, 
    "project_id": process.env.FIREBASE_PROJECT_ID, 
    "private_key_id": process.env.FIREBASE_PRIVATE_KEY_ID, 
    "private_key": process.env.FIREBASE_PRIVATE_KEY, 
    "client_email": process.env.FIREBASE_CLIENT_EMAIL, 
    "client_id": process.env.FIREBASE_CLIENT_ID, 
    "auth_uri": process.env.FIREBASE_AUTH_URI, 
    "token_uri": process.env.FIREBASE_TOKEN_URI, 
    "auth_provider_x509_cert_url": process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URL, 
    "client_x509_cert_url": process.env.FIREBASE_CLIENT_X509_CERT_URL 
    }), 
    databaseURL: "https://my-firebase-app.firebaseio.com" 
}); 

Czy to jest najlepsze praktyki dla wdrażania aplikacja firebase z kontem serwisowym na Heroku? Do tego celu używam modułu węzła dotenv.

+1

process.env.FIREBASE_CLIENT_x509_CERT_URL - Myślę, że "X" powinien być pisany wielkimi literami – Casey

+0

Tak! Dokonałem edycji. Doceniam, że robisz ten połów. Nadal szukam wskazówek dotyczących najlepszej praktyki. –

Odpowiedz

20

Istnieją dwa obowiązkowe pola dla obiektu opcji certyfikatów: clientEmail i privateKey. Twój przykład można przyciąć do:

admin.initializeApp({ 
    credential: admin.credential.cert({ 
    "private_key": process.env.FIREBASE_PRIVATE_KEY, 
    "client_email": process.env.FIREBASE_CLIENT_EMAIL, 
    }), 
    databaseURL: "https://my-firebase-app.firebaseio.com" 
}); 

Jako bok, niektóre środowiska może mieć problemy z nowymi liniami w private_key env var; Znalazłem key.replace(/\\n/g, '\n') jako proste rozwiązanie.

+0

Dziękujemy! Czy jest jakiś powód, dla którego powinienem go odciąć, oprócz ułatwienia sobie życia? –

+1

Nie, że znam; wystarczy ograniczenie liczby zmiennych do zarządzania. –

+1

Można również base64 zaszyfrować obiekt json, a następnie 'JSON.parse (nowy bufor (process.env.FIREBASE_SERVICE_ACCOUNT_BASE64, 'base64'))) – PaulRBerg

Powiązane problemy