identity.launchWebAuthFlow

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

此函数唯一的强制参数是服务提供商的授权 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 参数应始终包括:重定向 URL 和扩展的 客户端 ID

redirect_uri 可选

string。这代表了流程完成后您的扩展将被重定向到的 URI。如果与生成的重定向 URL 匹配,则在浏览器端流程正常运行不需要此项。请参阅 获取重定向 URL

interactive 可选

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

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

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

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

返回值

一个 Promise。如果扩展成功获得授权,它将以包含重定向 URL 的字符串来解析。该 URL 将包含一个参数,该参数是访问令牌,或者可以使用特定服务提供商的文档化流程进行交换以获取访问令牌。

示例

此函数根据 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://#/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。