Comment configurer Devise et OmniAuth pour votre application Rails

introduction

La plupart des applications Ruby on Rails nécessitent des mécanismes d’enregistrement et d’authentification de l’utilisateur. Leur développement à partir de zéro demande beaucoup de temps et d’efforts - heureusement, il existe * Devise *. En utilisant la gemme Devise, vous pouvez configurer un système d’authentification d’utilisateur à part entière en quelques minutes.

Cependant, vous pourriez rendre vos utilisateurs plus heureux en leur permettant d’accéder à votre application sans créer de nouveau compte. Ils pourraient simplement se connecter en utilisant leurs comptes Facebook, Twitter, Amazon ou DigitalOcean existants. En fait, vous pouvez prendre en charge l’authentification auprès de tout fournisseur de services OAuth populaire. Le support OAuth est fourni par la gemme OmniAuth. Dans ce tutoriel, nous allons créer une application simple qui utilise à la fois Devise et OmniAuth.

Conditions préalables

Avant de commencer, assurez-vous que les dernières versions de RVM, Ruby et Rails sont installées sur votre hôte. Si vous ne le faites pas, suivez les instructions ci-dessous: https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise- pangolin-with-rvm [Comment installer Ruby on Rails sur Ubuntu 12.04 LTS avec RVM]

Ce tutoriel a été testé avec Ruby 2.1.2 et Rails 4.1.5.

Étape 1 - Créer une nouvelle application Rails

Il est recommandé de regrouper toutes vos applications Rails dans un répertoire séparé.

Vous devriez en créer un maintenant.

mkdir rails_apps
cd rails_apps

Vous devez initialiser l’environnement RVM avant de commencer à émettre des commandes Rails.

Si vous faites une pause en suivant ce didacticiel, n’oubliez pas de le faire chaque fois que vous redémarrez votre session de terminal.

. ~/.rvm/scripts/rvm
rvm use ruby --default

Appelons la nouvelle application * myapp *. Après avoir créé l’application, utilisez pour entrer le répertoire de base de l’application.

rails new myapp
cd myapp
  • Remarque: Toutes les commandes Rails doivent être exécutées à partir du répertoire de votre application, qui est dans ce cas ~ / rails_apps / myapp. *

Étape 2 - Ajouter les gemmes requises au gemfile

Nous aurons besoin des joyaux Devise et OmniAuth. En outre, vous aurez également besoin d’une gemme distincte pour chaque fournisseur de services OAuth que vous souhaitez prendre en charge. Pour ce tutoriel, nous prendrons en charge la connexion à l’aide de DigitalOcean. Nous avons donc besoin de la gemme.

Ajoutez les lignes suivantes à la fin du fichier + ~ / rails_apps / myapp / Gemfile +. Vous pouvez utiliser comme éditeur de texte.

gem 'therubyracer'
gem 'devise'
gem 'omniauth'
gem 'omniauth-digitalocean'

Vous aurez besoin de gemmes similaires pour prendre en charge d’autres fournisseurs. Par exemple, pour soutenir Facebook, vous aurez besoin de. Voici certains de ces joyaux pour votre référence:

  • Twitter - omniauth-twitter

  • Amazon - omniauth-amazon

  • Google - omniauth-google

  • Github - omniauth-github

Installez les gemmes nouvellement ajoutées.

bundle install

Étape 3 - Ajouter des fonctionnalités de base à l’application

Ajoutons rapidement quelques pages à cette application pour les tests. Finalement, ces pages ne seront accessibles qu’après la connexion.

Nous pouvons utiliser la fonction d’échafaudage de Rails à cet effet. A l’aide de la commande, nous spécifions simplement les détails d’un modèle et Rails génère des pages entièrement fonctionnelles pour effectuer des opérations CRUD (Créer Lecture, Supprimer, Supprimer) sur ce modèle. En d’autres termes, tous les contrôleurs et vues associés sont générés, ainsi que le fichier de modèle.

rails g scaffold Product name:string price:integer description:text
rake db:migrate

Ensuite, nous devons définir la racine de cette application.

