我正在构建一个小部件(使用 JavaScript),它需要通过 AJAX 与 RoR 网络应用程序进行交互。用户的工作流程如下所示:
- 登录到 RoR 网络应用
- 获取浏览器扩展或小书签(两者共享相同的代码库),以其为准
- 转到网站并激活小部件
- 在您要保存的那个网站上点东西,按确定
- 您会在网络应用程序上获得包含捕获内容的 URL
小部件代码中的工作流类似于:
- 从 DOM 收集内容并发出相关的 jQuery JSONP 请求
- 如果响应中有自定义状态消息“未授权”,请打开
<iframe />
使用源自 Web 应用程序的授权页面 — 如果身份验证在响应中成功,则会出现Set-Cookie
header 设置后续 AJAX 请求所需的身份验证 cookie - 如果需要身份验证,请再次尝试 JSONP 请求
这只适用于小书签。但是,对于 Firefox 扩展,Web 应用程序会收到剥离了身份验证 cookie 的请求。事实上剥夺了所有的 cookies 。似乎请求被沙盒化了。
现在我知道有 @mozilla.org/cookieService
可用于扩展。问题是:
- 我如何将 cookie 从扩展的 main.js 传递到内容脚本中的 JSONP 请求?
- 如何获取开发环境的 cookie,url 为 localhost:3000?
cookieService
返回 null 作为该 url 的 cookie - 更改身份验证的解决方式(从 cookie 到其他方式)是否可行?
最佳答案
请求并不是真正的沙箱化,而是缺少原始文档。因此,网络代码不知道该请求是第一方 还是第三方 请求,默认情况下将其视为后者。 Firefox 不久前禁止向第三方服务器发送 cookie,这就是为什么您的请求中没有 cookie。
在 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
。这与在(某种程度上)安全的上下文中eval()
ing 远程、不受信任的代码基本相同。您永远不知道周围是否存在中间人攻击者(如果使用不安全的连接)或者服务器是否受到威胁(所有连接)。无论如何,content-scripts 不能使用上述方法,因此您必须在特权代码(例如
main.js
)中执行请求并使用消息传递将响应传递给内容脚本。你真的不应该直接使用
nsICookieService*
。如果您真的喜欢使用该服务,请阅读 docs .我想您可以随时切换到另一个身份验证方案。使用哪一个以及如何使用将取决于您的要求(即太宽泛而无法回答)。
关于javascript - AJAX 请求 - cookie 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123657/