AJAX请求 - cookie身份验证

时间:2013-04-20 18:19:22

标签: javascript ruby-on-rails firefox firefox-addon

我正在构建一个小部件(使用JavaScript),需要通过AJAX与RoR Web应用程序进行交互。用户的工作流程如下所示:

  1. 登录RoR网络应用
  2. 获取浏览器扩展程序或书签(两者共享相同的代码库),以
  3. 为准
  4. 转到网站并激活小部件
  5. 点击要保存的网站上的内容,按确定
  6. 您在网页应用中获取了包含捕获内容的网址
  7. 窗口小部件代码中的工作流程类似于:

    1. 从DOM收集内容并发出相关的jQuery JSONP请求
    2. 如果响应中显示“未经授权”的自定义状态消息,请打开带有源自Web应用程序的授权页面的<iframe /> - 如果auth在响应中成功,则会有Set-Cookie标头设置后续AJAX请求所需的auth cookie
    3. 如果需要auth,请再次尝试JSONP请求
    4. 这适用于书签。但是,对于Firefox扩展,Web应用程序会接收剥离了auth cookie的请求。事实上剥去了所有的饼干。似乎请求是沙盒。 现在我知道有@mozilla.org/cookieService可用于扩展。问题是:

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

1 个答案:

答案 0 :(得分:0)

请求并非真正沙盒,但缺少原始文档。因此,网络代码不知道请求是第一方还是第三方请求,并且默认情况下将其视为后者。 Firefox暂时禁止向第三方服务器发送cookie,这就是您的请求中没有cookie的原因。

在XUL / XPCOM插件中,您可以(最简单的方式):

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

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

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

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

现在回到你的问题:

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

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

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