So konfigurieren Sie Devise und OmniAuth für Ihre Rails-Anwendung

Einführung

Die meisten Ruby on Rails-Anwendungen erfordern Benutzerregistrierungs- und Authentifizierungsmechanismen. Das Entwickeln von Grund auf erfordert viel Zeit und Mühe - zum Glück gibt es * Devise *. Mit dem Devise Gem können Sie innerhalb von Minuten ein vollwertiges Benutzerauthentifizierungssystem einrichten.

Sie können Ihre Benutzer jedoch glücklicher machen, indem Sie ihnen den Zugriff auf Ihre Anwendung ermöglichen, ohne ein neues Konto zu erstellen. Sie können sich einfach mit ihren vorhandenen Konten bei Facebook, Twitter, Amazon oder DigitalOcean anmelden. Tatsächlich können Sie die Authentifizierung bei jedem gängigen OAuth-Dienstanbieter unterstützen. OAuth-Unterstützung wird von OmniAuth bereitgestellt. In diesem Tutorial erstellen wir eine einfache Anwendung, die sowohl Devise als auch OmniAuth verwendet.

Voraussetzungen

Stellen Sie vor dem Start sicher, dass auf Ihrem Host die neuesten Versionen von RVM, Ruby und Rails installiert sind. Wenn nicht, folgen Sie bitte den Anweisungen hier: https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise- pangolin-with-rvm [Installieren von Ruby on Rails unter Ubuntu 12.04 LTS mit RVM]

Dieses Tutorial wurde mit Ruby 2.1.2 und Rails 4.1.5 getestet.

Schritt 1 - Erstellen Sie eine neue Rails-Anwendung

Es wird empfohlen, dass Sie alle Ihre Rails-Anwendungen in einem separaten Verzeichnis haben.

Sie sollten jetzt eine erstellen.

mkdir rails_apps
cd rails_apps

Sie müssen die RVM-Umgebung initialisieren, bevor Sie mit der Ausgabe von Rails-Befehlen beginnen.

Wenn Sie eine Pause einlegen, während Sie diesem Lernprogramm folgen, müssen Sie dies bei jedem Neustart der Terminalsitzung tun.

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

Nennen wir die neue Anwendung * myapp *. Geben Sie nach dem Erstellen der Anwendung das Basisverzeichnis der Anwendung ein.

rails new myapp
cd myapp
  • Hinweis: Alle Rails-Befehle sollten aus dem Verzeichnis Ihrer Anwendung ausgeführt werden, in diesem Fall ~ / rails_apps / myapp. *

Schritt 2 - Fügen Sie die erforderlichen Edelsteine ​​zur Gemfile hinzu

Wir brauchen die Edelsteine ​​"Devise" und "OmniAuth". Darüber hinaus benötigen Sie für jeden OAuth-Dienstleister, den Sie unterstützen möchten, ein separates Juwel. In diesem Lernprogramm unterstützen wir die Anmeldung mit DigitalOcean, daher benötigen wir das Juwel.

Fügen Sie die folgenden Zeilen am Ende der Datei "+ ~ / rails_apps / myapp / Gemfile +" hinzu. Sie können als Texteditor verwenden.

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

Sie benötigen ähnliche Juwelen, um andere Anbieter zu unterstützen. Um beispielsweise Facebook zu unterstützen, benötigen Sie. Hier sind einige solche Edelsteine ​​als Referenz:

  • Twitter - omniauth-twitter

  • Amazon - Omniauth-Amazon

  • Google - Omniauth-Google

  • Github - Omniauth-Github

Installieren Sie die neu hinzugefügten Edelsteine.

bundle install

Schritt 3 - Hinzufügen grundlegender Funktionen zur Anwendung

Lassen Sie uns dieser Anwendung schnell ein paar Seiten zum Testen hinzufügen. Eventuell sind diese Seiten erst nach dem Einloggen zugänglich.

Hierfür können wir die Gerüstfunktion von Rails verwenden. Mit dem Befehl geben wir einfach die Details zu einem Modell an, und Rails generiert voll funktionsfähige Seiten, um CRUD-Operationen (Create Read Update Delete) für dieses Modell auszuführen. Mit anderen Worten, alle zugeordneten Steuerungen und Ansichten werden zusammen mit der Modelldatei generiert.

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

