identity.launchWebAuthFlow
执行 OAuth2 流程的第一部分,包括用户身份验证和客户端授权。
此函数唯一的必填参数是服务提供商的授权 URL,该 URL 必须包含许多 URL 参数,包括 重定向 URL 和扩展的 客户端 ID。然后,服务提供商将
- 在必要时对用户进行服务提供商身份验证(即:如果他们尚未登录)
- 在必要时要求用户授权扩展访问请求的数据(即:如果用户尚未授权扩展)
请注意,如果不需要身份验证或授权,则此函数将静默完成,无需任何用户交互。
此函数还采用可选参数 interactive
:如果省略此参数或将其设置为 false,则流程将强制静默完成。在这种情况下,如果用户必须进行身份验证或授权,则操作将失败。
此函数返回一个 Promise
:如果身份验证和授权成功,则 promise 将使用包含许多 URL 参数的重定向 URL 得到满足。根据所讨论的服务提供商实施的 OAuth2 流程,扩展将需要执行更多步骤才能获得有效的访问代码,然后可以使用该代码访问用户的数据。
如果出现任何错误,promise 将被拒绝并显示错误消息。错误条件可能包括
- 无法访问服务提供商的 URL
- 客户端 ID 与已注册客户端的 ID 不匹配
- 重定向 URL 与为此客户端注册的任何重定向 URL 不匹配
- 用户身份验证未成功
- 用户未授权扩展
- 省略了
interactive
参数或将其设置为 false,但需要用户交互才能授权扩展。
语法
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 数据。此处未显示返回访问令牌的验证
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。