簡體   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