JavaScript 快速入门

创建一个 JavaScript Web 应用,用于向 Google Drive API 发出请求。

快速入门介绍了如何设置和运行调用 Google Workspace API 的应用。本快速入门使用一种简化的身份验证方法,适用于测试环境。对于生产环境,我们建议您先了解 身份验证和授权 ,然后再 选择适合您应用的访问凭据

本快速入门使用 Google Workspace 推荐的 API 客户端库来处理身份验证和授权流程的一些详细信息。

目标

  • 设置环境。
  • 设置示例。
  • 运行示例。

前提条件

  • 已启用 Google 云端硬盘的 Google 账号。

设置环境

如需完成本快速入门,请设置您的环境。

启用 API

在使用 Google API 之前,您需要在 Google 云项目中启用它们。您可以在单个 Google Cloud 项目中启用一个或多个 API。
  • 在 Google Cloud 控制台中,启用 Google Drive API。

    启用 API

配置 OAuth 权限请求页面

如果您使用新的 Google Cloud 云项目来完成本快速入门,请配置 OAuth 权限请求页面。如果您已为 Cloud 项目完成此步骤,请跳到下一部分。

  1. 在 Google API 控制台中,依次前往“菜单”菜单 > Google Auth 平台 > 品牌宣传

    前往“品牌宣传”

  2. 如果您已配置 Google Auth 平台,则可以在“品牌宣传”“受众群体”“数据访问权限”中配置以下 OAuth 权限请求页面设置。如果您看到一条消息,指出尚未配置 Google Auth 平台,请点击开始使用
    1. 应用信息 下的应用名称 中,输入应用的名称。
    2. 用户支持邮箱中,选择一个支持邮箱地址,以便用户在对自己的同意情况有疑问时与您联系。
    3. 点击下一步
    4. 受众群体 下,选择内部
    5. 点击下一步
    6. 联系信息下,输入一个邮箱地址,以便您接收有关项目变更的通知。
    7. 点击下一步
    8. 完成 部分,查看 Google API 服务用户数据政策,如果您同意该政策,请选择我同意 Google API 服务:用户数据政策
    9. 点击继续
    10. 点击创建
  3. 目前,您可以跳过添加权限范围。 将来,当您创建的应用要在 Google Workspace 组织外部使用时,您必须将 用户类型 更改为 外部 。然后, 添加应用所需的授权权限范围。如需了解详情,请参阅完整的 配置 OAuth 权限请求页面指南。

为 Web 应用授权凭据

如需对最终用户进行身份验证并访问应用中的用户数据,您需要创建一个或多个 OAuth 2.0 客户端 ID。客户端 ID 用于向 Google 的 OAuth 服务器标识单个应用。如果您的应用在多个平台上运行,您必须为每个平台创建一个单独的客户端 ID。
  1. 在 Google API 控制台中,依次前往“菜单”菜单 > Google Auth 平台 > 客户端

    前往“客户端”

  2. 点击创建客户端
  3. 依次点击应用类型 > Web 应用
  4. 名称 字段中,输入凭证的名称。此名称仅在 Google API 控制台中显示。
  5. 添加与您的应用相关的已获授权的 URI:
    • 客户端应用 (JavaScript) - 在已获授权的 JavaScript 来源 下,点击添加 URI 。然后,输入要用于浏览器请求的 URI。这会标识您的应用可以向 OAuth 2.0 服务器发送 API 请求的网域。
    • 服务器端应用(Java、Python 等) - 在已获授权的重定向 URI 下,点击添加 URI 。然后,输入 OAuth 2.0 服务器可以向其发送响应的端点 URI。
  6. 点击创建

    新创建的凭证会显示在 OAuth 2.0 客户端 ID 下。

    记下客户端 ID。Web 应用不使用客户端密钥。

记下这些凭据,因为您在本快速入门的后续步骤中需要用到它们。

