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

标签 javascript firebase google-cloud-firestore google-cloud-functions firebase-tools

我使用的是 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 项目,则只有一个项目可以工作,其他项目将无法工作。

那么,解决这个问题

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

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

  3. 安全地存储包含 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/

相关文章:

javascript - http.createServer如何使用fs.createReadStream从needle.post接收数据

javascript - 如何更改 if 语句中变量的值

android - Android Firebase 通知没有自定义声音

android - Firebase 实时数据库读取所有现有数据

android - 如何为 Cloud Firestore 自动创建索引?

javascript - Stropejs 获取名册成功回调响应

javascript - ng-include 中使用的指令不起作用

java - 如何检索 Firebase 实时数据库中特定键的所有值?

firebase - 云防火墙 : listen for new documents in a collection and load them

javascript - GCP Firestore 数组容器意外行为