【问题标题】:Authenticate user before displaying an iFrame在显示 iFrame 之前验证用户
【发布时间】:2015-07-06 16:51:06
【问题描述】:
我正准备开展一个需要从在线应用程序显示仪表板的项目。不幸的是,目前无法使用 API。仪表板可以嵌入到 iFrame 中。但是,当它显示时,它会提示查看仪表板的用户登录帐户。
我有一个此服务的付费帐户。在处理 iFrame 之前,是否有任何 rails gem 可以登录服务?
或者我的 rails 应用程序中的代理会是更好的选择吗?
任何指针表示赞赏!
【问题讨论】:
标签:
ruby-on-rails
ruby
iframe
proxy
embed
【解决方案1】:
Rails gems 和你的 rails 中的代理都不起作用,它们同样有相同的限制。
它们都在后端服务器端运行。
您需要的身份验证是客户端。
除非您的意思是代理整个事物、身份验证请求以及所有后续请求以及与此仪表板的用户交互。这应该可以,但是(见下文)
身份验证的工作方式(几乎普遍)是:一旦您登录到任何系统,它就会在您的浏览器上存储一个 cookie,然后浏览器为每个后续请求发送该 cookie。
如果您在后端进行身份验证,该 cookie 将被发送到您的 rails 代码并在那里消失,而用户浏览器将永远不会知道它。
另外 - 不可能进行身份验证服务器端并捕获 cookie,然后让用户直接使用浏览器浏览网站,原因有两个:
- 有时身份验证 cookie 使用有关浏览器或 HTTP 客户端的信息来加密 cookie,因此从不同的客户端发送相同的 cookie 将不起作用
- 您不能告诉浏览器将 cookie 发送到与您自己不同的域。
所以你的选择是,我现在想不到:
- 如果有一个登录页面接受来自其他域的表单提交,您可以尝试在“登录后”页面模拟直接向该站点提交表单。 (用户填写登录表单后被定向到的页面)。任何现代 Web 框架都可以作为 XSRF 保护(跨站请求伪造保护),出于安全原因将不允许这种方法。
- 查看此站点使用的身份验证是否具有任何类型的 OAUTH、单点登录 (SSO) 或您可以执行的类似类型的身份验证集成。 (类似于 API,因此您可能已经探索过此选项)
- 通过您的服务器将所有请求代理到此站点。您将不得不重写整个 HTML,以便所有图像、CSS、样式表和所有其他资产也通过代理路由,否则 URL 在 HTML 中被重写为不相关。如果一个网站不是为这个用例设计的,你可能会碰壁。从诸如使用相对 URL 来获取您未代理的资产的站点、引用非相对 URL 的站点导致跨域错误等。请注意,要重新编写每个最后的资产引用真的很难,它不仅您担心的 HTML,Javascript 也可以包含 URL,CSS 也可以。
- 您可以编写小书签或浏览器扩展程序,让用户登录网站。
- 让每个人都安装 Lastpass
- 让每个人都安装 TamperMonkey 浏览器扩展(以及其他类似浏览器的其他浏览器),并编写一个小的用户脚本来自动运行自定义 javascript 以使用户登录该站点
- 从该网站上抓取您需要的信息并将其提供到您自己的网站上。
好的,我没有想法。 :)