Éditez + ~ / rails_apps / myapp / config / routes.rb + et ajoutez la ligne + racine 'products # index' + pour spécifier la racine de l’application, juste en dessous de la ligne existante. Vous pouvez ignorer toutes les lignes qui sont commentées. Une fois que vous avez terminé, les lignes actives du fichier ressemblent à ceci:

Rails.application.routes.draw do
 resources :products

end

Allez-y, testez votre application maintenant. Démarrez le serveur de développement en tapant:

rails s

Visitez localhost à partir de votre navigateur. Si vous développez à distance, veuillez remplacer * localhost * par l’adresse IP ou le domaine approprié pour votre Droplet. * 3000 * est le numéro de port par défaut du serveur de développement.

Pour l’instant, aucun identifiant n’est requis. Ajoutez quelques produits en cliquant sur «Nouveau produit». Une fois que vous êtes convaincu que votre application fonctionne comme prévu, retournez au terminal et appuyez sur Ctrl + C pour arrêter le serveur.

Étape 4 - Configurer Devise

Tapez les commandes suivantes pour ajouter la prise en charge de l’authentification Devise.

rails generate devise:install
rails generate devise User
rake db:migrate

Cela ajoute les formulaires de connexion et d’inscription, ainsi que toute la logique associée.

Notre application dispose désormais d’un système d’authentification de base, dans lequel les utilisateurs peuvent s’inscrire eux-mêmes, puis se connecter. Cependant, toutes les pages sont toujours directement accessibles. Pour changer cela, éditez + ~ / rails_apps / myapp / app / controllers / application_controller.rb + et ajoutez-le en tant qu’action à exécuter avant de servir une page.

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception

end

Si vous le souhaitez, vous pouvez redémarrer le serveur de développement à l’aide de la commande et consulter les pages récemment ajoutées en visitant + http: //: 3000 / + (utilisez à nouveau votre propre domaine ou votre adresse IP). Vous devriez voir une page qui ressemble à ceci:

image: https: //assets.digitalocean.com/articles/Configure_Devise/1.jpg [page de connexion]

Vous pouvez vous enregistrer en tant que nouvel utilisateur en visitant + http: // localhost: 3000 / users / sign_up +.

Étape 5 - Mise à jour du modèle d’utilisateur pour prendre en charge OmniAuth

Si vous avez redémarré le serveur, arrêtez-le avec CTRL-C. Ajoutez une nouvelle colonne appelée au modèle généré par Devise.

rails g migration AddColumnsToUsers provider uid
rake db:migrate

Étape 6 - Obtenez l’ID client et le secret client auprès du fournisseur de services OAuth.

Visitez le site Web du fournisseur de services et enregistrez votre application là-bas. Tous les fournisseurs de services ont des procédures d’enregistrement différentes. Pour DigitalOcean, reportez-vous au tutoriel ici: Comment utiliser Authentification OAuth avec DigitalOcean en tant qu’utilisateur ou développeur

Une URL de rappel vous sera demandée lors de la procédure d’inscription. Il existe une URL de rappel distincte pour chaque fournisseur. Voici les URL de rappel de quelques fournisseurs de services populaires:

  • Digital Ocean: http: //: 3000 / users / auth / digitalocean / callback

  • Facebook: http: //: 3000 / utilisateurs / auth / facebook / callback

  • Amazon: http: //: 3000 / users / auth / amazon / callback

  • Twitter: http: //: 3000 / users / auth / twitter / callback

  • Google: http: //: 3000 / users / auth / google / callback

Veuillez remplacer * localhost * par une adresse IP ou un domaine qui résout votre Droplet. À la fin du processus d’inscription, vous recevrez votre ID client et votre secret client. Vous utiliserez ces valeurs à l’étape suivante.

Étape 7 - Mise à jour de l’initialiseur Devise

Éditez + ~ / rails_apps / myapp / config / initializers / devise.rb + pour ajouter les identifiants client et les secrets au bas du fichier, juste avant la ligne + end +. Il est également judicieux de mettre à jour le avec quelque chose qui porte le nom et l’utilisateur de votre propre serveur. Vous n’avez pas besoin de faire d’autres changements que ces deux éléments.

