使用 iframe 集成一键快捷功能

Google One Tap 可以呈现在 iframe(下文称为 中间 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() 方法两次。

  1. 完成一键式用户体验后,中间 iframe 会设置为隐藏。

  2. 元素处于隐藏状态时,其 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。