AJAX请求 - Cookie身份验证
问题描述:
我正在构建一个需要通过AJAX与RoR Web应用程序进行交互的小部件(使用JavaScript)。为用户的工作流程是这样的:AJAX请求 - Cookie身份验证
- 登录RoR的Web应用程序
- 获取浏览器扩展或书签(两者共用同一个代码库),取其
- 去一个网站并激活控件 你想在该网站上
- 点东西得到保存,按OK
- 你回来在Web应用程序的URL与所采集内容
在widget代码的工作流程看起来是这样的:从DOM
- 收集的东西,并签发相应的jQuery的JSONP请求
- 如果有在响应读“未经授权”,打开有一个
<iframe />
自定义状态消息从Web应用程序发起授权页 - 如果身份验证是成功的响应有一个Set-Cookie
报头中设置身份验证cookie的需要后续的AJAX requets - 是否有过身份验证需要,尝试JSONP请求再次
这只适用于书签。但是,对于Firefox扩展程序,Web应用程序会收到删除auth cookie的请求。事实上,所有的曲奇都没有。似乎请求被沙箱化。 现在我知道有@mozilla.org/cookieService
可用于扩展。问题是:
- 如何将cookie从扩展的main.js传递到内容脚本中的JSONP请求?
- 我该如何获得开发环境的cookie,url localhost:3000?
cookieService
返回null作为该网址的Cookie - 是否可以更改从cookie到其他身份验证的解析方式?
答
这些请求并非真正的沙盒,但缺少一个原始文档。因为网络代码不知道请求是第一方或第三方请求,并且默认将其视为后者。前段时间,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
。
现在回到你的问题:
-
不要使用
JSONP
。这基本上与(某种程度上)安全的上下文中的远程不可信代码相同。你永远不知道周围是否存在中间人攻击者(如果使用不安全的连接)或服务器是否受到攻击(所有连接)。无论如何,content-scripts无法使用上述方法,因此您必须在特权代码(例如
main.js
)中执行请求并使用消息传递将响应传递给内容脚本。 - 你真的不应该直接使用
nsICookieService*
。如果您真的想使用该服务,请阅读docs。 - 我总是可以切换到另一个认证方案。使用哪一个以及如何去做取决于你的要求(即,回答太宽泛)。