Firebase Admin SDK:未获取访问令牌
Firebase Admin SDK: Not fetching access token
目标是让我的快速服务器使用 Firebase 云消息传递 (FCM) 发送推送通知。
问题是admin SDK 的初始化似乎不起作用。
代码是用 JavaScript 编写的,节点版本是 10.16.0,firebase-admin 是版本 8.3.0,服务器是 运行 最新 Ubuntu.
我按照 firebase 指南设置了管理 SDK:
https://firebase.google.com/docs/admin/setup#initialize_the_sdk
已设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,并尝试使用该变量打开文件:
nano $GOOGLE_APPLICATION_CREDENTIALS
一次
admin.messaging().send(message)
被调用,抛出如下错误:
Error sending message: { Error: Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND".
at FirebaseAppError.FirebaseError [as constructor] (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:42:28)
at FirebaseAppError.PrefixedFirebaseError [as constructor] (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:88:28)
at new FirebaseAppError (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:122:28)
at /local/home/user/node_modules/firebase-admin/lib/firebase-app.js:121:23
at process._tickCallback (internal/process/next_tick.js:68:7)
errorInfo:
{ code: 'app/invalid-credential',
message:
'Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND".' },
codePrefix: 'app' }
实施非常严格地遵循 firebase 指南。
类似的问题指向不支持云功能的spark计划。但据我了解,我正在尝试使用云消息而不是云功能。
我不知道哪里出了问题。特别是因为它与指南中的代码非常相似。
除了 firebase-admin,我还需要安装其他一些 firebase 组件吗?
服务器代码:
const express = require('express');
//firebase for notifications
const admin = require('firebase-admin');
admin.initializeApp({
projectId: <projectId>,
credential: admin.credential.applicationDefault(),
databaseURL: "https://<projectId>.firebaseio.com"
});
// server set up removed
io.on('connection', socket => {
socket.on('notification', (target, message) => {
// This log is printed
console.log("got notification for: ", target)
// target = registration token comes from the client FCM SDKs.
if (typeof (target) === "string") {
sendNotifiaction(target, message)
}
});
});
function sendNotifiaction(registrationToken, message) {
// This registration token comes from the client FCM SDKs.
message.token = registrationToken
// Send a message to the device corresponding to the provided
// registration token.
admin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
// Error catched here
console.log('Error sending message:', error);
});
}
服务帐户密钥(文件路径 = $GOOGLE_APPLICATION_CREDENTIALS)。
有些字段明显省略了。
{
"type": "service_account",
"project_id": "..",
"private_key_id": "..",
"private_key": "-----BEGIN PRIVATE KEY-----.."
"client_email": "firebase-adminsdk-.....iam.gserviceaccount.com",
"client_id": "...",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-......iam.gserviceaccount.com"
}
解决方案
我刚刚使用了 firebase 控制台提供的代码示例(设置->服务帐户)。
注意:我之前尝试过,但没有成功:所以请检查路径是否正确,以及您的服务器是否有权访问它。
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<ProjectId>.firebaseio.com"
});
目标是让我的快速服务器使用 Firebase 云消息传递 (FCM) 发送推送通知。
问题是admin SDK 的初始化似乎不起作用。 代码是用 JavaScript 编写的,节点版本是 10.16.0,firebase-admin 是版本 8.3.0,服务器是 运行 最新 Ubuntu.
我按照 firebase 指南设置了管理 SDK: https://firebase.google.com/docs/admin/setup#initialize_the_sdk
已设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,并尝试使用该变量打开文件:
nano $GOOGLE_APPLICATION_CREDENTIALS
一次
admin.messaging().send(message)
被调用,抛出如下错误:
Error sending message: { Error: Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND".
at FirebaseAppError.FirebaseError [as constructor] (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:42:28)
at FirebaseAppError.PrefixedFirebaseError [as constructor] (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:88:28)
at new FirebaseAppError (/local/home/user/node_modules/firebase-admin/lib/utils/error.js:122:28)
at /local/home/user/node_modules/firebase-admin/lib/firebase-app.js:121:23
at process._tickCallback (internal/process/next_tick.js:68:7)
errorInfo:
{ code: 'app/invalid-credential',
message:
'Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND".' },
codePrefix: 'app' }
实施非常严格地遵循 firebase 指南。
类似的问题指向不支持云功能的spark计划。但据我了解,我正在尝试使用云消息而不是云功能。
我不知道哪里出了问题。特别是因为它与指南中的代码非常相似。 除了 firebase-admin,我还需要安装其他一些 firebase 组件吗?
服务器代码:
const express = require('express');
//firebase for notifications
const admin = require('firebase-admin');
admin.initializeApp({
projectId: <projectId>,
credential: admin.credential.applicationDefault(),
databaseURL: "https://<projectId>.firebaseio.com"
});
// server set up removed
io.on('connection', socket => {
socket.on('notification', (target, message) => {
// This log is printed
console.log("got notification for: ", target)
// target = registration token comes from the client FCM SDKs.
if (typeof (target) === "string") {
sendNotifiaction(target, message)
}
});
});
function sendNotifiaction(registrationToken, message) {
// This registration token comes from the client FCM SDKs.
message.token = registrationToken
// Send a message to the device corresponding to the provided
// registration token.
admin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
// Error catched here
console.log('Error sending message:', error);
});
}
服务帐户密钥(文件路径 = $GOOGLE_APPLICATION_CREDENTIALS)。 有些字段明显省略了。
{
"type": "service_account",
"project_id": "..",
"private_key_id": "..",
"private_key": "-----BEGIN PRIVATE KEY-----.."
"client_email": "firebase-adminsdk-.....iam.gserviceaccount.com",
"client_id": "...",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-......iam.gserviceaccount.com"
}
解决方案
我刚刚使用了 firebase 控制台提供的代码示例(设置->服务帐户)。
注意:我之前尝试过,但没有成功:所以请检查路径是否正确,以及您的服务器是否有权访问它。
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<ProjectId>.firebaseio.com"
});