用户身份验证

网络身份验证协议利用 HTTP 功能,但 Chrome 应用是在应用容器内运行; 它们不能通过 HTTP 加载,也不能执行重定向或设置 Cookie。

使用 Chrome Identity API 对用户进行身份验证:getAuthToken 用于已登录的用户 用户的 Google 账号;对于登录非 Google 账号的用户,则需使用launchWebAuthFlow。如果您的 应用使用自己的服务器对用户进行身份验证,您需要使用后者。

工作原理

Chrome 应用用户拥有与其个人资料相关联的 Google 账号。应用可以获取 OAuth2 令牌 使用 getAuthToken API 为这些用户创建最佳存储位置。

想要使用非 Google 身份提供方进行身份验证的应用必须调用 launchWebAuthFlow。此方法使用浏览器弹出式窗口来显示提供程序页面并捕获 重定向到特定网址格式。重定向网址将传递给应用,然后应用提取 标记。

Google 账号身份验证

以下是您需要完成的五个步骤:

  1. 向清单添加权限并上传应用。
  2. 将已安装的 manifest.json 中的密钥复制到源清单中,这样您的应用 ID 在开发过程中保持不变。
  3. 获取 Chrome 应用的 OAuth2 客户端 ID。
  4. 更新您的清单,使其包含客户端 ID 和范围。
  5. 获取身份验证令牌。

添加权限并上传应用

您需要确保在清单中包含身份权限。然后,您就可以将应用上传到 应用和扩展程序管理页面(请参阅发布)。

"permissions": [
  "identity"
]

将密钥复制到清单中

在 Google OAuth 控制台中注册应用时,您需要提供应用的 ID,将在令牌请求期间检查。因此,制定一个统一的 。

为使应用 ID 保持不变,您需要将已安装的 manifest.json 中的密钥复制到 来源清单这不是最优雅的任务,但如下所示:

  1. 前往您的用户数据目录。在 MacO 上的示例: ~/Library/Application\ Support/Google/Chrome/Default/Extensions
  2. 列出已安装的应用和扩展程序,并在应用和扩展程序中匹配您的应用 ID 更改为此处的同一 ID。
  3. 转到安装版应用目录(这将成为应用 ID 中的某个版本)。打开已安装的 manifest.json(pico 是打开文件的快捷方式)。
  4. 复制“key”在已安装的 manifest.json 中,并将其粘贴到应用的源清单中 文件。

获取 OAuth2 客户端 ID

您需要在 Google API 控制台中注册您的应用,以获取客户端 ID:

  1. 使用将应用上传到 Chrome 应用商店。
  2. 通过展开左上角的下拉菜单,然后选择 创建...菜单项。
  3. 创建并命名后,转到“Services”导航菜单,然后打开任意 Google 应用所需的服务
  4. 转到“API 访问权限”导航菜单项,然后点击创建 OAuth 2.0 客户端 ID...蓝色按钮。
  5. 输入所需的品牌信息,选择已安装的应用类型。
  6. 选择 Chrome Application(Chrome 应用),然后输入您的应用 ID(在应用和 扩展程序管理页面)。

使用 OAuth2 客户端 ID 和范围更新您的清单

您需要更新清单,使其包含客户端 ID 和作用域。以下是示例“oauth2”用于 gdrive 示例

"oauth2": {
    "client_id": "665859454684.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/drive"
    ]
  }

获取访问令牌

您现在可以通过调用 identity.getAuthToken 获取身份验证令牌。

chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
  // Use the token.
});

用户互动

调用 getAuthToken 时,您可以传递一个标志(上例中的 'interactive': true) 指明要在交互模式还是静默模式下调用 API。如果您调用 在交互模式下使用 API 时,会在必要时向用户显示登录和/或审批界面,如下所示 如以下屏幕截图所示:

显示应用使用 Identity API 对 Google 账号进行身份验证时界面的屏幕截图

如果您在静默模式下调用 API,则 API 将仅在可以生成令牌的情况下才返回令牌。 而不显示任何界面如果应用在应用启动时执行此流程, 例如,在不涉及用户手势的情况下,通常会使用此参数。

