在 Firebase 函数:shell 中,遇到错误:从插件获取元数据失败,错误:invalid_grant



我使用的是Firebase 7.0.0。使用firebase functions: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 功能项目使用该设置,则只有一个项目可以工作,而其他项目将无法工作。

所以,要解决这个问题

  1. 在 Firebase 控制台中,打开设置>服务帐号。

  2. 单击生成新私钥,然后单击生成密钥进行确认。

  3. 安全地存储包含密钥的 JSON 文件。

通过服务帐户授权时,有两种选择可用于向应用程序提供凭据。可以设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,也可以在代码中显式传递服务帐户密钥的路径。第一个选项更安全,强烈建议使用。

要设置环境变量:

将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为包含服务帐号密钥的 JSON 文件的文件路径。此变量仅适用于当前 shell 会话,因此如果打开新会话,请再次设置该变量。

Linux 或 macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json">

带有PowerShell的窗口:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json">

如果要在代码中传递服务帐户密钥的路径。

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 管理员 SDK 添加到服务器的官方文档链接。


我希望它能帮助某人。

相关内容

  • 没有找到相关文章

最新更新