4

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

如果我使用 web api,是否可以设置任何标志来指示 Devise 不发送会话 cookie,如果我使用浏览器则发送会话 cookie?

4

2 回答 2

1

我有同样的问题。

我的 API 的 Sessions 控制器中有一行:

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

它正在登录用户并创建一个会话(一开始我没有注意到)

解决方案是使用与此类似的东西(在博文中找到

@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

基本上不是登录用户,而是检索令牌。除注销外,应用程序的其他部分工作正常。

于 2013-04-19T16:47:09.083 回答
1

我使用 protect_from_forgery with: :null_session了这样的会话被忽略。

于 2016-02-10T00:25:26.640 回答