2011-05-19 58 views
0

我有一個表格,提交時,它會調用一個jQuery阿賈克斯要求如:發帖形成,說用戶沒有登錄,會話cookie存在

$.ajax({ 
type:"POST", 
url: "/posts/" + id + "/add_comment", 
.. 
.. 
}); 

這個網站有子域,以及登錄後會話cookie的樣子:

name: __webt_session 
value: ... 
host: testsubdomain.lvh.me 
path:/
Secure: No 
Expires: At end of session 

現在,當我提交意見,它不保存註釋,而它重定向到登錄頁面(html的是登錄頁面,它不」 actaully重定向b/c這是幕後的ajax調用)。

我的表單操作的url是否必須包含子域?

BTW,爲什麼它說「安全:NO」

UPDATE

我設置了帖子的網址,包括完整的URL瓦特/子域,它仍然重定向到登錄頁面。 爲什麼不拾起cookie?

當我在發佈表單的頁面上時,我登錄得很好。該網址中包含子網域。當我張貼到頁面時,出於某種原因,它認爲我沒有登錄並重定向我(您必須登錄才能發表評論)。非常困惑,爲什麼它不拾取cookie。

想法?

+1

如果一個cookie被設置爲「安全」,比它只會通過HTTPS來傳輸(不通過HTTP) – Claudio 2011-05-19 21:44:08

+0

我看到好,感謝該名稱。 – Blankman 2011-05-19 21:48:56

+0

您使用哪個認證庫?那個庫和rails的哪個版本? – andrewmitchell 2011-05-19 22:05:43

回答

1

確保您的文章有軌authenticity_token如果您的控制器的動作有protect_from_forgery

在軌3.0.x的(X> 3)如果verify_authenticity_token失敗,它記錄你出去,所以你的身份驗證將失敗。

UPDATE

要在你的JavaScript後做到這一點,你要添加一個名爲authenticity_token後的參數。此參數的值可以通過兩種方式確定:

1)在您的控制器調用form_authenticity_token並將此值傳遞給javascript。

2)在你的佈局,加入這一行

<%= csrf_meta_tag %> 

這將以下內容添加到您的文檔的頭部

<meta name="csrf-param" content="authenticity_token"/> 
<meta name="csrf-token" content="Sm8z1XLTzI5HCy7+MIB+yFXiGUdS1byUHI8brHknirY="/> 

你可以用這樣一個小的JavaScript retrive的崗位價值:

document.getElementsByName('csrf-token')[0].content 

在此版本中,您可以超級正確並使用值爲

document.getElementsByName('csrf-param')[0].content 

確定之後的參數

+0

啊,謝謝我希望這是它!由於這是一個ajax調用,我必須以某種方式手動將它添加到我的.js文件中,然後將它作爲參數傳遞給.ajax調用。 – Blankman 2011-05-19 22:10:52

+0

如何從控制器內訪問令牌? – Blankman 2011-05-19 22:16:55

+0

郵票前面應該放置什麼? .js的代碼片段似乎正在修改其他內置導軌的其他內容,我的是自定義的。 – Blankman 2011-05-19 22:19:22