使用无会话设计时current_user是什么?

时间:2014-02-12 23:19:00

标签: ruby-on-rails authentication devise

我在rails api中禁用了会话,例如config.skip_session_storage = [:http_auth, :token_auth]

api的“注销”是否有意义?如果它确实如何获取current_user,因为下面的代码抛出current_user = nil错误或warden.authenticate失败。

# class Api::V1::SessionsController < Devise::SessionsController

  def create
   # create token
  end

  def destroy
    # We don't need this because the user is authenticated by the token.
    warden.authenticate!(:scope => resource_name, :store => false, :recall => "#{controller_path}#failure")
    current_user.reset_authentication_token!
    render :status => 200,
           :json => { :success => true,
                      :info => t("devise.sessions.signed_out"),
                      :data => {} }
  end

1 个答案:

答案 0 :(得分:1)

API没有状态,因为它不依赖于浏览器来缓存任何内容。通常,如果您想要保护API,您可以为每个用户提供某种访问令牌(通过呈现的html或直接在javascript中(请参阅gon gem))然后通过SSL操作API,需要每次调用拥有该访问令牌。

例如,您可以致电https://mysite.com/api/v1/users?token=...

然后根据该令牌获取current_user

或者,只要进行API调用,就可以在标头中包含令牌。无论哪种方式,您都希望使用SSL保护它,以便没有人路由请求(例如假的星巴克的wifi)可以嗅探请求,获取令牌并自行使用它。