Google One Tap 可在 iframe 中顯示 (以下稱為 中繼 iframe)。根本沒有 在使用中繼 iframe 時變更 One Tap 使用者體驗。
以中階 iframe 為基礎的整合可帶來彈性和風險:
適用於 One Tap 和後續使用者體驗流程的嵌入式使用者體驗。
One Tap 使用者體驗完成後,您可以在 中繼 iframe。因此,你可以同時將 One Tap 和後續使用者體驗 將內容整合至目前的內容網頁請參閱下方的範例。
如果沒有中繼 iframe,通常需要透過整頁瀏覽的方式 顯示後續的使用者體驗流程,在某些情況下可能會幹擾使用者。
整合一次,並在任何地方顯示。
所有 One Tap 整合程式碼 (One Tap API 叫用和後續使用者體驗) 參數) 會封裝在中繼 iframe 中。在內容網頁上 One Tap 可以顯示其中內容,你只需嵌入中繼 iframe。
這種架構可讓關注點分離,進而減少您的 整合與維護成本
限制 ID 權杖曝光範圍。
ID 符記會直接由中繼 iframe 使用。這些 一律不接觸到內容頁面這種做法 減少 ID 權杖曝光範圍
中階 iframe 也適合已擁有 與登入相關的專屬子網域 (例如 login.example.com) 和 內容相關的子網域 (例如 sports.example.com 和 game.example.com)。
One Tap 顯示網域。
根據 Google 的 OAuth 政策規定,所有接收 OAuth 的網域都必須符合 則需要在 Google Cloud 控制台中預先註冊。與一般規則一較高下 輕觸「整合」,開發人員必須預先註冊所有使用 One Tap 的網域 可能會顯示,因為 ID 權杖會回傳至這些網域。只有部分通知 網站能讓使用者動態建立子網域 因此無法預先註冊因此,One Tap 無法在 這些動態建立的子網域
使用中繼 iframe 即可修正這個問題。在本例中 只需預先註冊中繼 iframe 的網域。有 不必註冊內容網頁的網域,因為 ID 權杖不需要 看到的內容網頁
隱私權風險。
開發人員必須採取相關措施, 嵌入到非預期的網域舉例來說,Malware.com 可能會將 中間 iframe,然後在對方的網站上顯示 One Tap 使用者體驗。這個 絕對會讓使用者產生許多隱私權疑慮。
安全風險。
由於上述未預期的取景問題,您的中階 iframe 不得將安全性或隱私權私密資料傳送給上層 例如 ID 權杖、工作階段 Cookie 值、使用者資料等 遵守這項規則,或許會危及網站的安全。
在中繼 iframe 中顯示 One Tap
如要在中繼 iframe 中顯示 One Tap,請加入下列程式碼 將程式碼片段插入中繼 iframe 的 HTML 程式碼中:
<div id="g_id_onload"
data-client_id="YOUR_GOOGLE_CLIENT_ID"
data-login_uri="https://your.domain/your_login_endpoint"
data-allowed_parent_origin="https://example.com">
</div>
如果使用 data-allowed_parent_origin
屬性,Google One Tap 會執行
中階 iframe 模式你可以設定一個網域,或是以半形逗號分隔
作為屬性值。系統也支援萬用字元子網域。
(選用) 在中階 iframe 中顯示後續使用者體驗
在登入回應中,您可以傳回任何可能顯示的 HTML 程式碼, 向使用者顯示的內容例如要求額外的個人資料 或同意《服務條款》提交網頁後,即可顯示更多網頁。 例如付款或訂閱。
您可以調整中繼 iframe 的大小:
<script src="https://accounts.google.com/gsi/intermediatesupport"></script>
<script>
google.accounts.id.intermediate.notifyParentResize(320);
</script>
簡單來說,使用中階 iframe 之後,完整的登入或註冊 UX 流程 嵌入使用者體驗
如果是 One Tap 使用者體驗後顯示的第一頁,則必須呼叫 notifyParentResize()
方法兩次。
One Tap UX 作業完成後,中繼 iframe 會設為隱藏。
隱藏元素的
offsetHeight
屬性值是 0。
第一次呼叫時,您可以將 iframe 高度調整為 1 像素,
顯示。接著,您可以使用 offsetHeight
屬性值
並調整大小到適合的高度
以下程式碼範例說明如何驗證父項來源,並調整 採用 One Tap 使用者體驗後使用者介面的中繼 iframe。
<script>
window.onload = () => {
google.accounts.id.intermediate.verifyParentOrigin(
["https://example.com","https://example-com.cdn.ampproject.org"],
() => {
google.accounts.id.intermediate.notifyParentResize(1);
window.setTimeout(() => {
let h = document.getElementById('container').offsetHeight;
google.accounts.id.intermediate.notifyParentResize(h);
}, 200);
},
() => {
document.getElementById('container').style.display = 'none';
document.getElementById('warning').innerText = 'Warning: the page is displayed in an unexpected domain!';
}
);
};
</script>
移除使用者體驗中的中階 iframe
您必須在發生以下情況時通知上層內容頁面,移除中繼 iframe 完成使用者體驗流程這時,您可以將以下程式碼片段 您的登入回應代碼。
<script src="https://accounts.google.com/gsi/intermediatesupport"></script>
<script>
google.accounts.id.intermediate.notifyParentDone();
</script>
如果略過使用者體驗流程,就需要呼叫 notifyParentClose
方法
。
將中繼 iframe 嵌入 HTML 網頁
將下列程式碼片段放入您要使用 Google One Tap 的 HTML 頁面 即可顯示:
<script src="https://accounts.google.com/gsi/intermediate"></script>
<div id="g_id_intermediate_iframe"
data-src="https://example.com/onetap_iframe.html">
</div>
data-src
屬性是中繼 iframe 的 URI。