将特定数据转换为HTTP GET请求

我试图实现一个身份验证机制,其中每个浏览器选项卡可能以不同的用户身份登录。

这是这个系统的规则:

  • 身份验证令牌指示哪个用户登录。
  • 有两种认证令牌:私有的和公共的。
  • 每个私人令牌都绑定到单个选项卡并确定其帐户信息。
  • 公共令牌可以通过任何选项卡读取/写入,并指示已登录的最后一个帐户(跨所有选项卡)。
  • 当用户在任何选项卡中注销时,私有和公共令牌都将被删除。
  • 每次标签碰到需要认证的页面时,系统都会尝试读取私人标记。 如果未设置(如新建/空白选项卡),则会尝试将公共令牌的值复制到私有令牌中。 如果未设置公共令牌,则用户将被重定向至认证屏幕。
  • 当一个选项卡已经登录并且用户点击一个链接时,该请求必须在自定义HTTP标头中包含私有令牌。 出于安全原因,在URI中发送此信息不是一个选项。
  • 使用后退/前进按钮进行导航的能力与正常链接的相同(意味着没有提示重新提交表单数据)。
  • 我到目前为止所尝试的是:

  • 对私有和公共令牌使用cookies :这不起作用,因为服务器无法知道要查找哪个cookie。如果用户从选项卡中单击链接,请求会将所有Cookie发送到所有选项卡,并且服务器无法知道链接上点击了哪一个。

  • sessionStorage存储专用标记:这不起作用,因为当用户单击链接时,无法指定应与HTTP GET请求一起发送的自定义标头。

  • 使用AJAX请求页面,然后使用数据URI导航到内存中的页面:出于安全原因,Internet Explorer不允许将HTML URI内容用于HTML内容。 请参阅http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx

  • 使用<form method="get" enctype="multipart/form-data">并使用隐藏字段传递令牌:enctype =“multipart / form-data”仅支持POST。

  • 使用<form method="post" enctype="multipart/form-data">并使用隐藏字段传递令牌:理论上,这应该可行,但现在如果用户使用后退/前进按钮。

  • 使用AJAX请求页面,然后使用document.open(); document.write(); document.close()重写当前页面document.open(); document.write(); document.close() document.open(); document.write(); document.close() document.open(); document.write(); document.close() 。 我尝试了https://stackoverflow.com/a/4404659/14731和http://forums.mozillazine.org/viewtopic.php?p=5767285&sid=d6a5a2e8e311598cdbad124e277e0f52#p5767285,并且在这两种情况下新的<head>块永远不会被执行。

  • 有任何想法吗?


    好的,在经历了许多不同的迭代之后,下面是我们结束的实现:

    变量

  • 有两种数据存储:
  • IndexedDB,它在所有选项卡之间共享。
  • sessionStorage每个选项卡都是唯一的。
  • 我们存储以下变量:
  • IndexedDB的包含publicTokennextTabId
  • sessionStorage包含privateTokentabId
  • publicToken,privateToken

  • 有关身份验证令牌的定义,请参阅https://stackoverflow.com/a/1592572/14731。
  • 有两种认证令牌:公共和私有。
  • publicToken是所有选项卡上最后一次登录操作返回的令牌。
  • privateToken是当前标签上次登录操作返回的标记。
  • tabId

  • 每个选项卡由称为tabId的标记唯一标识。
  • nextTabId是一个可通过所有选项卡访问的数字。
  • 如果选项卡没有ID,它将根据nextTabId创建一个新的nextTabId并递增其值。
  • 例如, tabId的值可以是“com.company.Tab X ”,其中XnextTabId返回的nextTabId
  • 登录/注销

  • 每次选项卡登录, privateTokenpublicToken使用由服务器返回的认证令牌覆盖。
  • 当用户注销时,我们删除privateTokenpublicToken在浏览器端,并privateToken在服务器端。 我们不会删除服务器端的publicToken
  • 这意味着,只要有一个标签注销,所有共享相同privateToken所有标签也会被注销。 任何使用不同令牌的选项卡都不会受到影响。
  • 多个标签何时共享相同的privateToken标签? 当您在新窗口或选项卡中打开链接时,它会继承父标签的privateToken
  • 如果我们要删除publicToken在服务器上,以注销标签privateToken X, publicToken Y就应该引起标签privateToken y以得到注销(这是不可取的)。
  • 在页面加载

  • 扫描页面以获取HTML链接。
  • 对于每个链接,将一个tabId查询参数附加到该URL。 参数值等于tabId的值。
  • 使用history.replaceState()从当前页面剥离tabId URL参数,以便用户可以与他们的朋友共享链接( tabId是用户特定的并且不能共享)。
  • 删除tabId cookie(更多信息在下面)。
  • 点击链接时

  • 该选项卡会创建一个tabId cookie并遵循链接。
  • 该cookie的名称等于tabId的值,并且其值等于privateToken的值
  • 当服务器收到请求时

  • 如果缺少tabId参数,则将浏览器重定向到GetTabId.html?referer=X ,其中X是当前URL。
  • 如果tabId存在但认证令牌无效或过期,则将浏览器重定向到登录屏幕。
  • GetTabId.html

  • 如果标签没有一个privateToken ,复制publicTokenprivateToken
  • 如果两个privateTokenpublicToken是不确定的,重定向到登录页面。
  • 该页面使用名为referer的URL参数,该参数指示成功时重定向的位置。
  • 如果选项卡具有privateToken ,则将tabId参数附加到referer页面并将其重定向回来。
  • 重定向时使用window.location.replace()从浏览器历史记录中删除GetTabId.html
  • 为什么我们要继续删除/添加Cookie?

  • 我们尽量减少每个请求发送到服务器的cookie的数量。
  • 如果我们没有在页面加载时删除tabId cookie,那么每次标签发出请求时,所有其他标签的cookie也会发送。
  • 已知的问题

  • “查看源代码”打开URL缺少tabId 。 因此,它获取重定向到GetTabId.html而不是实际页面的页面的源代码。
  • GetTabId.html页面重新加载(客户端重定向到GetTabId.html并返回到原始页面)。
  • 对长期实施细节抱歉,但我找不到更简单/更短的解决方案。

    链接地址: http://www.djcxy.com/p/21993.html

    上一篇: specific data to an HTTP GET request

    下一篇: token based authentication in php