设置示例

  1. 在工作目录中,创建一个名为 index.html 的文件。
  2. index.html 文件中,粘贴以下示例代码:

    drive/quickstart/index.html
    <!DOCTYPE html>
    <html>
      <head>
        <title>Drive API Quickstart</title>
        <meta charset="utf-8" />
      </head>
      <body>
        <p>Drive API Quickstart</p>
    
        <!--Add buttons to initiate auth sequence and sign out-->
        <button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
        <button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>
    
        <pre id="content" style="white-space: pre-wrap;"></pre>
    
        <script type="text/javascript">
          /* exported gapiLoaded */
          /* exported gisLoaded */
          /* exported handleAuthClick */
          /* exported handleSignoutClick */
    
          // TODO(developer): Set to client ID from the Developer Console
          const CLIENT_ID = '<YOUR_CLIENT_ID>';
    
          // Discovery doc URL for APIs used by the quickstart
          const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';
    
          // Authorization scopes required by the API; multiple scopes can be
          // included, separated by spaces.
          const SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly';
    
          let tokenClient;
          let gapiInited = false;
          let gisInited = false;
    
          document.getElementById('authorize_button').style.visibility = 'hidden';
          document.getElementById('signout_button').style.visibility = 'hidden';
    
          /**
           * Callback after api.js is loaded.
           */
          function gapiLoaded() {
            gapi.load('client', initializeGapiClient);
          }
    
          /**
           * Callback after the API client is loaded. Loads the
           * discovery doc to initialize the API.
           */
          async function initializeGapiClient() {
            await gapi.client.init({
              discoveryDocs: [DISCOVERY_DOC],
            });
            gapiInited = true;
            maybeEnableButtons();
          }
    
          /**
           * Callback after Google Identity Services are loaded.
           */
          function gisLoaded() {
            tokenClient = google.accounts.oauth2.initTokenClient({
              client_id: CLIENT_ID,
              scope: SCOPES,
              callback: '', // defined later
            });
            gisInited = true;
            maybeEnableButtons();
          }
    
          /**
           * Enables user interaction after all libraries are loaded.
           */
          function maybeEnableButtons() {
            if (gapiInited && gisInited) {
              document.getElementById('authorize_button').style.visibility = 'visible';
            }
          }
    
          /**
           *  Sign in the user upon button click.
           */
          function handleAuthClick() {
            tokenClient.callback = async (resp) => {
              if (resp.error !== undefined) {
                throw (resp);
              }
              document.getElementById('signout_button').style.visibility = 'visible';
              document.getElementById('authorize_button').innerText = 'Refresh';
              await listFiles();
            };
    
            if (gapi.client.getToken() === null) {
              // Prompt the user to select a Google Account and ask for consent to share their data
              // when establishing a new session.
              tokenClient.requestAccessToken({prompt: 'consent'});
            } else {
              // Skip display of account chooser and consent dialog for an existing session.
              tokenClient.requestAccessToken({prompt: ''});
            }
          }
    
          /**
           *  Sign out the user upon button click.
           */
          function handleSignoutClick() {
            const token = gapi.client.getToken();
            if (token !== null) {
              google.accounts.oauth2.revoke(token.access_token);
              gapi.client.setToken('');
              document.getElementById('content').innerText = '';
              document.getElementById('authorize_button').innerText = 'Authorize';
              document.getElementById('signout_button').style.visibility = 'hidden';
            }
          }
    
          /**
           * Print metadata for first 10 files.
           */
          async function listFiles() {
            let response;
            try {
              response = await gapi.client.drive.files.list({
                'pageSize': 10,
                'fields': 'files(id, name)',
              });
            } catch (err) {
              document.getElementById('content').innerText = err.message;
              return;
            }
            const files = response.result.files;
            if (!files || files.length == 0) {
              document.getElementById('content').innerText = 'No files found.';
              return;
            }
            // Flatten to string to display
            const output = files.reduce(
                (str, file) => `${str}${file.name} (${file.id})\n`,
                'Files:\n');
            document.getElementById('content').innerText = output;
          }
        </script>
        <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
        <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>
      </body>
    </html>

    替换以下内容:

运行示例

  1. 在工作目录中,安装 http-server 软件包:

    npm install http-server
    
  2. 在工作目录中,启动 Web 服务器:

    npx http-server -p 8000
    
  1. 在浏览器中,前往 http://localhost:8000
  2. 您会看到授权访问的提示:
    1. 如果您尚未登录 Google 账号,请在系统提示时登录。如果您登录了多个账号,请选择一个账号用于授权。
    2. 点击接受

您的 JavaScript 应用会运行并调用 Google Drive API。

后续步骤