2017-06-05 28 views
2

我試圖將一個Express應用程序部署到Heroku。我遇到的麻煩是Heroku或者其他一些事情正在搞砸RSA私鑰字符串的格式。我在.env其中本地工作,並保持了混帳的以下內容:無法將RSA私鑰設置爲配置var

TYPE= 
PROJECT_ID= 
PRIVATE_KEY_ID= 
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n" 
CLIENT_EMAIL= 
CLIENT_ID= 
AUTH_URI= 
TOKEN_URI= 
AUTH_CERT_URL= 
CLIENT_CERT_URL= 

我最初使用https://github.com/xavdid/heroku-config設置上述瓦爾通過在Heroku上的儀表盤做手工來代替,但私有密鑰失敗。

然後我嘗試通過複製/粘貼(不帶雙引號)通過Heroku儀表板手動設置該值,但仍然失敗。

最後,我通過heroku config:set設置了該值,但在應用程序啓動時仍然無法解析該值。

我甚至嘗試用'\n'替換\n,因爲有人做了here,並且使用引號與heroku config:set PRIVATE_KEY="",但仍然不起作用。

所以我的問題是,Heroku是否做了一些長字符串值的時髦?或者我錯過了什麼。上述數值稱爲/使用,如下圖所示:

const { credential } = require('firebase-admin') 

exports.serviceAccount = { 
    type: process.env.TYPE, 
    project_id: process.env.PROJECT_ID, 
    private_key_id: process.env.PRIVATE_KEY_ID, 
    private_key: process.env.PRIVATE_KEY, 
    client_email: process.env.CLIENT_EMAIL, 
    client_id: process.env.CLIENT_ID, 
    auth_uri: process.env.AUTH_URI, 
    token_uri: process.env.TOKEN_URI, 
    auth_provider_x509_cert_url: process.env.AUTH_CERT_URL, 
    client_x509_cert_url: process.env.CLIENT_CERT_URL 
} 

exports.credential = credential.cert(exports.serviceAccount) 

exports.databaseURL = process.env.DATABASE_URL 

exports.adminConfig = { 
    credential: exports.credential, 
    databaseURL: exports.databaseURL 
} 

和日誌從Heroku的:

2017-06-05T01:50:13.761150+00:00 app[web.1]: > NODE_ENV=production node ./server/server.prod.js 
2017-06-05T01:50:14.231853+00:00 app[web.1]: /app/node_modules/firebase-admin/lib/auth/credential.js:129 
2017-06-05T01:50:14.231876+00:00 app[web.1]:    throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, 'Failed to parse private key: ' + error); 
2017-06-05T01:50:14.231877+00:00 app[web.1]:   ^
2017-06-05T01:50:14.231878+00:00 app[web.1]: 
2017-06-05T01:50:14.231878+00:00 app[web.1]: Error: Failed to parse private key: Error: Invalid PEM formatted message. 
2017-06-05T01:50:14.231883+00:00 app[web.1]:  at FirebaseAppError.FirebaseError [as constructor] (/app/node_modules/firebase-admin/lib/utils/error.js:39:28) 
2017-06-05T01:50:14.231884+00:00 app[web.1]:  at new FirebaseAppError (/app/node_modules/firebase-admin/lib/utils/error.js:84:23) 
2017-06-05T01:50:14.231885+00:00 app[web.1]:  at new Certificate (/app/node_modules/firebase-admin/lib/auth/credential.js:129:19) 
2017-06-05T01:50:14.231886+00:00 app[web.1]:  at new CertCredential (/app/node_modules/firebase-admin/lib/auth/credential.js:195:33) 
2017-06-05T01:50:14.231887+00:00 app[web.1]:  at Object.cert (/app/node_modules/firebase-admin/lib/firebase-namespace.js:189:58) 
2017-06-05T01:50:14.231887+00:00 app[web.1]:  at Object.<anonymous> (/app/server/firebase/index.js:16:33) 
2017-06-05T01:50:14.231888+00:00 app[web.1]:  at Module._compile (module.js:569:30) 
2017-06-05T01:50:14.231888+00:00 app[web.1]:  at Object.Module._extensions..js (module.js:580:10) 
2017-06-05T01:50:14.231889+00:00 app[web.1]:  at Module.load (module.js:503:32) 
2017-06-05T01:50:14.231889+00:00 app[web.1]:  at tryModuleLoad (module.js:466:12) 

回答

10

我能夠使用評論建議,我發現here解決我的問題。

因此,對Heroku的儀表盤的應用程序,我設置了PRIVATE_KEY值被雙引號:

private key screenshot

我再改

private_key: process.env.PRIVATE_KEY

private_key: JSON.parse(process.env.PRIVATE_KEY)

最後通過git push heroku master重新部署,應用程序啓動正常。

+0

我在OpenShift也有同樣的問題,你的解決方案工作!非常感謝! – drishit96

+0

在AWS Lambda上也有竅門。謝謝! –