2013-04-20 166 views
2

我正在構建一個需要通過AJAX與RoR Web應用程序進行交互的小部件(使用JavaScript)。爲用戶的工作流程是這樣的:AJAX請求 - Cookie身份驗證

  1. 登錄RoR的Web應用程序
  2. 獲取瀏覽器擴展或書籤(兩者共用同一個代碼庫),取其
  3. 去一個網站並激活控件
  4. 你想在該網站上
  5. 點東西得到保存,按OK
  6. 你回來在Web應用程序的URL與所採集內容

在widget代碼的工作流程看起來是這樣的:從DOM

  1. 收集的東西,並簽發相應的jQuery的JSONP請求
  2. 如果有在響應讀「未經授權」,打開有一個<iframe />自定義狀態消息從Web應用程序發起授權頁 - 如果身份驗證是成功的響應有一個Set-Cookie報頭中設置身份驗證cookie的需要後續的AJAX requets
  3. 是否有過身份驗證需要,嘗試JSONP請求再次

這隻適用於書籤。但是,對於Firefox擴展程序,Web應用程序會收到刪除auth cookie的請求。事實上,所有的曲奇都沒有。似乎請求被沙箱化。 現在我知道有@mozilla.org/cookieService可用於擴展。問題是:

  1. 如何將cookie從擴展的main.js傳遞到內容腳本中的JSONP請求?
  2. 我該如何獲得開發環境的cookie,url localhost:3000? cookieService返回null作爲該網址的Cookie
  3. 是否可以更改從cookie到其他身份驗證的解析方式?

回答

0

這些請求並非真正的沙盒,但缺少一個原始文檔。因爲網絡代碼不知道請求是第一方第三方請求,並且默認將其視爲後者。前段時間,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

現在回到你的問題:

  1. 不要使用JSONP。這基本上與(某種程度上)安全的上下文中的遠程不可信代碼相同。你永遠不知道周圍是否存在中間人攻擊者(如果使用不安全的連接)或服務器是否受到攻擊(所有連接)。

    無論如何,content-scripts無法使用上述方法,因此您必須在特權代碼(例如main.js)中執行請求並使用消息傳遞將響應傳遞給內容腳本。

  2. 你真的不應該直接使用nsICookieService*。如果您真的想使用該服務,請閱讀docs
  3. 我總是可以切換到另一個認證方案。使用哪一個以及如何去做取決於你的要求(即,回答太寬泛)。