Après édition, votre fichier ressemblerait à ceci (il y aura également beaucoup de lignes commentées dans le fichier):

Devise.setup do |config|
 #Replace example.com with your own domain name
 config.mailer_sender =

 require 'devise/orm/active_record'
 config.case_insensitive_keys = [ :email ]
 config.strip_whitespace_keys = [ :email ]
 config.skip_session_storage = [:http_auth]
 config.stretches = Rails.env.test? ? 1 : 10
 config.reconfirmable = true
 config.expire_all_remember_me_on_sign_out = true
 config.password_length = 8..128
 config.reset_password_within = 6.hours
 config.sign_out_via = :delete

 #Add your ID and secret here
 #ID first, secret second

end

Étape 8 - Mettre à jour le modèle d’utilisateur

Le modèle utilisateur généré par Devise doit être modifié pour spécifier les fournisseurs de services que nous souhaitons utiliser. Nous ajoutons trois éléments à la liste existante (*: omniauthable,: omniauth_providers ⇒ [: digitalocean] *, et n’oubliez pas la virgule supplémentaire!). Nous créons également une nouvelle méthode nommée pour extraire les informations disponibles après l’authentification.

Après l’avoir édité, votre + ~ / rails_apps / myapp / app / models / user.rb + devrait ressembler à ceci:

class User < ActiveRecord::Base
 devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:digitalocean]

 def self.from_omniauth(auth)
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.provider = auth.provider
       user.uid = auth.uid
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
     end
 end
end

Enregistrez le fichier.

Étape 9 - Ajouter un contrôleur pour gérer les URL de rappel

Commencez par éditer + ~ / rails_apps / myapp / config / routes.rb + et mettez à jour la ligne pour spécifier le nom du contrôleur qui gérera les rappels. Appelons-le simplement * callbacks *. Votre fichier devrait maintenant ressembler à ceci (moins les sections commentées):

Rails.application.routes.draw do
 devise_for :users
 resources :products
 root 'products#index'
end

Ensuite, créez un nouveau fichier + ~ / rails_apps / myapp / app / controllers / callbacks_controller.rb +.

Ajoutez-y le code suivant:

class CallbacksController < Devise::OmniauthCallbacksController
   def digitalocean
       @user = User.from_omniauth(request.env["omniauth.auth"])
       sign_in_and_redirect @user
   end
end

Si vous avez utilisé plus de fournisseurs OAuth, vous aurez besoin d’une méthode distincte pour chacun d’eux. Le nom de la méthode doit correspondre au nom du fournisseur. Par exemple, pour ajouter un support pour Facebook, votre méthode sera définie à l’aide de.

Votre application est maintenant prête. Relancez votre serveur:

rails s

Visitez votre page d’accueil. Puisque nous testons la fonctionnalité de connexion, vous souhaiterez peut-être le faire dans une session sans données stockées, telle qu’une fenêtre Chrome Incognito. Vous devriez voir un lien * Connexion avec Digitalocean *. Clique dessus. Vous devez être redirigé vers la page de connexion de DigitalOcean. Après une connexion réussie, vous serez redirigé vers votre propre application et la page des produits sera affichée.

image: https: //assets.digitalocean.com/articles/Configure_Devise/2.jpg [Connectez-vous avec DigitalOcean]

Conclusion

Vous disposez maintenant d’un système moderne d’authentification d’utilisateur pour votre application, dans lequel les utilisateurs peuvent se connecter à l’aide d’une adresse électronique, d’un compte de réseau social ou d’un autre service populaire.

Si vous décidez de mettre cette application en production sur Droplet, vous pouvez vous reporter au tutoriel ici: https://www.digitalocean.com/community/tutorials/how-to-launch-your-ruby-on-rails- app-with-the-digitalocean-one-click-image [Comment lancer votre application Ruby on Rails avec l’image One Click de DigitalOcean]. Si vous ajoutez votre application à un nouveau Droplet, n’oubliez pas de revenir à l’étape 6 pour mettre à jour les paramètres de votre API DigitalOcean avec les URL de rappel de votre serveur de production.