【问题标题】:Could not load the default credentials? (Node.js Google Compute Engine tutorial)无法加载默认凭据? (Node.js 谷歌计算引擎教程)
【发布时间】:2017-06-21 23:13:44
【问题描述】:

情况:

我遵循这个教程:https://cloud.google.com/nodejs/tutorials/bookshelf-on-compute-engine

一切正常,直到我执行npm start 并转到:

http://localhost:8080

我在空白页上看到以下文字:

Could not load the default credentials. Browse to https://developers.google.com/accounts/docs/application-default-credentials for more information.

这没有任何意义,因为我使用的是 OAuth。我点击链接并阅读了页面,但我在任何地方都没有 GOOGLE-APPLICATION-CREDENTIALS 字段,教程中也没有任何内容。


问题:

能否请您重现这些步骤并告诉我您是否得到相同的结果?

(需要 5 分钟)

如果没有,我做错了什么?

【问题讨论】:

  • 如果您因为同样的问题而来到这里但使用 Firebase:See this Question

标签: javascript node.js google-cloud-platform google-compute-engine


【解决方案1】:

是的,我遇到了同样的错误。这很烦人,因为 Google Cloud Platform 的“入门”书架教程文档在任何地方都没有提到这一点。这意味着任何尝试本教程的新开发人员都会看到此错误。

阅读: https://developers.google.com/identity/protocols/application-default-credentials

我通过运行解决了这个问题: gcloud auth application-default login

为了运行这个gcloud auth application-default login 访问:https://cloud.google.com/sdk/install 1)您必须将sdk安装到您的计算机中 2)这将使您能够运行代码 3)登录到您关联的 gmail 帐户,然后您就可以开始了!

这将使您登录,然后您在本地编码将使用该身份验证。

【讨论】:

  • 我这样做了,现在消息是:The project projectName does not exist or it does not contain an active App Engine application. Please visit http://console.developers.google.com to create a project or https://console.developers.google.com/appengine?project=projectName to add an App Engine application. Note that the app must not be disabled. 这毫无意义,我正在使用计算引擎,这是计算引擎的教程:(
  • 要在这些教程中使用 gloud CLI,您需要在 CLI 级别配置您的默认应用程序。你可能错过了这一步。我确定您已经在 GCP 中创建了一个“项目”,获取该 ProjectID 并运行它:gcloud config set project [YOUR_PROJECT_ID]。这将配置您的 gloud CLI 以使用正确的项目。签出:cloud.google.com/nodejs/getting-started/tutorial-app
  • 设置 process.env.GOOGLE_APPLICATION_CREDENTIALS = "" 为我工作。
  • @newbreedofgeek 'gcloud' 未被识别为内部或外部命令、可运行程序或批处理文件。
  • @GabrielWamunyu 没有 SDK 对你有用吗?在生产中?
【解决方案2】:

如果您在本地运行应用程序,那么gcloud beta auth application-default login 命令应该足以获取本地凭据(我更新了the tutorial 来说明)。

在 Google Compute Engine 上运行应用程序时,如果 Compute Engine 实例是使用适当的范围创建的(cloud-platform 应该足够了),那么应用程序将自动通过 Google Cloud Platform API 进行身份验证,而无需您进行任何额外的工作。

【讨论】:

  • 感谢您的快速回复。很高兴能得到 Google 工程师的如此快速的官方回复 :) 遗憾的是,我在教程中遇到了另一个问题,请您看看以下问题:stackoverflow.com/questions/42098008/…
  • 另外,您更新了错误的教程。那个是给 App Engine 的?
  • gcloud beta auth application-default logingcloud auth application-default login 之间的区别?
【解决方案3】:

这个问题有两种解决方案。正如其他人所提到的,一种选择是使用gcloud auth application-default login

第二个选项是设置环境变量GOOGLE_APPLICATION_CREDENTIALS。它应该指向一个定义凭据的文件。要获取此文件,您需要执行以下步骤:

转到 API 控制台凭据页面。

从项目下拉列表中,选择您的项目。

在凭据页面上,选择创建凭据下拉菜单,然后 选择服务帐户密钥。

从服务帐户下拉菜单中,选择现有服务帐户 或创建一个新的。

对于密钥类型,选择 JSON 密钥选项,然后选择创建。文件 自动下载到您的计算机。

把刚刚下载的 *.json 文件放到你的目录下 选择。

这个目录必须是私有的(你不能让任何人访问 this),但您的网络服务器代码可以访问。

将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为 下载的 JSON 文件的路径。

详情请见https://developers.google.com/identity/protocols/application-default-credentials

【讨论】:

  • 只想说声谢谢。这个对我有用(使用 Node.js)。
  • 路径应该像 C:\Users\CheeWei.Choy\Desktop\OCR\Google-Vision-Api 或只是 Google-Vision-Api.json @Caner
