排查签名嵌入身份验证错误

当您为 Looker 内容使用已签名嵌入时,排查身份验证错误可能很困难。您可以通过几种不同的方法来尝试和诊断问题,并且您需要根据重定向将用户带往何处选择一种方法。除非另有说明,否则本页中的提示假定您使用与 Looker 的“嵌入示例”GitHub 代码库中类似的脚本生成已签名的嵌入网址。

首先尝试常规操作

在开始嵌入之前,请确保您已在管理面板中生成了嵌入 Secret,并且嵌入的内容在生产模式(而不仅仅是在开发模式)下可正常运行。

如果您拥有管理员权限,请以嵌入用户身份 sudo 检查您的内容是否正常运行。如果您收到 Oops, we can't find that page 错误,则问题很可能是权限或内容访问方面的问题,与身份验证问题无关。如果嵌入用户未显示在 Looker 管理面板的用户页面中,则表示该用户尚未创建,并且嵌入网址失败。您可以尝试使用此页面上列出的部分建议和资源来排查问题。

如果您的实例是自行托管的,请确保客户端服务器可以访问 Looker 服务器;如果客户端和服务器之间的数据通过公共互联网传输,请确保使用的是 SSL (HTTPS)。

本页的其余部分介绍了您可能遇到的错误和其他问题,以及相应的解决步骤。

系统会将我重定向到登录页面或“单点登录失败”页面

如果系统将您重定向至登录页面或显示错误 Single sign on failure. Please contact an adinistrator. 的页面,这通常表示已签名的嵌入身份验证无法正常工作。

首先,生成新的已签名嵌入网址,然后在 Looker 管理面板的嵌入页面下的嵌入 URI 验证器中对其进行测试。Embed URI 验证程序有时可以揭示一些有价值的信息,让您了解出错的原因。

嵌入 URI 验证器是否按预期显示?

如果您位于 Looker 管理面板的嵌入页面上,但页面上未显示“嵌入 URI 验证工具”,这表明签名嵌入功能尚未启用。您需要启用签名嵌入

我收到了 'signature param' failed to authenticate 错误

如果您看到此错误,则表示脚本生成的签名无法正常运行。如需了解可能的解决方案,请参阅以下部分:

嵌入密钥是否匹配?

Looker 实例中的嵌入密钥应与已签名的嵌入网址生成脚本中的已签名的嵌入密钥完全相同。如果您不确定是否属实,请选择重置密钥以生成新密钥并将其添加到脚本中。重置密钥会破坏使用旧密钥的所有嵌入。

尝试使用 Create Signed Embed Url 端点创建嵌入网址,并在脚本中为调用正文中的 secret_id 指定 Secret。响应会告知您所用的密钥是否无效。

签名字符串的顺序是否正确?

签名字符串中的嵌入参数在网址生成脚本中的顺序必须正确。签名嵌入文档页面中介绍了正确的顺序。

打印的签名字符串在编码前应如下所示:

  company_name.looker.com
  /login/embed/embed%2Fdashboards%2F123
  "ac786cbc06162b1edde3a8b35920a93e"
  15852443573600
  "test_external_user_id"
  ["access_data","see_user_dashboards"]
  ["test_model"]
  []
  "test group space"
  {"test_user_attribute":"yes"}
  {}

使用嵌入密钥对签名字符串进行签名后,请确保最终到达网址中的参数与签名字符串中指定的参数一致。请确保网址参数中对 +/ 等特殊字符进行了编码(例如,如果编码不正确,+ 可能会被解读为空格),并且签名的嵌入网址中没有任何换行符(编码后可能会丢失)。

将您的脚本与我们的脚本示例进行比较,检查您的脚本是否执行了所有正确的步骤,以及签名是否使用了正确的加密方式。

我收到了 This request includes invalid params: ["embed_domain"] 错误

在开始排查此错误之前,请注意,只有当脚本使用 JavaScript 事件监听器时,才需要 embed_domain 参数,而基本已签名嵌入实现通常不需要该参数。如果您的应用不需要监听 JavaScript 事件,最简单的方法是完全移除 embed_domain 参数。

如果您确实需要在嵌入式应用中使用 JavaScript 事件,请检查网址生成脚本,了解 embed_domain 参数的添加位置。此错误通常表示 embed_domain 参数意外地被放置为已签名的嵌入参数,而不是直接放置在 embed_url 中。除非 embed_domain 参数实际上是 embed_url 的一部分,否则脚本将无法正确设置其格式,而且应在嵌入网址之后、任何参数之前添加该参数。

在脚本中正确指定 embed_domain 参数后,应如下所示:

  embed_url: "/embed/dashboards/3?embed_domain=https://company.com"
如果您使用的是 Create Signed Embed Url 端点,则应将 embed_domain 参数放置在 target_url 的末尾。

我收到了 'nonce' param already used this hour 错误

nonce 参数的值在同一小时内不得重复,且需要少于 255 个字符。因此,如果您测试的是已访问过的网址,就会看到此错误。确保您生成的嵌入网址尚未在浏览器中加载,并且 Nonce 会发生变化,不会被重复使用。

我被重定向到 Uh-Oh, Something went wrong 错误

如果您看到此错误,请与 Looker 支持团队联系,以便他们帮助您诊断问题。

我被重定向到一个显示 401 错误消息的页面 You are not authenticated to view this page.

如果您已尝试所有适用的问题排查步骤,但 401 问题仍然存在,则说明您的浏览器可能屏蔽了第三方 Cookie。大多数浏览器的限制越来越严格,默认 Cookie 政策会屏蔽这些 Cookie。例如,Safari 的阻止跨网站跟踪设置和 Chrome 的在无痕式窗口中阻止第三方 Cookie 设置均默认处于启用状态。

如果您的应用嵌入了 Looker 内容,并且 Looker 实例的域名以 company.looker.com 结尾,则浏览器将不会跨网域对嵌入的 iframe 进行身份验证,除非修改了浏览器的 Cookie 隐私设置。

Looker 托管的实例

由 Looker 托管的管理员如果不希望用户在浏览器中手动启用第三方 Cookie,则需要更改 Looker 托管实例的域名。例如,Looker 托管的实例通常采用 https://<hostname>.<subdomain>.<domain>.com 格式。如果 Looker 域名发生更改,Looker 将不再被视为第三方网域。请参阅如果我的 Looker 实例的网址发生更改,会出现什么情况?页面了解详情。

如果您有兴趣为 Looker 实例添加自定义网域,请与 Looker 支持团队联系,以设置必要的 DNS 配置。

自行托管的实例

如果您要自行托管 Looker 实例,请通过更改 Looker 实例的 DNS 条目,确保使用签名嵌入的应用与 Looker 实例位于同一基础网域上。

Chrome 还要求任何带有 samesite=none 标志的会话 Cookie 也应指定 secure。如果您的 Looker 实例未提供 --ssl-provided-externally-by=<s> 启动标志,Looker 不会发出信号 secure,因此请确保已配置此启动标志。

我仍然遇到问题,现在该怎么办?

如果您在尝试此页面上的建议后仍然遇到问题,请与您的 Looker 联系人联系,或访问 Looker 支持以开立工单。