Firebase FCM sendAll()私钥错误:错误:0909006C:PEM例程:get_name:没有起始行



此错误消息基于其在SO中的频繁出现,似乎是对许多错误的一般响应。我正在尝试从Nestjs微服务后端执行FCM sendAll(…(。我在缅因州启动了这个防火基地

.......
......
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.TCP,
options,
}
);
const configService: ConfigService = app.get(ConfigService);

const adminConfig: ServiceAccount = {
"projectId": configService.get<string>('FIREBASE_PROJECT_ID'),
"privateKey": configService.get<string>('FIREBASE_PRIVATE_KEY')
.replace(/\n/g, 'n'),
"clientEmail": configService.get<string>('FIREBASE_CLIENT_EMAIL'),
};

firebase.initializeApp({
credential: firebase.credential.cert(adminConfig),
});

await app.listen();  

}
bootstrap();

我的。ENV是这样的:

FIREBASE_PRIVATE_KEY    = "-----BEGIN PRIVATE KEY-----nMI...n-----END PRIVATE KEY-----n",
FIREBASE_CLIENT_EMAIL   = 'abc@my.com',
FIREBASE_PROJECT_ID     = 'xxx-genysis'

显然firebase已经初始化,凭据还可以。如果我替换无效的凭据,我确实会得到一个错误。

然而,当我尝试在notification.service.ts中执行sendAll(…(时,如下所示:

import * as firebase from 'firebase-admin';
......
.....
async  sendNotifications(data) {
const messages = await this.getMessages(data.tokens,data.message,data.title);
const promises = [];
for (let i = 0; i + 10 <= messages.length; i += 10) {
const batch = messages.slice(i, i + 10);
promises.push(firebase.messaging().sendAll(batch));
}
await Promise.all(promises);

}

我得到以下错误:

error:0909006C:PEM routines:get_name:no start line
Error: error:0909006C:PEM routines:get_name:no start line
at Sign.sign (node:internal/crypto/sig:131:29)
at Object.sign (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/jsonwebtoken/node_modules/jwa/index.js:152:45)
at Object.jwsSign [as sign] (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/jsonwebtoken/node_modules/jws/lib/sign-stream.js:32:24)
at Object.module.exports [as sign] (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/jsonwebtoken/sign.js:204:16)
at ServiceAccountCredential.createAuthJwt_ (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/app/credential-internal.js:105:20)
at ServiceAccountCredential.getAccessToken (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/app/credential-internal.js:77:28)
at FirebaseAppInternals.refreshToken (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/app/firebase-app.js:45:49)
at FirebaseAppInternals.getToken (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/app/firebase-app.js:37:25)
at AuthorizedHttpClient.getToken (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/utils/api-request.js:612:34)
at AuthorizedHttpClient.send (/Applications/GenysisBuild/GenysisNest/genysis-notifications/node_modules/firebase-admin/lib/utils/api-request.js:600:21)

根据对错误消息的响应,我似乎有一个错误的private_key,但事实并非如此,因为初始化firebase时使用了相同的私钥。有人能告诉我们这里发生了什么吗?

编辑:sendAll((周围的try/catch错误导致以下错误:

{"library":"PEM routines","function":"get_name","reason":"no start line","code":"ERR_OSSL_PEM_NO_START_LINE"}

Firebase错误消息与您的错误原因相距甚远,导致像我这样的帖子不断出现。

长话短说。使用以下内容让我渡过了难关:在我的.env 中

GOOGLE_APPLICATION_CREDENTIALS=/path/project-key.json

显然,文档中的其他建议仅在特定条件下有效。直接使用PRIVATE_KEY不会在所有情况下都有效,GOOGLE_APPLICATION_CREDENTIALS是一个保留名称。。。你必须使用这个名称。

最新更新