Node.js 快速入門導覽課程

快速入門說明如何設定及執行呼叫 Google Workspace API 的應用程式。

Google Workspace 快速入門會使用 API 用戶端程式庫處理驗證和授權流程的部分細節。建議您為自家應用程式使用用戶端程式庫。本快速入門導覽課程會使用簡化的驗證方法,適合測試環境使用。如要使用正式環境,建議您先瞭解驗證和授權,再選擇適合應用程式的存取憑證

建立 Node.js 指令列應用程式,向經銷商 API 提出要求。

目標

  • 設定環境。
  • 安裝用戶端程式庫。
  • 設定範例。
  • 執行範例。

必要條件

如要執行本快速入門導覽課程,您需要具備下列先決條件:

  • Google 經銷商網域執行個體。
  • 已全面履行《Google Workspace 合作夥伴協議》。

設定環境

如要完成本快速入門課程,請設定環境。

啟用 API

使用 Google API 前,您必須先在 Google Cloud 專案中啟用這些 API。您可以在單一 Google Cloud 專案中啟用一或多個 API。
  • 在 Google Cloud 控制台中啟用經銷商 API。

    啟用 API

如果您要使用新的 Google Cloud 專案完成這個快速入門課程,請設定 OAuth 同意畫面。如果您已為 Cloud 專案完成這個步驟,請跳至下一節。

  1. 在 Google Cloud 控制台中,依序前往「選單」 >>「品牌」

    前往「品牌」

  2. 如果您已設定 ,則可以在「品牌」、「目標對象」和「資料存取」中設定下列 OAuth 同意畫面設定。如果畫面上顯示「尚未設定」 ,請按一下「開始使用」
    1. 在「應用程式資訊」下方的「應用程式名稱」中,輸入應用程式名稱。
    2. 在「使用者支援電子郵件」中,選擇使用者有同意聲明相關問題時可與您聯絡的支援電子郵件地址。
    3. 點選 [下一步]
    4. 在「觀眾」下方,選取「內部」
    5. 點選 [下一步]
    6. 在「聯絡資訊」下方,輸入電子郵件地址,方便 Google 在專案有任何異動時通知您。
    7. 點選 [下一步]
    8. 在「Finish」下方,詳閱「Google API 服務使用者資料政策」,如果同意,請選取「I agree to the Google API Services: User Data Policy」
    9. 按一下 [繼續]。
    10. 按一下 [建立]。
  3. 目前您可以略過新增範圍的步驟。 日後,如果您建立的應用程式是供 Google Workspace 機構以外的使用者使用,就必須將使用者類型變更為外部。然後新增應用程式所需的授權範圍。詳情請參閱完整的「設定 OAuth 同意聲明」指南。

授權電腦版應用程式的憑證

如要驗證使用者,並在應用程式中存取使用者資料,您需要建立一或多個 OAuth 2.0 用戶端 ID。用戶端 ID 可讓 Google 的 OAuth 伺服器識別單一應用程式。如果您的應用程式在多個平台上執行,則必須為每個平台建立專屬的用戶端 ID。
  1. 在 Google Cloud 控制台中,依序前往「選單」 >>「Clients」

    前往「客戶」

  2. 按一下「Create Client」
  3. 依序點選「應用程式類型」>「桌面應用程式」
  4. 在「Name」欄位中輸入憑證名稱。這個名稱只會顯示在 Google Cloud 控制台中。
  5. 按一下 [Create] (建立)

    新建立的憑證會顯示在「OAuth 2.0 用戶端 ID」下方。

  6. 將下載的 JSON 檔案儲存為 credentials.json,然後將檔案移至工作目錄。

安裝用戶端程式庫

  • 使用 npm 安裝程式庫:

    npm install googleapis@105 @google-cloud/local-auth@2.1.0 --save
    

設定範例

  1. 在工作目錄中建立名為 index.js 的檔案。

  2. 在檔案中貼上以下程式碼:

    adminSDK/reseller/index.js
    const fs = require('fs').promises;
    const path = require('path');
    const process = require('process');
    const {authenticate} = require('@google-cloud/local-auth');
    const {google} = require('googleapis');
    
    // If modifying these scopes, delete token.json.
    const SCOPES = ['https://www.googleapis.com/auth/apps.order'];
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    const TOKEN_PATH = path.join(process.cwd(), 'token.json');
    const CREDENTIALS_PATH = path.join(process.cwd(), 'credentials.json');
    
    /**
     * Reads previously authorized credentials from the save file.
     *
     * @return {Promise<OAuth2Client|null>}
     */
    async function loadSavedCredentialsIfExist() {
      try {
        const content = await fs.readFile(TOKEN_PATH);
        const credentials = JSON.parse(content);
        return google.auth.fromJSON(credentials);
      } catch (err) {
        return null;
      }
    }
    
    /**
     * Serializes credentials to a file compatible with GoogleAuth.fromJSON.
     *
     * @param {OAuth2Client} client
     * @return {Promise<void>}
     */
    async function saveCredentials(client) {
      const content = await fs.readFile(CREDENTIALS_PATH);
      const keys = JSON.parse(content);
      const key = keys.installed || keys.web;
      const payload = JSON.stringify({
        type: 'authorized_user',
        client_id: key.client_id,
        client_secret: key.client_secret,
        refresh_token: client.credentials.refresh_token,
      });
      await fs.writeFile(TOKEN_PATH, payload);
    }
    
    /**
     * Load or request or authorization to call APIs.
     *
     */
    async function authorize() {
      let client = await loadSavedCredentialsIfExist();
      if (client) {
        return client;
      }
      client = await authenticate({
        scopes: SCOPES,
        keyfilePath: CREDENTIALS_PATH,
      });
      if (client.credentials) {
        await saveCredentials(client);
      }
      return client;
    }
    
    /**
     * Lists the first 10 subscriptions you manage.
     *
     * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
     */
    async function listSubscriptions(auth) {
      const service = google.reseller({version: 'v1', auth});
      const res = await service.subscriptions.list({
        maxResults: 10,
      });
      const subscriptions = res.data.subscriptions;
      if (!subscriptions || subscriptions.length === 0) {
        console.log('No subscriptions found.');
        return;
      }
    
      console.log('Subscriptions:');
      subscriptions.forEach(({customerId, skuId, plan}) => {
        console.log(`${customerId} (${skuId}, ${plan.planName})`);
      });
    }
    authorize().then(listSubscriptions).catch(console.error);

執行範例

  1. 在工作目錄中執行範例:

    node .
    
  1. 第一次執行範例時,系統會提示您授權存取權:
    1. 如果尚未登入 Google 帳戶,請在系統提示時登入。如果您登入了多個帳戶,請選取要用於授權的帳戶。
    2. 然後點選 [Accept]

    Nodejs 應用程式會執行並呼叫 Reseller API。

    授權資訊會儲存在檔案系統中,因此下次執行範例程式碼時,系統不會提示您授權。

後續步驟