2013-03-08 64 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以便会话被忽略。

相关问题