API Rails: meilleur moyen d’implémenter l’authentification?

J’écris une application Rails 4 qui exposera une API pour une application mobile qui n’a pas encore été développée. Les utilisateurs s’authentifieront en utilisant un e-mail et un mot de passe de l’application mobile.

Bien que j’ai trouvé pas mal d’informations sur le sujet. Il est difficile de discerner ce qui est daté ou non optimal. J’ai lu à propos de HTTP Basic Auth, qui ne semble pas trop sécurisé, et HTTP Token-based Auth, mais je ne sais pas comment coupler cela avec une authentification régulière par courrier électronique et mot de passe (j’utilise Devise par le chemin).

Je voudrais juste savoir quelle est la meilleure pratique actuelle sur la façon de mettre en œuvre ceci, alors je vais être sûr d’aller dans le bon sens.

Le point important, du sharepoint vue de la sécurité, consiste à échanger une fois le courrier électronique et le mot de passe de l’utilisateur pour un jeton, puis à utiliser ce jeton pour les demandes suivantes. Ceci est dû au fait:

  1. Vous ne voulez pas que l’application cliente soit responsable du mot de passe de l’utilisateur, où un bogue ou une attaque pourrait provoquer une fuite; et
  2. Un jeton émis par un serveur vous permet (et à vos utilisateurs) d’exécuter un jeton si nécessaire, par exemple pour verrouiller un périphérique volé ou bloquer un client API défectueux.

Il y a plusieurs façons d’accomplir ceci avec différents niveaux de complexité.

Voici un didacticiel très récent qui explique comment créer une API dans Rails avec une authentification basée sur des jetons (ne pas utiliser Devise, mais toujours pertinent pour comprendre les concepts): https://labs.kollegorna.se/blog/ 2015/04 / build-an-api-now /

Une autre option consiste à inclure le module ci-dessous dans votre modèle et à append le fichier auth_token à votre table.

app / modèles / soucis / 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 

app / controllers / 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 ... 

Edit: Correction de la faute de frappe de code

@ Roma149 C’est davantage une préférence personnelle, mais la plupart des gens qui débutent utilisent Devise, car c’est la solution la plus simple. OAuth2 est également une bonne option. Comme note plus importante, vous pouvez toujours aller à la Ruby Toolbox

Il y a beaucoup de bonnes informations sur les gemmes là-bas et ils vous disent même l’âge et la popularité de la gemme. Cela vous permettra également de faire la distinction entre les joyaux sur lesquels la communauté se penche actuellement et ceux qui sont devenus obsolètes.

Rappelez-vous dans Ruby et Ruby On Rails ce n’est pas toujours ce qu’il y a de mieux, mais ce qui convient le mieux à votre projet!

Tiddle gem fournit une stratégie Devise pour l’authentification par jeton dans les applications Ruby on Rails API uniquement. Sa principale caractéristique est la prise en charge de plusieurs jetons par utilisateur .

https://github.com/adamniedzielski/tiddle