我使用的是 Firebase 7.0.0。使用 firebase 函数:shell
时,每当我尝试 get()
文档或集合中的 listDocuments()
时,我都会收到以下错误,没有进一步的信息:“错误:从插件获取元数据失败,错误:invalid_grant”。请注意,当将相同的代码部署到 Firebase Cloud Functions 时,一切正常。
import * as functions from 'firebase-functions'
import * as firebase from 'firebase-admin'
try { firebase.initializeApp() } catch ( error ) { }
exports = module.exports = functions.https.onRequest(
async ( request: functions.https.Request, response: functions.Response ) => {
if ( request.method === 'POST' ) {
await firebase.firestore().collection( `users` )
.listDocuments()
.then( ( documents: FirebaseFirestore.DocumentReference[] ) => {
for ( const document of documents ) {
console.log( `Found ${document.id}`)
}
response.status( 200 ).end()
}
)
.catch( ( error: any ) => {
console.error( `List failed: ${error}` )
response.status( 405 ).end()
}
)
}
else {
console.error( `Unexpected ${request.method}` )
}
}
)
我做错了什么?
最佳答案
我遇到了同样的错误。 “错误:400 未定义:从插件获取元数据失败,并出现错误:invalid_grant”。
就我而言,问题来自 firebase.initializeApp()
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});
当我只做一个项目时没有任何问题,但当我尝试测试 2 个 firebase 功能项目时,它开始发生。 admin.credential.applicationDefault() 设置仅适用于一个项目配置,因此如果您有超过 2 个采用该设置的 Firebase Fuctions 项目,则只有一个项目可以工作,其他项目将无法工作。
那么,解决这个问题
在 Firebase 控制台中,打开“设置”>“服务帐户”。
单击“生成新私钥”,然后单击“生成 key ”进行确认。
安全地存储包含 key 的 JSON 文件。
通过服务帐户授权时,您有两种选择向应用程序提供凭据。您可以设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,也可以在代码中显式传递服务帐户 key 的路径。第一个选项更安全,强烈推荐。
设置环境变量:
将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含服务帐户 key 的 JSON 文件的文件路径。该变量仅适用于您当前的 shell session ,因此如果您打开新 session ,请再次设置该变量。
Linux 或 macOS
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
使用 PowerShell 的 Windows:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
如果您想将路径传递到代码中的服务帐户 key 。
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});
https://firebase.google.com/docs/admin/setup?authuser=0是有关将 Firebase Admin SDK 添加到服务器的官方文档链接。
我希望它会对某人有所帮助。
关于javascript - 在 firebase 函数 :shell, 中遇到错误:从插件获取元数据失败,错误:invalid_grant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57031617/