Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AJAX请求-cookie身份验证_Javascript_Ruby On Rails_Firefox_Firefox Addon - Fatal编程技术网

Javascript AJAX请求-cookie身份验证

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

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

  • 登录RoR web应用程序
  • 获取浏览器扩展名或bookmarklet(两者共享相同的代码基),以
  • 转到网站并激活小部件
  • 指向网站上要保存的内容,按ok
  • 您可以在web应用程序上获取包含捕获内容的URL
  • 小部件代码中的工作流类似于:

  • 从DOM收集内容并发出相关的jQuery JSONP请求
  • 如果响应中有一条自定义状态消息显示为“unauthorized”,请打开一个带有来自web应用程序的授权页面的
    ——如果在响应中成功进行了身份验证,则会有一个
    Set Cookie
    头设置后续AJAX请求所需的身份验证Cookie
  • 如果需要身份验证,请再次尝试JSONP请求
  • 这只适用于bookmarklet。但是,对于Firefox扩展,web应用程序会接收除去auth cookie的请求。事实上,所有的饼干都被剥夺了。看起来请求已经被沙箱处理了。 现在我知道有
    @mozilla.org/cookieService
    可用于扩展。问题是:

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