identity.launchWebAuthFlow

执行 OAuth2 流程的第一部分,包括用户身份验证和客户端授权。

此函数唯一的必填参数是服务提供商的授权 URL,该 URL 必须包含许多 URL 参数,包括 重定向 URL 和扩展的 客户端 ID。然后,服务提供商将

  • 在必要时对用户进行服务提供商身份验证(即:如果他们尚未登录)
  • 在必要时要求用户授权扩展访问请求的数据(即:如果用户尚未授权扩展)

请注意,如果不需要身份验证或授权,则此函数将静默完成,无需任何用户交互。

此函数还采用可选参数 interactive:如果省略此参数或将其设置为 false,则流程将强制静默完成。在这种情况下,如果用户必须进行身份验证或授权,则操作将失败。

此函数返回一个 Promise:如果身份验证和授权成功,则 promise 将使用包含许多 URL 参数的重定向 URL 得到满足。根据所讨论的服务提供商实施的 OAuth2 流程,扩展将需要执行更多步骤才能获得有效的访问代码,然后可以使用该代码访问用户的数据。

如果出现任何错误,promise 将被拒绝并显示错误消息。错误条件可能包括

  • 无法访问服务提供商的 URL
  • 客户端 ID 与已注册客户端的 ID 不匹配
  • 重定向 URL 与为此客户端注册的任何重定向 URL 不匹配
  • 用户身份验证未成功
  • 用户未授权扩展
  • 省略了 interactive 参数或将其设置为 false,但需要用户交互才能授权扩展。

语法

js
let authorizing = browser.identity.launchWebAuthFlow(
  details   // object
)

参数

details

object。流程选项,包含以下属性

url

string。OAuth2 服务提供商提供的用于获取访问令牌的 URL。此 URL 的详细信息应在所讨论的服务提供商的文档中给出,但 URL 参数应始终包含

redirect_uri 可选

string。这表示流程完成后扩展重定向到的 URI。如果与生成的重定向 URL 匹配,则不需要在浏览器端才能使流程工作。请参阅 获取重定向 URL

interactive 可选

boolean。如果省略或为 false,则强制流程静默完成,无需任何用户交互。

如果用户已登录并已授予扩展访问权限,则 launchWebAuthFlow() 可以静默完成,无需任何用户交互。否则(如果服务提供商需要用户登录或授权扩展),则 launchWebAuthFlow() 将提示用户:即流程将是交互式的。

扩展不应在响应用户操作之外启动交互式流程。但是,有时扩展仍然希望在没有直接用户操作的情况下访问用户的数据(例如,假设扩展希望在浏览器启动时访问数据)。

这就是 interactive 的用途:如果您省略 interactive 或将其设置为 false,则流程将强制静默结束:如果服务提供商需要与用户交互,则流程将失败。因此,作为一般规则:如果您在响应用户操作启动流程,则将 interactive 设置为 true,否则省略它。

返回值

一个 Promise。如果扩展成功获得授权,则将使用包含重定向 URL 的字符串来满足此 promise。该 URL 将包含一个参数,该参数要么是访问令牌,要么可以使用特定服务提供商的已记录流程将其交换为访问令牌。

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

示例

此函数根据 https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow 中的文档授权扩展访问用户的 Google 数据。此处未显示返回访问令牌的验证

js
function validate(redirectURL) {
  // validate the access token
}

function authorize() {
  const redirectURL = browser.identity.getRedirectURL();
  const clientID =
    "664583959686-fhvksj46jkd9j5v96vsmvs406jgndmic.apps.googleusercontent.com";
  const scopes = ["openid", "email", "profile"];
  let authURL = "https://accounts.google.com/o/oauth2/auth";
  authURL += `?client_id=${clientID}`;
  authURL += `&response_type=token`;
  authURL += `&redirect_uri=${encodeURIComponent(redirectURL)}`;
  authURL += `&scope=${encodeURIComponent(scopes.join(" "))}`;

  return browser.identity.launchWebAuthFlow({
    interactive: true,
    url: authURL,
  });
}

function getAccessToken() {
  return authorize().then(validate);
}

扩展示例

注意:此 API 基于 Chromium 的 identity API。