2013-04-20 165 views
2

我正在构建一个需要通过AJAX与RoR Web应用程序进行交互的小部件(使用JavaScript)。为用户的工作流程是这样的:AJAX请求 - Cookie身份验证

  1. 登录RoR的Web应用程序
  2. 获取浏览器扩展或书签(两者共用同一个代码库),取其
  3. 去一个网站并激活控件
  4. 你想在该网站上
  5. 点东西得到保存,按OK
  6. 你回来在Web应用程序的URL与所采集内容

在widget代码的工作流程看起来是这样的:从DOM

  1. 收集的东西,并签发相应的jQuery的JSONP请求
  2. 如果有在响应读“未经授权”,打开有一个<iframe />自定义状态消息从Web应用程序发起授权页 - 如果身份验证是成功的响应有一个Set-Cookie报头中设置身份验证cookie的需要后续的AJAX requets
  3. 是否有过身份验证需要,尝试JSONP请求再次

这只适用于书签。但是,对于Firefox扩展程序,Web应用程序会收到删除auth cookie的请求。事实上,所有的曲奇都没有。似乎请求被沙箱化。 现在我知道有@mozilla.org/cookieService可用于扩展。问题是:

  1. 如何将cookie从扩展的main.js传递到内容脚本中的JSONP请求?
  2. 我该如何获得开发环境的cookie,url localhost:3000? cookieService返回null作为该网址的Cookie
  3. 是否可以更改从cookie到其他身份验证的解析方式?

回答

0

这些请求并非真正的沙盒,但缺少一个原始文档。因为网络代码不知道请求是第一方第三方请求,并且默认将其视为后者。前段时间,Firefox禁用了向第三方服务器发送cookies,这就是为什么你的请求中没有cookies。

在XUL/XPCOM插件,您会怎么做(最简单的方法):

var req = <construct xmlhttprequest>; 
... 
req.open(...); 
if (req.channel instanceof Components.interfaces.nsIHttpChannelInternal) { 
    req.channel.forceAllowThirdPartyCookie = true; 
} 

附加SDK用户将可以执行以下操作使用net/xhr时:

const { XMLHttpRequest, forceAllowThirdPartyCookie } = require("sdk/net/xhr"); 
var req = new XMLHttpRequest(); 
... 
req.open(...); 
forceAllowThirdPartyCookie(req); 

的更高级别的request模块始终自动调用forceAllowThirdPartyCookie

现在回到你的问题:

  1. 不要使用JSONP。这基本上与(某种程度上)安全的上下文中的远程不可信代码相同。你永远不知道周围是否存在中间人攻击者(如果使用不安全的连接)或服务器是否受到攻击(所有连接)。

    无论如何,content-scripts无法使用上述方法,因此您必须在特权代码(例如main.js)中执行请求并使用消息传递将响应传递给内容脚本。

  2. 你真的不应该直接使用nsICookieService*。如果您真的想使用该服务,请阅读docs
  3. 我总是可以切换到另一个认证方案。使用哪一个以及如何去做取决于你的要求(即,回答太宽泛)。