Google One Tap 可以呈现在 iframe(下文称为 中间 iframe)。没有任何可感知的 使用中间 iframe 时,一键式用户体验的变化。
基于 iframe 的中间集成会带来一些灵活性和风险:
一键式嵌入式用户体验及后续用户体验流程。
完成一键式用户体验后,您可以在 中间 iframe。因此,一键快捷界面和后续用户体验都可以嵌入 到当前内容页面中。以下是一个示例。
如果没有中间 iframe,通常情况下,您需要用整个网页来导航至 显示后续用户体验流程,这在某些情况下可能会造成干扰。
只需集成一次,即可随时随地全面展示。
所有一键式集成代码(一键快捷 API 调用和后续用户体验) 处理)封装在中间 iframe 中。在内容页面上 您只需要嵌入中间 iframe。
此架构有助于分离关注点,从而降低您的 集成和维护成本。
限制 ID 令牌披露范围。
ID 令牌直接由中间 iframe 使用。它们分别是 从未在内容网页上看到过的广告。这种架构 缩小 ID 令牌暴露范围。
中级 iframe 方法也适用于 与登录相关的专用子网域(例如 login.example.com)以及多个 与内容相关的子网域(例如 sports.example.com 和 games.example.com)。
一键显示域名。
按照 Google 的 OAuth 政策的要求,收到 OAuth 的所有网域 需要在 Google Cloud 控制台中预注册。配普通 1 点按集成,开发者需要预注册所有可使用一键快捷功能的网域 因为 ID 令牌将回传到这些网域。部分 网站允许用户动态创建子网域, 因而无法进行预注册因此,一键无法显示在以下位置: 这些动态创建的子网域。
您可以使用中间 iframe 解决此问题。在此示例中 只需预注册中间 iframe 的网域即可。那里 则不需要注册内容页域,因为 ID 令牌 显示的内容页面
隐私风险。
开发者必须采取措施来防止中间 iframe 嵌入非预期域中的。例如,恶意.com 可能会将您的 中间 iframe,从而在其网站上显示您的一键式用户体验。这个 肯定会引起最终用户的很多隐私顾虑。
安全风险。
由于上述意外取景问题,您的中级 iframe 绝不应向父级发送安全或隐私敏感数据 例如 ID 令牌、会话 Cookie 值、用户数据等。 可能会导致您的网站面临风险
在中间 iframe 中一键呈现
要在中间 iframe 中显示一键快捷功能,请放置以下代码 代码段插入中间 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,完整的登录或注册用户体验流程 实现为嵌入式用户体验
对于一键式用户体验后的第一个页面,您需要调用 notifyParentResize()
方法两次。
完成一键式用户体验后,中间 iframe 会设置为隐藏。
元素处于隐藏状态时,其
offsetHeight
属性值为 0。
在第一次调用中,您可以将 iframe 高度调整为 1px,
可见。然后,在 offsetHeight
属性值可用后,您可以
将它调整为合适的高度
以下示例代码展示了如何验证父源并调整 一键式用户体验后界面的中间 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。