用户认证(User Authentication)

警告

重要提示:Chrome 将在所有平台上取消对 Chrome 应用程序的支持。 Chrome 浏览器和 Chrome 网上应用店将继续支持扩展程序。阅读公告并了解有关迁移应用程序的更多信息。

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

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

API 示例:想玩玩代码吗?查看这些样本,尤其是身份样本

# 这个怎么运作(How it works)

Chrome Apps 用户有一个与其个人资料相关联的 Google 帐户。应用程序可以使用 getAuthToken API 为这些用户获取 OAuth2 令牌。

想要使用非 Google 身份提供商执行身份验证的应用程序必须调用 launchWebAuthFlow。此方法使用浏览器弹出窗口来显示提供程序页面并捕获到特定 URL 模式的重定向。重定向 URL 被传递到应用程序,应用程序从 URL 中提取令牌。

# 谷歌账户认证(Google account authentication)

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

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

# 添加权限并上传应用(Add permissions and upload app)

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

"permissions": [
  "identity"
]

# 将密钥复制到您的清单(Copy key to your manifest)

当您在 Google OAuth 控制台中注册您的应用程序时,您将提供您的应用程序 ID,该 ID 将在令牌请求期间进行检查。因此,在开发过程中拥有一致的应用程序 ID 很重要。

为了保持您的应用程序 ID 不变,您需要将已安装的 manifest.json 中的密钥复制到您的源清单中。这不是最优雅的任务,但它是如何进行的:

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

# 获取您的 OAuth2 客户端 ID

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

  1. 使用用于将您的应用程序上传到 Chrome 网上应用店的同一 Google 帐户登录到 Google API 控制台。
  2. 通过展开左上角的下拉菜单并选择 Create... 菜单项来创建一个新项目。
  3. 创建并命名后,转到“服务(Services)”导航菜单项并打开您的应用所需的任何 Google 服务。
  4. 转到“API 访问(API Access)”导航菜单项,然后单击“创建 OAuth 2.0 客户端 ID...(Create an OAuth 2.0 client ID...)”蓝色按钮。
  5. 输入所需的品牌信息,选择已安装的应用程序类型。
  6. 选择 Chrome 应用程序并输入您的应用程序 ID(与应用程序和扩展程序管理页面中显示的 ID 相同)。

警告

警告:如果此处的应用 ID 与您的应用 ID 不匹配,则您的应用调用 getAuthToken() 时会发生错误。

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

您需要更新清单以包含客户端 ID 和范围。以下是 gdrive 示例的示例“oauth2”:

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

# 获取访问令牌(Get access tokens)

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

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

# User interaction(用户互动)

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

19

如果您在静默模式下调用 API,则 API 只会返回一个令牌,前提是可以在不显示任何 UI 的情况下生成令牌。这在应用程序在应用程序启动时执行流程的情况下非常有用,例如,或者通常在不涉及用户手势的情况下。

我们建议的最佳做法是在不涉及用户手势时使用静音模式,如果有用户手势则使用交互模式(例如,用户在您的应用中单击了登录按钮)。请注意,我们不强制执行任何手势要求。

# Caching(缓存)

Chrome 具有访问令牌的内存缓存,因此您可以在需要使用令牌的任何时候调用 getAuthToken。令牌过期由缓存自动处理。

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

在某些情况下,例如当用户更改密码时,未过期的访问令牌将停止工作。使用令牌的 API 调用将开始返回 HTTP 状态代码 401。如果您检测到这种情况发生,您可以通过调用 identity.removeCachedAuthToken 从 Chrome 的缓存中删除无效的令牌。

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,请使用以下形式的 URL: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。例如,假设您正在与提供商执行 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

提供者将执行身份验证,如果合适,将向用户显示登录和/或批准 UI。然后它将重定向到https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb#authToken=<auth-token>

Chrome 将捕获它并使用完整的重定向 URL 调用应用程序的回调。应用程序应从 URL 中提取令牌。

# 交互模式与静音模式

调用launchWebAuthFlow时,您可以传递一个标志(上面示例中的'interactive':true)指示您是否希望以交互模式(又名静默模式)调用API。如果您在交互模式下调用 API,则会在必要时向用户显示 UI,以获取令牌(登录 UI 和/或批准 UI;或就此而言任何特定于提供者的 UI)。

如果您以静默模式调用 API,则 API 只会在提供者能够提供令牌而不显示任何 UI 的情况下返回令牌。这在应用程序在应用程序启动时执行流程的情况下非常有用,例如,或者通常在不涉及用户手势的情况下。

我们建议的最佳做法是在不涉及用户手势时使用静默模式,如果有用户手势(例如,用户单击应用中的登录按钮)则使用交互模式。请注意,我们不强制执行手势要求。

By.一粒技术服务

results matching ""

    No results matching ""