绕过经过身份验证的XmlHttpRequests的同源策略

时间:2011-11-07 18:34:05

标签: authentication oauth couchdb same-origin-policy

我的foo.com网站上有PageA

PageA里面有一些JQuery,它通过XmlHttpRequest请求驻留在bar.com的CouchDb实例的一些JSON数据。

据我所知,相同的原始策略阻止了这一点,但JSONP的使用应该绕过这个限制(我相信CORS最终会覆盖这个用例。)

foo.com后面的服务器与bar.com的数据库建立了可信连接。

是否可以让用户使用其OAuth凭据(例如Twitter登录)对foo.com进行身份验证,然后进行身份验证以使用bar.com? (我认为不是由于认证cookie只能被foo.com读取。)

鉴于此,是否有任何方式我可以使用CouchDB的任何可用身份验证机制验证用户在bar.com foo.com使用CouchDB(OAuth, cookie和Basic)?

编辑:我可以从bar.com(通过其可信链接检索)返回foo.com的用户凭据,然后在XmlHttpRequest中设置客户端使用bar.com进行基本身份验证的HTTP标头。当然,所有这些都是通过TLS完成的(......或者这是一场安全噩梦?)

4 个答案:

答案 0 :(得分:3)

从我的POV来看,即使是JSONP也存在安全风险 - 所以我不会走那条路......

要实现您的要求,我会看到两个选项(如果需要,两者都可以使用SSL):

  • 编写自定义webservice / REST / SOAP /在foo.com上运行的任何内容,并代表您与bar.com进行身份验证的客户端交互

  • 使用在foo.com上运行的“通用http代理”,并以您的应用/网页的工作方式映射bar.com,就像CouchDB在bar.com上运行一样经过身份验证的客户

答案 1 :(得分:2)

我在xhr中对同一起源政策有同样的问题。我有一个网站,我想用来自运行CouchDB的不同服务器的JSON数据填充自动完成内容。

有两种方式:

  1. JSONP - 这很好用
  2. 通过主Web服务器代理CouchDB - 从客户端b / c的角度来看,这一切都很好。一切都在同一台主机上。它也使SSL变得可行。
  3. 至于从CouchDB和另一个应用服务器共享登录会话,我不知道如何在不诉诸基本HTTP身份验证的情况下做到这一点,而这种身份验证并不是那么安全。让app server充当中间人b / t客户端和CouchDB可能更好。

    应用服务器中间人的另一个好处是,单个CouchDB数据库可以为多个用户提供文档。相反,如果客户端直接访问CouchDB,您可能需要通过过滤复制为每个用户创建一个单独的数据库,以便一个用户无法查看其他用户的文档。

答案 2 :(得分:0)

您可以从facebook身份验证服务器流程中获取灵感,将客户端替换为您的客户端,将服务器替换为foo.com,将facebook替换为bar.com。看看http://developers.facebook.com/docs/authentication。这样客户端应该经过身份验证才能使用来自bar.com的数据(当然,从bar.com加载的脚本中,你可以将数据传递给foo.com回调,除非我弄错了。)

答案 3 :(得分:0)

据我所知,您希望使用foo.com的JSONP在bar.com上发出请求,同时希望bar.com能够知道此请求是否已经过foo.com验证。

这就像登录foo.com并允许将真实性转移到bar.com。

假设XMLHttpRequest可以记住其余请求的cookie中的会话ID,那么如何使用一次性密码(实际上是一个随机字符串,我们可以称之为令牌)来调用bar.com来自foo.com生成的页面,登录后如下所示:

login request -> foo.com -> XHR(bar.com, OTP) -> bar.com
cookie updated with an active session id <- bar.com
XHR(bar.com, CounchDB) -> bar.com successfully

因此,如果foo.com和bar.com可以私下(并且安全地!)进行通信,foo.com可以生成OTP并将其传递给bar.com,以便bar.com知道只有有效用户才能知道它并且因此可以将会话ID视为已通过身份验证。

替代课程:

  1. 如果XMLHttpRequest用于bar.com的cookie不会在请求中保留,则必须在每个请求中传输相同的OTP。
  2. bar.com必须提供服务以监控foo.com对新添加的OTP的身份验证授权。它应该有一些超时机制来使旧令牌无效。
  3. bar.com也可能还需要提供身份验证删除服务,以防止使用公共计算机时出现风险。
相关问题