【解决方案4】:
  1. 使用并下载 json 文件创建服务帐户密钥。 https://console.cloud.google.com/apis/credentials/serviceaccountkey

  2. 将此添加到您的 ENV 文件中

    GOOGLE_APPLICATION_CREDENTIALS = "<PATH_TO_SERVICE_ACCOUNT_JSON_FILE>"

例如:

GOOGLE_APPLICATION_CREDENTIALS=/Users/hello/Documents/ssh/my-10ebbbc8b3df.json

【讨论】:

  • 我们如何让这个凭证在生产环境中发挥作用?
  • 要在生产中使用它,你会做同样的事情。您的项目目录中有一个 .ENV 文件,并确保文件路径在部署时仍然准确 - 指向 JSON 文件的位置。
  • @ZachHappel 这是不好的做法。我们不应该在 repo 中提交私钥
【解决方案5】:

我提供了另一种手动设置凭据的方法。用于在 GCP 上进行本地开发和运行,例如 Cloud Function、Compute Engine。

您可以使用服务帐号并授予此服务帐号适当的权限。例如Cloud Trace 管理员

为任何 GCP 客户端库设置 private_keyclient_emailprojectId 选项。这些选项您可以从服务帐户 json 文件中获得。

例如,我在我的云函数中使用 Cloud Trace Node.js 客户端库。

在我设置credentialsprojectId 之前,我得到了这个错误:

错误:获取应用程序默认凭据时出现意外错误:无法加载默认凭据。浏览至https://developers.google.com/accounts/docs/application-default-credentials 了解更多信息。在 Google 身份验证。 (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:248:31) 在步骤 (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js: 47:23) 在 Object.next (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:28:53) 在完成 (/srv/node_modules/google-auth-library/build/ src/auth/googleauth.js:19:58) 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)

您可以将credentialsprojectId 作为环境变量传递。设置credentialsprojectId后,错误消失了。

const tracer = require('@google-cloud/trace-agent').start({
    samplingRate: 0,
    bufferSize: 1,
    credentials: {
      client_email: process.env.CLIENT_EMAIL,
      private_key: process.env.TRACE_AGENT_ADMIN,
    },
    projectId: process.env.X_GOOGLE_GCLOUD_PROJECT || process.env.PROJECT_ID,
  });

X_GOOGLE_GCLOUD_PROJECT 是云函数运行时的内置环境变量