Als nächstes müssen wir die Wurzel dieser Anwendung definieren.

Bearbeiten Sie "+ ~ / rails_apps / myapp / config / routes.rb " und fügen Sie die Zeile " root" products # index "+" hinzu, um das Stammverzeichnis der App direkt unter der vorhandenen Zeile anzugeben. Sie können alle auskommentierten Zeilen ignorieren. Wenn Sie fertig sind, sehen die aktiven Zeilen in der Datei folgendermaßen aus:

Rails.application.routes.draw do
 resources :products

end

Testen Sie jetzt Ihre Anwendung. Starten Sie den Entwicklungsserver, indem Sie Folgendes eingeben:

rails s

Besuchen Sie localhost über Ihren Browser. Wenn Sie remote entwickeln, ersetzen Sie * localhost * durch die entsprechende IP-Adresse oder Domain für Ihr Droplet. * 3000 * ist die Standardportnummer für den Entwicklungsserver.

Für den Moment ist kein Login erforderlich. Fügen Sie ein paar Produkte hinzu, indem Sie auf "Neues Produkt" klicken. Wenn Sie zufrieden sind, dass Ihre Anwendung wie erwartet funktioniert, kehren Sie zum Terminal zurück und drücken Sie Strg + C, um den Server zu stoppen.

Schritt 4 - Einrichten des Geräts

Geben Sie die folgenden Befehle ein, um die Devise-Authentifizierungsunterstützung hinzuzufügen.

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

Hierdurch werden die Anmelde- und Anmeldeformulare sowie die gesamte zugehörige Logik hinzugefügt.

Unsere App verfügt nun über ein grundlegendes Authentifizierungssystem, mit dem sich Benutzer registrieren und anschließend anmelden können. Alle Seiten sind jedoch weiterhin direkt zugänglich. Um dies zu ändern, bearbeiten Sie "+ ~ / rails_apps / myapp / app / controller / application_controller.rb +" und fügen Sie eine Aktion hinzu, die ausgeführt werden muss, bevor eine Seite bereitgestellt wird.

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

end

Wenn Sie möchten, können Sie den Entwicklungsserver mit dem Befehl erneut starten und diese neu hinzugefügten Seiten unter + http: //: 3000 / + auschecken (verwenden Sie erneut Ihre eigene Domain oder IP-Adresse). Sie sollten eine Seite sehen, die so aussieht:

Sie können sich als neuer Benutzer registrieren, indem Sie "+ http: // localhost: 3000 / users / sign_up +" besuchen.

Schritt 5 - Aktualisieren Sie das Benutzermodell, um OmniAuth zu unterstützen

Wenn Sie den Server erneut gestartet haben, beenden Sie ihn mit STRG-C. Fügen Sie dem von Devise generierten Modell eine neue Spalte mit dem Namen hinzu.

rails g migration AddColumnsToUsers provider uid
rake db:migrate

Schritt 6 - Beziehen Sie die Client-ID und das Client-Geheimnis vom OAuth-Dienstanbieter

Besuchen Sie die Website des Diensteanbieters und registrieren Sie Ihre Anwendung dort. Alle Dienstleister haben unterschiedliche Registrierungsverfahren. Informationen zu DigitalOcean finden Sie im Lernprogramm unter https://www.digitalocean.com/community/tutorials/how-to-use-oauth-authentication-with-digitalocean-as-a-user-or-developer[How To Use OAuth-Authentifizierung mit DigitalOcean als Benutzer oder Entwickler

Während des Registrierungsvorgangs werden Sie nach einer Rückruf-URL gefragt. Für jeden Anbieter gibt es eine separate Rückruf-URL. Hier sind die Rückruf-URLs für einige beliebte Dienstanbieter:

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

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

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

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

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

Bitte ersetzen Sie * localhost * durch eine IP-Adresse oder Domain, die in Ihr Droplet aufgelöst wird. Am Ende des Registrierungsprozesses erhalten Sie Ihre Kunden-ID und Ihr Kundengeheimnis. Diese Werte werden Sie im nächsten Schritt verwenden.

