繁体   English   中英

无法加载默认凭据? (Node.js 谷歌计算引擎教程)

[英]Could not load the default credentials? (Node.js Google Compute Engine tutorial)

情况:

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

一切正常,直到我执行npm start和 go 到:

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 分钟)

如果不是,我可能做错了什么?

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

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

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

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

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

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

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

转到 API 控制台凭据页面。

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

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

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

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

将您刚刚下载的 *.json 文件放在您选择的目录中。

此目录必须是私有的(您不能让任何人访问此目录),但您的 Web 服务器代码可以访问该目录。

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

有关详细信息,请参阅https://developers.google.com/identity/protocols/application-default-credentials

  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

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

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

我收到此错误是因为最初我喜欢以下内容:

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

当我部署函数但不在serve时它起作用了。 所以这就是我解决它的方法:

  • 转到 firebase项目设置(单击侧面导航中的设置图标)。
  • 单击服务帐户
  • 从选择专业版中复制admin sdk 配置片段 朗。

前(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文件。
  • 单击右上角的管理服务帐户权限
  • 现在,您将看到您的项目的服务帐户,在表中找到具有列名称名称和值firebase-adminsdk 的行,在该行中单击操作点并选择创建密钥
  • 从弹出对话框中选择密钥类型json并按创建按钮。
  • 您将提示下载文件,将其下载到项目中的函数目录(您可以根据需要自定义此文件,如果您推送到 github,请确保忽略该文件)。
  • 现在,如果您将其保存到initializeApp()所在的同一目录中,请访问该文件,如: ./socialape-15456-68dfdc857c55.json (在我的情况下,这两个文件都位于: functions/index.jsfunctions/services.sonfunctions目录和index.js文件中,我初始化了我的firebase admin sdk)。

前(节点.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文件并将您的文件包含在其中并像其他人提到的那样访问它是一个最好的主意。 我把那部分留给你。

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

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

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

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

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

您必须创建 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"
});

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

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]

我发现的另一个解决方案:在你的package.json添加一个像这样的导出命令:

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

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

您可以使用服务帐户并授予此服务帐户适当的权限。 例如云跟踪管理员

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

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

在我设置credentialsprojectId ,我收到了这个错误:

错误:获取应用程序默认凭据时出现意外错误:无法加载默认凭据。 浏览到https://developers.google.com/accounts/docs/application-default-credentials了解更多信息。 在 GoogleAuth。 (/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是云函数运行时的内置环境变量

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

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

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

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

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

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

你可能会发现自己身处世界的另一个地方——并在这里着陆。 我正在添加一个三年前的问题,因为它的关键字与我的问题相匹配,虽然没有描述我的问题,但前面的答案对我有所帮助

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 警告后注册。

如果有人像我一样遇到这个问题并且不想每次在运行他们的代码之前设置变量,最好手动设置环境变量。 将其命名为 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

我面临着同样的问题。 它通过以下命令得到了修复。

gcloud auth application-default login

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM