Rails API:实现身份validation的最佳方式?

我正在编写一个Rails 4应用程序,它将公开一个尚未开发的移动应用程序的API。 用户将使用移动应用程序中的电子邮件和密码进行身份validation。

虽然我已经find了相当多的关于这个话题的信息。 很难辨别是过时的还是非最佳的。 我已经阅读了有关HTTP基本身份validation,这似乎不太安全,基于HTTP令牌的身份validation,但我不知道如何将它与普通的电子邮件和密码身份validation(我使用Devise的方式)。

我只想知道如何实现这个目前最好的做法是什么,所以我一定会以正确的方式。

从安全的angular度来看,重要的一点是交换一次令牌的用户的电子邮件和密码,然后将该令牌用于随后的请求。 这是因为:

  1. 您不希望客户端应用程序负责保存用户的密码,其中的错误或攻击可能导致泄露; 和
  2. 服务器发布的令牌可以让您(和您的用户)在必要时使令牌过期,例如locking被盗设备或阻止行为exception的API客户端。

有很多方法可以完成这个不同程度的复杂性。

这里是一个非常新的教程,并有一个彻底的演练,在基于令牌的身份validation(不使用Devise,但仍然有助于理解概念)在Rails中创build一个API: https : //labs.kollegorna.se/blog/ 2015/04 /集结的-API现在/

@ Roma149这是更多的个人喜好,但大多数人刚开始使用Devise,因为它是最容易的国际海事组织。 OAuth2也是一个不错的select。 作为更重要的注意事项,您可以随时前往Ruby工具箱

那里有很多关于gem的很好的信息,他们甚至会告诉你gem的年龄和受欢迎程度。 这也可以让你区分社区现在真正在萌芽的东西,还是已经陈旧的东西。

记得在Ruby和Ruby On Rails中,并不总是什么更好的gem明智的,但什么最适合你的项目!

另一种select是将下面的模块包含在您的devise模型中,并将auth_token添加到您的表中。

应用程序/模型/关注/ token_authenticable.rb

module TokenAuthenticatable extend ActiveSupport::Concern included do before_save :ensure_auth_token end module ClassMethods def find_by_token(token) find_by(auth_token: token) end end def ensure_auth_token self.auth_token = generate_auth_token if auth_token.blank? end private def generate_auth_token loop do token = Devise.friendly_token break token unless self.class.exists?(auth_token: token) end end end 

应用程序/控制器/ API / V1 / login_controller.rb

 ... def login_user(params) if params[:authentication] @user = User.find_by(auth_token: params[:authentication]) if @user.nil? render json: err('login user by token failed', ERR_USER_NOT_FOUND), status: :not_found event('login_user_by_auth_failed', 'token', params[:authentication]) return else render status: :ok, json: @user return end else user = user.find_by(email: params[:email]) if user.nil? event('login_user_failed_not_found', 'user_email', params[:email]) render json: err("login user not found #{params[:email]}", ERR_USER_NOT_FOUND), status: :not_found return end if user.access_locked? event('login_user_blocked', 'user_id', user.id) render json: err("login user account is locked : #{user.id}", ERR_USER_LOCKED), status: :unauthorized return end unless user.try(:valid_password?, params[:password]) event("login_user_password_does_not_match #{user.id}", 'user_id', user.id) render json: err('login user password does not match', ERR_PASSWORD_NOT_MATCH), status: :unauthorized return end event('login_user_succeeded', 'user_id', user.id) @user= user if @user.save response.headers['authentication'] = @user.auth_token render status: :ok, json: @user return else render json: @user.errors, status: :unprocessable_entity return end end end ... 

编辑:更正了破译错字

Tiddle Gem在仅限API的Ruby on Rails应用程序中为令牌authentication提供Devise策略。 它的主要特点是支持每个用户多个令牌

https://github.com/adamniedzielski/tiddle