我们建议的最佳做法是在不涉及用户手势和使用时,使用静音模式 交互模式(如果发生了用户手势,例如,用户在 )。请注意,我们不强制执行任何手势要求。

缓存

Chrome 在内存中设置了访问令牌缓存,因此您可以根据需要随时调用 getAuthToken 使用令牌。令牌过期由缓存自动处理。

您可以在 chrome://identity-internals 上查看令牌缓存的当前状态。

在某些情况下(例如用户更改密码、访问令牌未过期) 将停止运行。使用此令牌的 API 调用将开始返回 HTTP 状态代码 401。如果 如果您检测到发生了这种情况,则可以通过调用 identity.removeCachedAuthToken.

removeCachedAuthToken 用法示例:

// callback = function (error, httpStatus, responseText);
function authenticatedXhr(method, url, callback) {
  var retry = true;
  function getTokenAndXhr() {
    chrome.identity.getAuthToken({/* details */},
                                 function (access_token) {
      if (chrome.runtime.lastError) {
        callback(chrome.runtime.lastError);
        return;
      }

      var xhr = new XMLHttpRequest();
      xhr.open(method, url);
      xhr.setRequestHeader('Authorization',
                           'Bearer ' + access_token);

      xhr.onload = function () {
        if (this.status === 401 && retry) {
          // This status may indicate that the cached
          // access token was invalid. Retry once with
          // a fresh token.
          retry = false;
          chrome.identity.removeCachedAuthToken(
              { 'token': access_token },
              getTokenAndXhr);
          return;
        }

        callback(null, this.status, this.responseText);
      }
    });
  }
}

非 Google 账号身份验证

以下是您需要完成的三个步骤:

  1. 向提供商注册。
  2. 为您的应用将访问的提供程序资源添加权限。
  3. 获取身份验证令牌。

向提供商注册

您需要向提供方注册一个 OAuth2 客户端 ID,并将该客户端 ID 配置为网站。 对于要在注册期间输入的重定向 URI,请使用以下格式的网址: https://<extension-id>.chromiumapp.org/<anything-here>

例如,如果您的应用 ID 是 abcdefghijklmnopqrstuvwxyzabcdef,而您希望 provider_cb 路径,以便将其与其他提供程序的重定向 URI 区分开来,您应使用: https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb

为提供方添加权限

要对提供程序 API 端点进行跨源 XHR,您需要将相应的 模式:

"permissions": [
  ...
  "https://www.website-of-provider-with-user-photos.com/photos/*"
]

获取令牌

如需获取令牌,请执行以下操作:

chrome.identity.launchWebAuthFlow(
  {'url': '<url-to-do-auth>', 'interactive': true},
  function(redirect_url) { /* Extract token from redirect_url */ });

<url-to-do-auth> 是用于从网站向提供商进行身份验证的网址。例如: 请说明您正在向提供商执行 OAuth2 流程,并且您已向 客户端 ID 为 123456789012345 的用户,并且您希望在提供商的网站上访问用户的照片: https://www.website-of-provider-with-user-photos.com/dialog/oauth?client_id=123456789012345& redirect_uri=https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb&response_type=token&scope=user_photos

提供商将执行身份验证,并在适当情况下向 用户。然后,它会重定向到 https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb#authToken=<auth-token>

Chrome 将捕获该网址,并使用完整的重定向网址调用应用的回调。应用 应从网址中提取令牌。

交互模式与静默模式

调用 launchWebAuthFlow 时,您可以传递一个标志(上例中的 'interactive': true) 指示您是否要在交互模式(又称静默模式)下调用该 API。如果 您在交互模式下调用 API 时,会在必要时向用户显示界面以获取令牌(登录) 界面和/或审批界面;或者针对具体提供商的界面)。

如果您在静默模式下调用 API,则 API 将仅在提供程序能够 提供令牌而不显示任何界面。当应用在应用内执行流程时,这非常有用 启动,或者一般是在不涉及用户手势的情况下启动。

我们建议的最佳做法是在不涉及用户手势和使用时,使用静音模式 交互模式(如果发生了用户手势,例如,用户在 )。请注意,我们没有强制执行手势要求。