我正在使用Rails 3,并且我已经成功构建了一个web api。对于一堆控制器,需要登录,所以我决定使用Devise和token_authenticable。它工作但不完全像我期望的那样:我虽然需要为每个请求提供我的登录令牌,但它看起来只需要一次,然后系统在响应中创建一个cookie,就像普通的浏览器会话一样。我希望实现像facebook graph api这样的东西,其中每个请求都需要提交会话令牌才能工作。
如果我正在使用网络API并且如果我正在使用浏览器发送会话cookie,那么我可以设置任何标志来指示Devise不发送会话cookie吗?
答案 0 :(得分:1)
我遇到了同样的问题。
我的API的Sessions控制器中有一行:
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
基本上不记录用户,但检索令牌。除了退出之外的其他应用程序工作正常。
答案 1 :(得分:0)
我使用protect_from_forgery with: :null_session
以便忽略会话。