你好,
背景
我开发了一个应用程序,使用 Discourse API 并将 SSO 作为身份提供商。目前,该应用通过 iframe 嵌入显示,因此为了让社交登录正常工作,/login 页面需要在新的浏览器标签页中打开,而不是在 iframe 内。
到目前为止,一切正常。
问题
当新用户通过社交按钮注册时,他们会被正确重定向到社交网站。但一旦返回 Discourse,问题就出现了:Discourse 显示的是普通登录弹窗,而不是已预填用户名/邮箱的注册确认弹窗。
要看到那个用于完成注册的弹窗,您需要先关闭登录弹窗,然后手动点击“注册”按钮。
仅对新用户存在此问题,登录功能对现有用户来说表现正常。
是我遗漏了什么,还是 Discourse 在某些场景下处理不当?从技术角度看,这两种情况本应一致。
如果您想查看演示,请告诉我,我可以通过私信发送一段简短视频(其中包含一些隐私信息)。
欢迎提供任何帮助!
是的。(抱歉使用了非英语文本,我正在为一位使用希伯来语的客户工作)
请提供一下帮助,好吗?
更准确地说,该应用用于 Chrome 扩展。由于目前别无选择,我们使用了 iframe。但即便如此,我仍不确定通过 iframe 在浏览器中编程方式打开新标签页访问 /login 或 /signup,与手动打开标签页并点击登录/注册按钮之间有何区别。
这是否可以在 Discourse 中修复?
目前我们将 Discourse 用作 SSO 提供商。还有其他方法吗?
如果有,在这种场景下实现登录/注册的最佳方式是什么?
david
(David Taylor)
5
你是如何实现这一点的?听起来好像某些 cookies 或会话在某个地方丢失了。
一般来说,我们不支持在 iframe 中使用 Discourse。正如你所发现的,其中存在一些奇怪的异常,可能会导致问题。
我并没有将 Discourse 嵌入到 iframe 中,而是使用 API 来展示主题消息。
我并不是试图在 iframe 内部 进行登录或注册,因为社交网站通常不允许在 iframe 中显示。因此,当用户在 iframe 内点击按钮时,会打开一个新的浏览器标签页,跳转到 Discourse 的 /login 页面。
从技术上讲,当用户点击登录按钮时,会打开一个新标签页并访问 /session/sso_provider。return_sso_url 将包含一个指向后端的 URL,用于处理数据、保存用户会话信息,然后返回一些 HTML 以自动关闭该窗口。随后,应用程序会检测到操作已完成,并自动重新加载,以便使用已保存的用户会话。
即使应用程序不在 iframe 中,这种情况也很可能发生。由于这是一个浏览器扩展,无论如何都必须打开新标签页。我在想,在这种情况下是否有更好的登录/注册方式。
编辑:这是一个演示(本不想公开,但这是展示问题最简短的方式,而且我觉得我之前的解释不够清楚):
已删除,视频已移除,反正也没人在意
编辑2:似乎仅在通过 API 使用 /session/sso_provider 时才会发生;如果直接打开 Discourse 的 URL(仍然从 iframe 中),问题似乎不会出现。