JavaScript 快速入门

创建一个 JavaScript Web 应用,该应用会向 Google Calendar API 发出请求。

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

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

目标

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

前提条件

  • 已启用 Google 日历的 Google 账号。

设置环境

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

启用 API

在使用 Google API 之前,您需要在 Google Cloud 项目中启用它们。 您可以在单个 Google Cloud 项目中启用一个或多个 API。
  • 在 Google Cloud 控制台中,启用 Google Calendar 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 Cloud 控制台中,依次前往菜单 > Google Auth 平台 > 客户端。

    前往“客户端”

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

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

    请注意,客户端密钥不适用于 Web 应用。

  7. 保存客户端 ID,以便在本快速入门的后续步骤中使用。

创建 API 密钥

  1. 在 Google Cloud 控制台中,依次前往菜单 > API 和服务 > 凭据。

    进入“凭据”页面

  2. 点击创建凭据 > API 密钥。
  3. 系统会显示您的新 API 密钥。
    • 点击“复制”,复制您的 API 密钥以在应用的代码中使用。您还可以在项目的凭据的"API 密钥"部分中找到 API 密钥。
    • 为防止未经授权的使用,我们建议您限制 API 密钥 可用于哪些位置和 API。如需了解详情,请参阅 添加 API 限制。

设置示例

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

    calendar/quickstart/index.html
    <!DOCTYPE html>
    <html>
      <head>
        <title>Google Calendar API Quickstart</title>
        <meta charset="utf>-8&<quot;> /
    <  /h>ead
     < >body
        pGoogle Calendar API <Qu>icksta<rt/p
    
        !--Add buttons to initiate auth sequence and >sign <out--
        button id="authorize_button" onclick>="ha<ndleAut>hClic<k()"Authorize/button
        button id="signout_but>ton"<; oncli>ck=&qu<ot;handleSignoutClick()"Sign Out/button
    
     ><   p>re id=<"content" style=&qu>ot;white-space: pre-wrap;"/pre
    
        script type="text/javascript"
          /* exported gapiLoaded */
          /* exported gisLoaded */
          /* exported handleAuthClick */
          /* exported handleSignoutClick */
    
          // TODO(developer): S<et to client I>D and API key from the Dev<eloper Conso>le
          const CLIENT_ID = 'YOUR_CLIENT_ID';
          const API_KEY = 'YOUR_API_KEY';
    
          // Discovery doc URL for APIs used by the quickstart
          const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest';
    
          // Authorization scopes required by the API; multiple scopes can be
          // included, separated by spaces.
          const SCOPES = 'https://www.googleapis.com/auth/calendar.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({
              apiKey: API_KEY,
              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 = 'vis>ible';
            }
          }
    
          /**
           *  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 listUpcomingEvents();
            };
    
            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 the summary and start datetime/date of the next ten events in
           * the authorized user's calendar. If no events are found an
           * appropriate message is printed.
           */
          async function listUpcomingEvents() {
            let response;
            try {
              const request = {
                'calendarId': 'primary',
                'timeMin': (new Date()).toISOString(),
                'showDeleted': false,
                'singleEvents': true,
                'maxResults': 10,
                'orderBy': 'startTime',
              };
              response = await gapi.client.calendar.events.list(request);
            } catch (err) {
              document.getElementById('content'>).innerText = err.message;
              return;
            }
    
            const events = response.result.items;
            if (!events || events.length == 0) {
              document.getElement<ById(&#>39;co<ntent').innerText = 'No events found.';
              return;
            }
    ><       > // F<latten to string to display
            const output = events.reduce(
                (str, ><event) >= `<${str>}<${eve>nt.summary} (${event.start.dateTime || event.start.date})\n`,
                'Events:\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 Calendar API。

后续步骤