javascript - AJAX 请求 - cookie 认证

标签 javascript ruby-on-rails firefox firefox-addon

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

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

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

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

这只适用于小书签。但是,对于 Firefox 扩展,Web 应用程序会收到剥离了身份验证 cookie 的请求。事实上剥夺了所有的 cookies 。似乎请求被沙盒化了。 现在我知道有 @mozilla.org/cookieService可用于扩展。问题是:

  1. 我如何将 cookie 从扩展的 main.js 传递到内容脚本中的 JSONP 请求?
  2. 如何获取开发环境的 cookie,url 为 localhost:3000? cookieService返回 null 作为该 url 的 cookie
  3. 更改身份验证的解决方式(从 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

现在回到你的问题:

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

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

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

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

关于javascript - AJAX 请求 - cookie 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123657/

相关文章:

sql - rails 和 PSQL : how to convert a column of type STRING to UUID with a fallback value

javascript - IE 使用 JQuery 做了一些奇怪的事情

html - JSoup 看不到 HTML 中的红色字体(在 Firefox 中)<img> 标签

Javascript/XML DOM 不工作?

javascript - 从另一个日期选择器选择另一个值后获取日期选择器起始值

ruby-on-rails - RoR3 : 1) how to return specific field on query? 上的 Mongoid 2) 需要什么 inverse_of?

css - Ruby 无法找到 Foundation/foundation-global?

css - 为什么 firefox 和 IE 不把图片放在一个 li 中

javascript - 尝试用 jQuery 制作一个简单的网格

javascript - 我可以取消附加到父 div 的子 div 的所有 jquery 事件吗?