如何最好地在Rails中存储用户凭据

时间:2014-09-15 00:10:52

标签: ruby-on-rails api rest ember.js

我之前使用了会话变量,即session[:user_id]来跟踪当前用户,但我现在正试图让我的应用程序与EmberJS一起使用,需要Grape API后端而不是控制器等。我想知道,跨页面跟踪用户凭据的最佳方法是什么:会话,Cookie或线程?我此刻倾向于线程,但我想知道每个人的利弊是什么?

1 个答案:

答案 0 :(得分:0)

API中的身份验证略有不同。通过传递某种类型的令牌而不是每次会话一次,应该对每个请求授权用户。

通常,您将拥有一条接受用户名/密码的路由,该路由将返回一个身份验证令牌,然后该令牌将作为BasicAuth的一部分传递或在每个请求的头文件中传递。在Grape中,有几种方法可以做到这一点。您可以添加身份验证帮助程序:

module ApiHelpers
  module Authentication

    def authenticate!
      error!('401 Unauthorized', 401) unless current_user
    end

    def current_user
      if token_from_headers
        @current_user ||= User.find_by api_key: token_from_headers[1]
      end
    end

    def authenticate!
      error!('401 Unauthorized', 401) unless current_user
    end

    def token_from_headers
      /Token token="(.+)"/.match(headers['Authorization'])
    end
  end
end

在主api文件中包含:

class API < Grape::API
  helpers ApiHelpers::Authentication
end

然后,对于每个需要身份验证的请求:

resource :items do
  get do
    authenticate!
    present current_user.items, with: Entities::Item
  end
end

您还可以添加自定义中间件进行身份验证或使用基本身份验证进行身份验证。关于Grape自述文件中的更多信息:https://github.com/intridea/grape#authentication

我假设您的终端使用SSL?