我正在构建一个小部件(使用JavaScript),需要通过AJAX与RoR Web应用程序进行交互。用户的工作流程如下所示:
窗口小部件代码中的工作流程类似于:
<iframe />
- 如果auth在响应中成功,则会有Set-Cookie
标头设置后续AJAX请求所需的auth cookie 这适用于书签。但是,对于Firefox扩展,Web应用程序会接收剥离了auth cookie的请求。事实上剥去了所有的饼干。似乎请求是沙盒。
现在我知道有@mozilla.org/cookieService
可用于扩展。问题是:
cookieService
返回null作为该网址的Cookie 答案 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
。
现在回到你的问题:
请勿使用JSONP
。这与(某种程度上)安全上下文中的eval()
远程不受信任的代码基本相同。你永远不知道是否有中间人攻击(如果使用不安全的连接)或服务器受到攻击(所有连接)。
无论如何,内容脚本不能使用上述方法,因此您必须使用特权代码(例如main.js
)执行请求,并使用消息传递将响应传递给内容脚本。
nsICookieService*
。如果您真的想使用该服务,请阅读docs。