簡體   English   中英

Google Drive API - 服務帳戶憑據無效

[英]Google Drive API - Invalid service account credentials

我正在學習使用 Google Drive API 並從一個遠離任何東西的小腳本開始:

import * as fs from "fs";
import * as gdrive from "@googleapis/drive";

const auth = new gdrive.auth.GoogleAuth({
    keyFile: "creds.json",
    scopes: [ "https://www.googleapis.com/auth/drive" ]
});

const ds = gdrive.drive({ version: "v3", auth });

const meta = {
    "name": "uploadme.csv",
    "parents": [ "XXX" ] // Folder ID
};

const body = {
    mimeType: "text/csv",
    body = fs.createReadStream("uploadme.csv")
};

async function yeet() {
    const res = await ds.files.create({
        requestBody: meta,
        media: body
    });
    console.log(res);
}
yeet();

這個小腳本有效(返回狀態 200,我看到文件上傳到我指定的文件夾),我繼續將它與我的主項目集成,主要是直接復制小腳本。唯一的區別是不同的文件夾結構和一個不同的調用堆棧,在這個小例子中,我把它全部放在項目根目錄中,而主項目有一個更復雜的布局和程序流程(一個 Discord 機器人響應命令)。 出乎意料的是,即使(據我所知)我有意義地改變的只是項目布局,它還是給出了身份驗證錯誤。

小啟動腳本仍然像之前的測試一樣工作,更令人困惑的是,在主項目上它現在告訴我我的密鑰是壞的,盡管我之前使用的身份驗證代碼和密鑰文件完全相同。 環顧四周,我發現它可能是我的密鑰已過期,我應該尋找一個刷新令牌,但是當我找到它時,我無法找到它在哪里或如何使用它。

有人可以指出我正確的方向嗎?

感謝您的時間。

注意:我使用服務帳戶密鑰來訪問 API,而不是 OAuth 憑據


編輯1:

我最終復制了整個測試腳本(盡管仍然與主項目隔離)並將其移動到主項目的目錄中,果然,它仍然有效。 現在我真的很困惑發生了什么。

編輯2:

我通過刪除 function 並將其替換為對測試腳本的調用將小腳本與主項目鏈接起來(通過將其包裝在導出的 function 中進行了略微修改,因此它可以作為主項目中的模塊調用),它仍然作品。 就好像鑰匙被鎖定在測試腳本中一樣。

服務帳號憑據無效

通常意味着您使用的密鑰罰款無效。 您需要創建一個服務帳戶密鑰文件。

如果您打開 json 密鑰文件,它應該看起來像這樣

{
  "type": "service_account",
  "project_id": "Redacted-305109",
  "private_key_id": "Redacted",
  "private_key": "-----BEGIN PRIVATE KEY-----Redacted---END PRIVATE KEY-----\n",
  "client_email": "Redacted@testapikey-305109.iam.gserviceaccount.com",
  "client_id": "Redacted",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/Redacted-305109.iam.gserviceaccount.com"
}

如何創建服務帳戶密鑰文件

文檔: google-api-nodejs-client#service-account-credentials

const {google} = require('googleapis');

const auth = new google.auth.GoogleAuth({
  keyFile: '/path/to/your-secret-key.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM