顯示 Google One Tap

在網站中加入 One Tap 提示,讓使用者能夠註冊或登入您的網頁應用程式。使用 HTML 和 JavaScript 算繪及自訂提示。

必要條件

請按照「設定」一節所述步驟設定 OAuth 同意畫面、取得用戶端 ID,然後載入用戶端程式庫。

在登入頁面中加入「使用 Google 帳戶登入」按鈕

提示顯示

在您要顯示 One Tap 的任何網頁中加入程式碼片段。

HTML

顯示 One Tap 提示,將 JWT 憑證傳回登入端點。

<div id="g_id_onload"
   data-client_id="YOUR_GOOGLE_CLIENT_ID"
   data-login_uri="https://your.domain/your_login_endpoint"
   data-your_own_param_1_to_login="any_value"
   data-your_own_param_2_to_login="any_value">
</div>

data-login_uri 屬性是網頁應用程式登入端點的 URI。您可以新增自訂資料屬性,這些屬性會連同 Google 核發的 ID 權杖傳送至登入端點。

使用 data-context 屬性變更提示標題中使用的文字。舉例來說,data-context: "signup" 會將「Sign in to」變更為「Sign up to」。

如需完整的支援屬性清單,請參閱 g_id_onload 參考資料

JavaScript

顯示 One Tap 提示,將 JWT 憑證傳回至瀏覽器的 JavaScript 回呼處理常式。

<script>
  window.onload = function () {
    google.accounts.id.initialize({
      client_id: 'YOUR_GOOGLE_CLIENT_ID',
      callback: 'YOUR_CALLBACK_HANDLER'
    });
    google.accounts.id.prompt();
  }
</script>

如要在 JavaScript 中設定 One Tap 提示,您必須先呼叫 initialize() 方法。接著,呼叫 prompt() 方法來顯示提示 UI。

使用 context 欄位變更提示標題中使用的文字。舉例來說,context: 'signup' 會將「Sign in to」變更為「Sign up to」。

如需資料選項的完整清單,請參閱 idConfiguration 參考資料

提示狀態

使用 JavaScript 回呼函式,監聽提示 UI 狀態通知。

系統會在下列時刻傳送通知:

  • 顯示時刻:這是在呼叫 prompt() 方法後發生的事件。通知包含布林值,用於指出是否顯示 UI。

  • 略過時刻:當 One Tap 提示訊息因自動取消、手動取消,或 Google 無法核發憑證而關閉時,就會發生這種情況,例如當所選工作階段已登出 Google 時。

    在這種情況下,建議您繼續使用其他身分識別服務供應商 (如有)。

  • Dismissed moment:當 Google 成功擷取憑證,或使用者想要停止憑證擷取流程時,就會發生這個事件。舉例來說,當使用者開始在登入對話方塊中輸入使用者名稱和密碼時,您可以呼叫 google.accounts.id.cancel() 方法來關閉 One Tap 提示,並觸發已關閉的狀態。

HTML

請使用 data-moment_callback 屬性指定 JavaScript 回呼函式。您必須使用回呼處理常式才能接收通知。

<html>
  <head>
    <script>
      function continueWithNextIdp(notification) {
        if (notification.isNotDisplayed() || notification.isSkippedMoment()) {
          // try Next provider if One Tap is not displayed or skipped
        }
      }
    </script>
  </head>
  <body>
    ...
    <div id="g_id_onload"
      data-client_id="YOUR_GOOGLE_CLIENT_ID"
      data-login_uri="https://your.domain/your_login_endpoint"
      data-moment_callback="continueWithNextIdp"
    </div>
    ...
  </body>
</html>

為方便使用者登入或註冊,您可以與多個身分識別服務供應商聯絡,找出可用的憑證。您可能需要瞭解提示 UI 狀態,才能呼叫下一個 ID 提供者。

JavaScript

將回呼處理常式做為參數傳遞至 google.accounts.id.prompt,此處的箭頭函式用於處理通知更新。

<script>
window.onload = function () {
  google.accounts.id.initialize({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: 'YOUR_CALLBACK_HANDLER'
  });
  google.accounts.id.prompt((notification) => {
    if (notification.isNotDisplayed() || notification.isSkippedMoment()) {
      // try next provider if OneTap is not displayed or skipped
    }
  });
}
</script>

按鈕和提示

「使用 Google 帳戶登入」按鈕和 One Tap 提示可能會在同一頁面上顯示。

HTML

同時加入 g_id_onloadg_id_signin 元素,即可顯示「使用 Google 帳戶登入」按鈕和 One Tap 提示。

<div id="g_id_onload"
   data-client_id="YOUR_GOOGLE_CLIENT_ID"
   data-context="signin"
   data-ux_mode="redirect"
   data-login_uri="https://your.domain/your_login_endpoint"
   data-itp_support="true">
</div>

<div class="g_id_signin"
   data-type="standard"
   data-shape="rectangular"
   data-theme="outline"
   data-text="signin_with"
   data-size="large"
   data-logo_alignment="left">
</div>

JavaScript

同時呼叫 renderButton()prompt() 函式,顯示「使用 Google 帳戶登入」按鈕和 One Tap 提示。

<script>
window.onload = function () {
  google.accounts.id.initialize({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: 'YOUR_CALLBACK_HANDLER'
  });
  const parent = document.getElementById('google_btn');
  google.accounts.id.renderButton(parent, {theme: "filled_blue"});
  google.accounts.id.prompt();
}
</script>

不要遮住 One Tap

本節僅適用於停用 FedCM 的情況,如果啟用 FedCM,瀏覽器會在頁面內容頂端顯示使用者提示。

為確保使用者能看到所有顯示資訊,Google One Tap 不得被任何其他內容遮蓋。否則在某些情況下可能會觸發彈出式視窗。

請仔細檢查頁面版面配置和元素的 z-index 屬性,確保 Google One Tap 不會在任何時間遭到任何其他內容遮蓋。即使邊框中只有一個像素遭到遮蓋,UX 流程變更也可能會觸發。

憑證回應

憑證回應中包含 Google 簽署的 JWT。回應會透過 JavaScript 回呼函式傳回至瀏覽器,或是透過重新導向至登入端點傳回至您的平台。

JS 回呼

使用 HTML 或 JavaScript 設定回呼。

HTML

<div id="g_id_onload"
  data-client_id="YOUR_GOOGLE_CLIENT_ID"
  data-callback="YOUR_CALLBACK_HANDLER"
</div>

JavaScript

google.accounts.id.initialize({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  callback: 'YOUR_CALLBACK_HANDLER'
});

舉例來說,handleCredentialResponse 會解碼 JWT,並將部分 ID 權杖欄位列印到控制台。

<script>
  google.accounts.id.initialize({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: handleCredentialResponse
  });

  function handleCredentialResponse(response) {
    const responsePayload = decodeJwtResponse(response.credential);

    console.log("ID: " + responsePayload.sub);
    console.log('Full Name: ' + responsePayload.name);
    console.log('Given Name: ' + responsePayload.given_name);
    console.log('Family Name: ' + responsePayload.family_name);
    console.log("Image URL: " + responsePayload.picture);
    console.log("Email: " + responsePayload.email);
  }

  function decodeJwtResponse(token) {
    let base64Url = token.split('.')[1];
    let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    let jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));

    return JSON.parse(jsonPayload);
  }
</script>

重新導向

如要將憑證傳回平台的登入端點,請將網址新增至 OAuth 2.0 網路用戶端的「已授權的重新導向 URI」設定。

使用 HTML 或 JavaScript 設定重新導向 URI。

HTML

<div id="g_id_onload"
  data-client_id="YOUR_GOOGLE_CLIENT_ID"
  data-ux_mode="redirect"
  data-login-uri="YOUR_LOGIN_URI"
</div>

JavaScript

google.accounts.id.initialize({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  ux_mode: 'redirect',
  login_uri: 'YOUR_LOGIN_URI'
});