【问题标题】:Devise token_authenticatable without session cookies设计可在没有会话 cookie 的情况下进行身份验证的令牌
【发布时间】:2013-02-24 04:41:02
【问题描述】:

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

是否可以设置任何标志来指示 Devise 在我使用 Web api 时不发送会话 cookie 并在我使用浏览器时发送会话 cookie?

【问题讨论】:

  • 如果它发送了一个会话 cookie 而你忽略了它 --- 有什么坏处吗?
  • 也不错。事实上,这就是它目前的工作方式。这绝对不是生死攸关的问题……我只是好奇
  • 如果您将会话存储在数据库(或 memcache 或其他)中,每次签署用户时,您都会在基础中添加一行。因此,如果您的 API 被广泛使用,这可能是一个问题。因此,如果您可以登录用户但不存储会话,那就太好了。

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


【解决方案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

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

【讨论】:

    【解决方案2】:

    我使用了protect_from_forgery with: :null_session,所以该会话被忽略了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2019-05-22
      • 2014-06-08
      • 2020-05-05
      相关资源
      最近更新 更多