【讨论】:

    【解决方案6】:

    使用它来解决您的问题。这实际上有效:- 只需输入凭据参数并引用您的密钥即可。

    const serviceAccount = require('../key.json');
    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount)
    });
    

    【讨论】:

      【解决方案7】:

      转到此处:https://firebase.google.com/docs/admin/setup#initialize_the_sdk 并按照说明创建私钥。 然后在你下载了你的私钥后,在项目目录中打开命令提示符并执行以下命令:

       set GOOGLE_APPLICATION_CREDENTIALS=C:\YOUR-PATH\YOUR-KEY.json
      

      【讨论】:

        【解决方案8】:

        我收到此错误是因为我最初确实如下所示:

        var admin = require("firebase-admin");
        admin.initializeApp(); // I didnt add anything because firebaserc file include appName
        

        它在我部署函数时有效,但在 serve 中无效。所以这就是我解决它的方法:

        • 转到 firebase 项目设置(点击侧面导航中的设置图标)。
        • 点击服务帐号
        • 从选择您的 pro 中复制 admin sdk 配置 sn-p。语言。

        例如(node.js):

        var admin = require("firebase-admin");
        
        var serviceAccount = require("path/to/serviceAccountKey.json");
        
        admin.initializeApp({
          credential: admin.credential.cert(serviceAccount),
          databaseURL: "https://your-domain.firebaseio.com"
        });
        
        • 现在我们需要添加serviceAccountKey.json 文件。
        • 点击右上角的管理服务帐户权限
        • 现在,您将看到您项目的服务帐户,在表格中找到列名为 name 和值 firebase-adminsdk 的行,在该行中单击 操作点并选择创建密钥
        • 从弹出的对话框中选择Key type作为json,然后按create按钮。
        • 您将提示下载文件,将其下载到项目中的 functions 目录(您可以根据需要自定义此文件,如果您推送到 github,请确保忽略该文件)。
        • 现在,如果您将其保存到您所在的同一目录中 initializeApp(),请访问该文件,例如:./socialape-15456-68dfdc857c55.json(在我的情况下,这两个文件都位于:functions/index.jsfunctions/services.sonfunctions 目录中在index.js 文件中,我初始化了我的firebase admin sdk)。

        Ex(node.js):

        const functions = require('firebase-functions');
        
        var admin = require("firebase-admin");
        
        var serviceAccount = require("./myapp-15456-68dfdc857c55.json");
        
        admin.initializeApp({
          credential: admin.credential.cert(serviceAccount),
          databaseURL: "https://myapp-15456.firebaseio.com"
        });
        

        创建.env 文件并将您的文件包含在其中并像其他人提到的那样访问它是一个最佳和好主意。我把那部分留给你。

        希望这对地球上的某个人有所帮助。问候!

        【讨论】:

        【解决方案9】:

        我也有这个错误问题,这里我没有创建对象

        keyFilename(存储 api 的凭据)

        在 nodejs 应用程序的 sessionClient 对象中。

        const sessionClient = new dialogflow.SessionsClient({
                        keyFilename: "./keyCredentials.json"  
               });
                
                   const sessionPath = sessionClient.sessionPath(projectId, sessionId);

        要下载“keyCredentials.json”转到:

        https://console.cloud.google.com/apis/credentials/serviceaccountkey

        还要将此文件的路径添加到系统变量中

        1. 在windows中打开powershell
        2. 类型 GOOGLE_APPLICATION_CREDENTIALS = [PATH_TO_SERVICE_ACCOUNT_JSON_FILE]

        【讨论】:

          【解决方案10】:

          虽然这个问题已经回答了很多次,但我发现自己的情况在这里没有解释。

          创建变量 $GOOGLE_APPLICATION_CREDENTIALS 后,我遇到了与 Coder1000 相同的错误。

          但是,我在终端的两个单独会话中同时运行:nodemon 和:npm run dev,它们都不知道该变量。

          一旦我:关闭标签;添加了新标签;并再次运行命令,应用程序能够访问该变量。

          【讨论】:

            【解决方案11】:

            对于所有使用 firebase 的人来说,它对我有用的是将 credentials 传递给 KeyManagementServiceClient 构造函数

            const serviceAccount = require('../keys/file.json'); //<- your firebase credentials
            const client = new KeyManagementServiceClient({
                  credentials: serviceAccount,
                });
            

            【讨论】:

              【解决方案12】:

              我找到的另一个解决方案:在您的 package.json 中添加这样的导出命令:

              "scripts": {
                  "start": "export GOOGLE_APPLICATION_CREDENTIALS='./gcloud.json' && node ./bin/www --exec babel-node --presets babel-preset-env",
                },
              

              【讨论】:

                【解决方案13】:

                您必须创建 SessionsClient 的对象。 在这里,我将提供一些步骤,以便您可以像魅力一样运行您的代码。

                1. 您必须进入 Dialogflow 仪表板。
                2. 点击设置(左侧导航栏右上角齿轮图标)
                3. 在“常规”选项卡中单击“服务帐户”链接(它会将您重定向到另一个屏幕)
                4. 如果您有服务帐户,请忽略第 5 步
                5. 创建服务帐户(顶部居中 + 图标按钮)
                  • 现在您有一个服务帐户列表点击
                6. 在动作中,字段按下 3 个垂直点并创建一个键。
                7. 在本地计算机上下载 JSON 文件。
                8. 将对象分配给您的 sessionClient。
                const sessionClient = new dialogflow.SessionsClient({
                 keyFilename: "/var/www/html/moqatrips/dialog-flow.json"
                });
                

                【讨论】:

                • 这是不正确的,给项目带来了安全问题;更不用说部署到多个环境的问题了。不要使用服务帐户文件。始终使用环境 API。
                【解决方案14】:

                您可能会发现自己身处世界的另一个角落——然后降落在这里。我正在添加一个三年前的问题,因为它的关键字与我的问题相匹配,并且前面的答案对我有所帮助,尽管没有人描述我的问题

                firebase deploy --only functions --debug
                

                生产

                [2020-12-02T08:31:50.397Z] FirebaseError: HTTP Error: 429, Unknown Error
                Error: Could not read source directory. Remove links and shortcuts and try again.
                

                我找不到源目录有什么问题。但这就是这么多小鱼。

                从顶部详细检查错误导致:

                Our systems have detected unusual traffic from your computer network.  This page checks to see if it&#39;s really you sending the requests, and not a robot. 
                The block will expire shortly after those requests stop.  
                

                出于好奇和疲惫,我先等了。等待重置持续时间大于 30 分钟。所以我追求验证码来证明我持久的人性,在一些 oauth 警告之后最终确实注册了。

                【讨论】:

                  【解决方案15】:

                  【讨论】:

                    【解决方案16】:

                    如果有人像我一样遇到这个问题并且不想每次在运行他们的代码之前设置变量,最好手动设置环境变量。将其命名为 GOOGLE_APPLICATION_CREDENTIALS 并浏览下载的 JSON 文件。如果您不知道步骤,请按照以下步骤操作:https://docs.oracle.com/en/database/oracle/machine-learning/oml4r/1.5.1/oread/creating-and-modifying-environment-variables-on-windows.html#GUID-DD6F9982-60D5-48F6-8270-A27EC53807D0

                    【讨论】:

                      【解决方案17】:

                      我也面临同样的问题。它已通过以下命令修复。

                      gcloud auth application-default login
                      

                      它将默认 gcloud 云凭据存储在您的系统上并使用相同的凭据。

                      【讨论】:

                        猜你喜欢
                        • 2021-01-02
                        • 1970-01-01
                        • 2016-05-19
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-09-13
                        • 1970-01-01
                        • 2020-10-15
                        • 1970-01-01
                        相关资源
                        最近更新 更多