2

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

  1. 登录到 RoR 网络应用程序
  2. 获取浏览器扩展或小书签(两者共享相同的代码库),无论哪个
  3. 转到网站并激活小部件
  4. 在你想保存的那个网站上点东西,按确定
  5. 您会在 Web 应用程序上获取包含捕获内容的 URL

小部件代码中的工作流程类似于:

  1. 从 DOM 收集东西并发出相关的 jQuery JSONP 请求
  2. 如果响应中有一条自定义状态消息读取“未授权”,请打开一个<iframe />来自 Web 应用程序的授权页面 - 如果响应中的身份验证成功,则会有一个Set-Cookie标头设置后续 AJAX 请求所需的身份验证 cookie
  3. 如果需要身份验证,请再次尝试 JSONP 请求

这仅适用于书签。但是,对于 Firefox 扩展程序,Web 应用程序会接收已去除 auth cookie 的请求。事实上,去掉了所有的 cookie。似乎请求是沙盒的。现在我知道有@mozilla.org/cookieService扩展可用。问题是:

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

1 回答 1

0

这些请求并不是真正的沙盒,但缺少原始文档。因为网络代码不知道请求是第一方请求还是第三方请求,并且默认将其视为后者。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

现在回到你的问题:

  1. 不要使用JSONP. eval()这与在(有点)安全的上下文中获取远程、不受信任的代码基本相同。您永远不知道周围是否存在中间人攻击者(如果使用不安全的连接)或服务器是否受到威胁(所有连接)。

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

  2. 你真的不应该nsICookieService*直接使用。如果您真的喜欢使用该服务,请阅读文档

  3. 我猜你总是可以切换到另一个身份验证方案。使用哪一个以及如何使用取决于您的要求(即太宽泛而无法回答)。

于 2013-10-22T16:09:47.893 回答