Javascript AJAX请求-cookie身份验证
我正在构建一个小部件(使用JavaScript),它需要通过AJAX与RoR web应用程序交互。用户的工作流如下所示:Javascript AJAX请求-cookie身份验证,javascript,ruby-on-rails,firefox,firefox-addon,Javascript,Ruby On Rails,Firefox,Firefox Addon,我正在构建一个小部件(使用JavaScript),它需要通过AJAX与RoR web应用程序交互。用户的工作流如下所示: 登录RoR web应用程序 获取浏览器扩展名或bookmarklet(两者共享相同的代码基),以 转到网站并激活小部件 指向网站上要保存的内容,按ok 您可以在web应用程序上获取包含捕获内容的URL 小部件代码中的工作流类似于: 从DOM收集内容并发出相关的jQuery JSONP请求 如果响应中有一条自定义状态消息显示为“unauthorized”,请打开一个带有来自we
——如果在响应中成功进行了身份验证,则会有一个Set Cookie
头设置后续AJAX请求所需的身份验证Cookie@mozilla.org/cookieService
可用于扩展。问题是:
cookieService
将null作为该url的cookie返回请求不是真正的沙盒,而是缺少原始文档。因此,网络代码不知道该请求是第一方请求还是第三方请求,默认情况下会将其视为第三方请求。Firefox不久前禁止向第三方服务器发送cookie,这就是为什么您的请求中没有cookie 在XUL/XPCOM附加组件中,您可以执行以下操作(最简单的方法): 较高级别的
请求
模块始终自动调用forceAllowThirdPartyCookie
现在回到你的问题:
JSONP
。这基本上与eval()
在(某种程度上)安全的上下文中删除远程、不受信任的代码相同。您永远不知道周围是否有中间人攻击者(如果使用不安全的连接),或者服务器是否受到威胁(所有连接)
无论如何,内容脚本不能使用上述方法,因此您必须使用特权代码(例如main.js
)执行请求,并使用消息传递将响应传递给内容脚本
nsICookieService*
。如果您真的喜欢使用该服务,请阅读
var req = <construct xmlhttprequest>;
...
req.open(...);
if (req.channel instanceof Components.interfaces.nsIHttpChannelInternal) {
req.channel.forceAllowThirdPartyCookie = true;
}
const { XMLHttpRequest, forceAllowThirdPartyCookie } = require("sdk/net/xhr");
var req = new XMLHttpRequest();
...
req.open(...);
forceAllowThirdPartyCookie(req);