Schritt 7 - Aktualisieren Sie den Devise Initializer

Bearbeiten Sie "+ ~ / rails_apps / myapp / config / initializers / devise.rb ", um die Client-IDs und Geheimnisse am Ende der Datei unmittelbar vor der Zeile " end +" hinzuzufügen. Es ist auch eine gute Idee, das auf etwas zu aktualisieren, das den Namen und den Benutzer Ihres eigenen Servers enthält. Über diese beiden Elemente hinaus müssen Sie keine weiteren Änderungen vornehmen.

Nach der Bearbeitung würde Ihre Datei folgendermaßen aussehen (die Datei enthält auch viele kommentierte Zeilen):

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

Schritt 8 - Aktualisieren Sie das Benutzermodell

Das von Devise generierte Benutzermodell muss geändert werden, um die Dienstanbieter anzugeben, die wir verwenden möchten. Wir fügen der vorhandenen Liste drei Elemente hinzu (*: omniauthable,: omniauth_providers ⇒ [: digitalocean] *, und vergessen Sie das zusätzliche Komma nicht!). Wir erstellen auch eine neue Methode mit dem Namen, um die Informationen zu extrahieren, die nach der Authentifizierung verfügbar sind.

Nach der Bearbeitung sollte Ihr + ~ / rails_apps / myapp / app / models / user.rb + folgendermaßen aussehen:

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

Speicher die Datei.

Schritt 9 - Hinzufügen eines Controllers zum Behandeln der Rückruf-URLs

Bearbeiten Sie zunächst "+ ~ / rails_apps / myapp / config / routes.rb +" und aktualisieren Sie die Zeile, um den Namen des Controllers anzugeben, der die Rückrufe verarbeiten soll. Nennen wir es einfach * Rückruf *. Ihre Datei sollte jetzt so aussehen (ohne die kommentierten Abschnitte):

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

Erstellen Sie dann eine neue Datei "+ ~ / rails_apps / myapp / app / controller / callbacks_controller.rb +".

Fügen Sie den folgenden Code hinzu:

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

Wenn Sie mehr OAuth-Anbieter verwendet haben, benötigen Sie für jeden eine eigene Methode. Der Name der Methode sollte mit dem Namen des Anbieters übereinstimmen. Um beispielsweise die Unterstützung für Facebook hinzuzufügen, wird Ihre Methode mithilfe von definiert.

Ihre Bewerbung ist jetzt fertig. Starten Sie Ihren Server erneut:

rails s

Besuchen Sie Ihre Homepage. Da wir die Anmeldefunktion testen, möchten Sie dies möglicherweise in einer Sitzung ohne gespeicherte Daten tun, z. B. in einem Chrome Incognito-Fenster. Sie sollten einen * Mit Digitalocean anmelden * -Link sehen. Klick es an. Sie sollten zur Anmeldeseite von DigitalOcean weitergeleitet werden. Nach einer erfolgreichen Anmeldung werden Sie zurück zu Ihrer eigenen Anwendung geleitet und die Produktseite wird angezeigt.

Fazit

Sie verfügen jetzt über ein modernes Benutzerauthentifizierungssystem für Ihre App, bei dem sich Benutzer mit einer E-Mail-Adresse, einem Konto für soziale Netzwerke oder einem anderen beliebten Dienst anmelden können.

Wenn Sie sich jemals dafür entscheiden, diese App für die Produktion auf einem Droplet zu verwenden, können Sie sich auf das Tutorial hier beziehen: https://www.digitalocean.com/community/tutorials/how-to-launch-your-ruby-on-rails- App mit dem digitalen One-Click-Image [So starten Sie Ihre Ruby on Rails-App mit dem digitalen One-Click-Image von DigitalOcean]. Wenn Sie Ihre App zu einem neuen Droplet hinzufügen, vergessen Sie nicht, zu Schritt 6 zurückzukehren, um Ihre DigitalOcean-API-Einstellungen mit den Rückruf-URLs Ihres Produktionsservers zu aktualisieren.