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。