在没有会话cookie的情况下设计token_authenticatable

时间:2013-03-08 15:22:01

标签: ruby-on-rails devise session-cookies access-token

我正在使用Rails 3,并且我已经成功构建了一个web api。对于一堆控制器,需要登录,所以我决定使用Devise和token_authenticable。它工作但不完全像我期望的那样:我虽然需要为每个请求提供我的登录令牌,但它看起来只需要一次,然后系统在响应中创建一个cookie,就像普通的浏览器会话一样。我希望实现像facebook graph api这样的东西,其中每个请求都需要提交会话令牌才能工作。

如果我正在使用网络API并且如果我正在使用浏览器发送会话cookie,那么我可以设置任何标志来指示Devise不发送会话cookie吗?

2 个答案:

答案 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以便忽略会话。