2013-03-08 83 views
4

我使用Rails 3,併成功構建了Web API。對於一堆控制器登錄是必需的,所以我決定使用Devise和token_authenticable。它正在工作,但並不像我期待的那樣:雖然我需要爲每個請求提供我的登錄標記,但它看起來只需要一次,然後系統會在響應中創建一個cookie,就像普通的瀏覽器會話一樣。我想實現類似於facebook圖形API的事情,其中​​每個請求都需要提交會話標記才能工作。在沒有會話cookie的情況下設計token_authenticatable

是否有任何標誌可以設置指示如果我正在使用web api併發送會話cookie(如果我正在使用瀏覽器),Devise不會發送會話cookie?

+0

如果它發送會話cookie,並且您忽略它---是否有任何損害? – 2013-03-08 15:31:03

+0

這也很好。事實上,這就是目前的工作方式。這絕對不是一個生死攸關的問題......我只是好奇而已 – user1170896 2013-03-08 17:16:57

+0

如果您將會話存儲在數據庫(或者memcache或其他)中,每次簽名用戶時,都會在您的基礎中添加一行。所以,如果你的API被廣泛使用,這可能是一個問題。所以,如果你可以登錄一個用戶但不存儲會話,那將是十分嚴峻的。 – joel1di1 2014-01-15 00:36:31

回答

1

我有同樣的問題。

有我的API的會話控制線:

warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure") 

有人登錄用戶,並創建一個會話(這是我沒有在第一通知)

的解決方案是使用與此類似(在blogpost找到):

@user=User.find_by_email(email.downcase) 
if @user.nil? 
    render :status=>401, :json=>{:message=>"Invalid email or password."} 
    return 
end 

# http://rdoc.info/github/plataformatec/devise/master/Devise/Models/TokenAuthenticatable 
@user.ensure_authentication_token! 

if not @user.valid_password?(password) 
    logger.info("User #{email} failed signin, password \"#{password}\" is invalid") 
    render :status=>401, :json=>{:message=>"Invalid email or password."} 
else 
    render :status=>200, :json=>{:token=>@user.authentication_token} 
end 

基本上沒有登錄用戶,但檢索令牌。除註銷外的其他應用程序部分工作正常。

0

我使用protect_from_forgery with: :null_session以便會話被忽略。

相關問題