Grundlegende Benutzerauthentifizierungsfunktion mit Devise
Ich möchte eine Registrierung mit einem Klick für die SNS-Authentifizierung vornehmen, ohne eine temporäre Registrierungs-E-Mail zu durchlaufen
Wenn Sie Benutzerinformationen standardmäßig in Devise bearbeiten, werden Sie jedes Mal nach einem Kennwort gefragt. Da dies jedoch nicht benutzerfreundlich ist, möchte ich Benutzerinformationen bearbeiten, ohne ein Kennwort einzugeben
Memorandum. Behalten Sie den Quellcode für dieses Projekt auf GitHub.
https://github.com/zizynonno/devise_omniauth
Erstellen Sie ein neues Projekt.
$ rails new devise_omniauth
$ cd devise_omniauth
Fügen Sie dem Gemfile den folgenden Edelstein hinzu.
Gemfile
source 'https://rubygems.org'
(Kürzung)...
# Devise
gem 'devise'
gem 'devise-i18n'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'dotenv-rails'
Gemfile
gem 'devise' #Benutzerauthentifizierung
gem 'devise-i18n' #i18n entwickeln
gem 'omniauth-twitter' #Twitter-Authentifizierung
gem 'omniauth-facebook' #Facebook-Authentifizierung
gem 'dotenv-rails' #Umgebungsvariablen einstellen
Installieren Sie gem.
$ bundle install
Gerätebezogene Dateien hinzugefügt.
$ rails g devise:install
Wenn Sie diesen Befehl ausführen, informiert Sie das Terminal über die Einstellungen in Englisch. Lassen Sie uns von 1 bis 4 laufen.
** 2.1 Standard-URL angeben **
config/environments/development.rb
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
(Kürzung)...
# mailer setting
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
end
** 2.2 Angabe von root_url ** Geben Sie die Seite an, die angezeigt werden soll, wenn Sie auf * http: // localhost: 3000 / * zugreifen, das in Nr. 1 angegeben ist. Wir haben in diesem Projekt keine Seiten erstellt, daher fügen wir sie zuerst hinzu.
Fügen wir einen Pages-Controller und einen Index hinzu und zeigen Sie Seiten an.
$ rails g controller Pages index show
Geben Sie in route.rb Folgendes an.
config/routes.rb
Rails.application.routes.draw do
root 'pages#index'
get 'pages/show'
(Kürzung)...
end
** 2.3 Flash-Nachricht hinzufügen ** Wenn Sie sich anmelden, wird oben eine Meldung wie "Sie haben sich angemeldet" angezeigt. Fügt das angegebene Tag direkt unter dem
-Tag in die folgende Datei ein.erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>DeviseRails5</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%#von hier%>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%#Bisher%>
<%= yield %>
</body>
</html>
** 2.4 Geräteansicht generieren **
$ rails g devise:views
Dann wird die folgende Datei generiert.
app/views/devise/shared/_links.html.erb (Teilweise für Link)
app/views/devise/confirmations/new.html.erb (Bildschirm der Authentifizierungsmail erneut senden)
app/views/devise/passwords/edit.html.erb (Bildschirm zum Ändern des Passworts)
app/views/devise/passwords/new.html.erb (Bildschirm zum Senden einer E-Mail, wenn Sie Ihr Passwort vergessen haben)
app/views/devise/registrations/edit.html.erb (Bildschirm zum Ändern der Benutzerinformationen)
app/views/devise/registrations/new.html.erb (Benutzerregistrierungsbildschirm)
app/views/devise/sessions/new.html.erb (Anmeldebildschirm)
app/views/devise/unlocks/new.html.erb (Entsperren Sie den Bildschirm zum erneuten Senden von E-Mails)
app/views/devise/mailer/confirmation_instructions.html.erb (Text zur Bestätigung des E-Mail-Kontos)
app/views/devise/mailer/password_change.html.erb (Mail-Passwort-Änderungsabschlusserklärung)
app/views/devise/mailer/reset_password_instructions.html.erb (Anweisung zum Zurücksetzen des E-Mail-Passworts)
app/views/devise/mailer/unlock_instructions.html.erb (Schalte den Text für die Mail frei)
$ rails g devise User
Bei der Ausführung werden die Migrationsdatei und die Benutzerdatei erstellt.
db/migrate/20200912194315_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
# ## Trackable
# t.integer :sign_in_count, default: 0, null: false
# t.datetime :current_sign_in_at
# t.datetime :last_sign_in_at
# t.string :current_sign_in_ip
# t.string :last_sign_in_ip
# ## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
# ## Lockable
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
t.timestamps null: false
end
end
end
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
Ich werde nur diejenigen auskommentieren, die dies verwenden.
db/migrate/20200912194315_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
add_index :users, :confirmation_token, unique: true
add_index :users, :unlock_token, unique: true
end
end
Fügen Sie zusätzlich zu dem, was Sie in die Migrationsdatei eingefügt haben, "omniauth_providers: [: twitter ,: facebook]" hinzu, um die OAuth-Authentifizierung durchzuführen.
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable, omniauth_providers: [:twitter,:facebook]
end
Fügen Sie dann den in omniauth-twitter, omniauth-facebook verwendeten provider
, uid
und username
zur Benutzertabelle hinzu.
$ rails g migration add_columns_to_users provider uid username
Die folgende Migrationsdatei wird erstellt.
db/migrate/20200912194427_add_columns_to_users.rb
class AddColumnsToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :provider, :string
add_column :users, :uid, :string
add_column :users, :username, :string
end
end
Sobald Sie dies getan haben, gehen Sie wie folgt vor:
$ rake db:migrate
Erstellen Sie eine Anwendung aus den folgenden.
Wenn die Erstellung abgeschlossen ist, wählen Sie "Plattform hinzufügen" -> "Website" aus den Einstellungen. Geben Sie die URL in die Site-URL ein (Beispiel: "http: // localhost: 3000").
Erstellen Sie eine Anwendung aus den folgenden.
Nehmen Sie nach Abschluss der Erstellung die folgenden Einstellungen unter "Einstellungen" vor.
http: // ~ / users / auth / twitter
Kopieren Sie jeden API-Schlüssel und jeden geheimen Schlüssel und fügen Sie ihn an die entsprechenden Stellen unten ein.
config/initializers/devise.rb
Devise.setup do |config|
# The secret key used by Devise. Devise uses this key to generate
(Kürzung)...
config.omniauth :facebook, 'Geben Sie die App-ID ein', 'Geben Sie App Secret ein' #Ich werde es bald korrigieren
config.omniauth :twitter, 'Geben Sie den API-Schlüssel ein', 'Geben Sie das API-Geheimnis ein' #Bitte verpflichten Sie sich nicht zu GitHub, da wir dies bald korrigieren werden
end
Sie müssen eine Methode mit demselben Namen wie "Anbieter" definieren. Da die Rückrufverarbeitung jedoch grundsätzlich jedem Anbieter gemeinsam ist, wird sie mit der Methode "callback_from" vereinheitlicht.
$ rails generate devise:controllers users
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
callback_from :facebook
end
def twitter
callback_from :twitter
end
private
def callback_from(provider)
provider = provider.to_s
@user = User.find_for_oauth(request.env['omniauth.auth'])
if @user.persisted?
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize)
sign_in_and_redirect @user, event: :authentication
else
session["devise.#{provider}_data"] = request.env['omniauth.auth']
redirect_to new_user_registration_url
end
end
end
Richten Sie das Routing für OAuth-Rückrufe wie folgt ein:
config/routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
# ...
end
Wir haben jeden API-Schlüssel und geheimen Schlüssel für die Twitter-Authentifizierung und die Facebook-Authentifizierung erhalten. Diese Informationen sind äußerst vertraulich und sollten niemals nach außen weitergegeben werden. Da die Gefahr eines Missbrauchs besteht, müssen Maßnahmen ergriffen werden, um zu verhindern, dass der API-Schlüssel und der geheime Schlüssel versehentlich im Remote-Repository von GitHub oder in der Produktionsumgebung für die Öffentlichkeit freigegeben werden.
Da wir zu Beginn die Bundle-Installation gem'dotenv-Rails haben, um Umgebungsvariablen festzulegen, lernen wir, wie man den API-Schlüssel und den geheimen Schlüssel mit dotenv-Rails verwendet.
** 5.1 Installation der .env-Datei ** Platzieren Sie als Nächstes die ENV-Datei, die die Umgebungsvariablen definiert, im ** Projektstamm der App **. Die .env-Datei wird nicht automatisch generiert, selbst wenn Sie die Installation "dotenv-Rails" bündeln. Daher müssen Sie die Datei manuell mit dem Befehl touch erstellen, wie unten gezeigt.
$ touch .env
** 5.2 Fügen Sie Folgendes in die .env-Datei ein **
.env
TWITTER_API_KEY="Erhaltener Twitter API-Schlüssel"
TWITTER_SECRET_KEY="Erhaltener geheimer Twitter-Schlüssel"
FACEBOOK_API_ID="Erhaltener Facebook API-Schlüssel"
FACEBOOK_API_SECRET="Erhaltener geheimer Facebook-Schlüssel"
** 5.3 Umgebungsvariablen verwenden ** Weisen Sie der fest codierten Datei Umgebungsvariablen zu, indem Sie eine Beschreibungsmethode wie ENV [SECRET_KEY] verwenden.
config/initializers/devise.rb
Devise.setup do |config|
# The secret key used by Devise. Devise uses this key to generate
(Kürzung)...
config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET_KEY']
config.omniauth :facebook, ENV['FACEBOOK_API_ID'], ENV['FACEBOOK_API_SECRET']
end
Erstellen Sie im Benutzermodell ** self.from_omniauth ** und ** self.new_with_session **. Wenn Sie in self.from_omniauth nach UID und Anbieter suchen, wird es erstellt, andernfalls wird es erstellt. Wenn Sie für self.new_with_session diese Methode nicht hinzufügen, werden die als Authentifizierungsinformationen erhaltenen UIDs und Anbieter usw. nicht registriert, auch wenn Sie sich nach der Twitter-Authentifizierung auf der Anmeldeseite registrieren. Da sie nicht registriert sind, werden Sie jedes Mal als nicht registrierter Benutzer zur Anmeldeseite weitergeleitet, auch wenn Sie sich bei Twitter authentifizieren.
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable, :timeoutable, :omniauthable, omniauth_providers: [:twitter]
def self.from_omniauth(auth)
find_or_create_by(provider: auth["provider"], uid: auth["uid"]) do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.username = auth["info"]["nickname"]
end
end
def self.new_with_session(params, session)
if session["devise.user_attributes"]
new(session["devise.user_attributes"]) do |user|
user.attributes = params
end
else
super
end
end
end
Die Kombination von "UID" und "Provider" ist einzigartig, was den Benutzer erreicht. Erstellen Sie es, wenn es im Datensatz nicht vorhanden ist.
app/models/user.rb
class User < ActiveRecord::Base
# ...
def self.find_for_oauth(auth)
user = User.where(uid: auth.uid, provider: auth.provider).first
unless user
user = User.create(
uid: auth.uid,
provider: auth.provider,
email: User.dummy_email(auth),
password: Devise.friendly_token[0, 20]
)
end
user.skip_confirmation! #Sofortige Registrierung ohne vorübergehende Registrierungs-E-Mail
user
end
private
def self.dummy_email(auth)
"#{auth.uid}-#{auth.provider}@example.com"
end
end
Wenn Sie die Authentifizierung auch mit einer E-Mail-Adresse implementieren, müssen Sie die E-Mail-Adresse bei der Authentifizierung mit OAuth speichern. Hier wird unter Ausnutzung der einzigartigen Kombination von "uid" und "provider" als "self.dummy_email" generiert.
Bearbeiten Sie die folgende Datei so, dass der zuvor erstellte Controller als Controller für den Rückruf aufgerufen wird. Wenn Sie dies nicht schreiben, wird der Controller auf der Geräteseite aufgerufen.
config/routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
root 'pages#index'
get 'pages/show'
(Kürzung)...
end
Sie können sich jetzt bei Twitter authentifizieren. Wenn Sie zum ersten Mal eine Twitter-Authentifizierung durchführen, werden Sie zur Anmeldeseite weitergeleitet, auf der Sie Ihre E-Mail-Adresse und Ihr Passwort eingeben können, um sich zu registrieren, und Ihre Benutzerinformationen werden registriert. Da ich diesmal die bestätigbare Funktion hinzugefügt habe, erhalte ich die Meldung, dass ich nach der Registrierung eine Bestätigungsnachricht gesendet habe und mich nicht so anmelden kann, wie sie ist. Wenn Sie diese Funktion nicht einschließen, werden Sie sofort nach der Registrierung angemeldet.
app/model/user.rb
class User < ActiveRecord::Base
# ...
def self.find_for_oauth(auth)
user = User.where(uid: auth.uid, provider: auth.provider).first
unless user
user = User.create(
uid: auth.uid,
provider: auth.provider,
email: User.dummy_email(auth),
password: Devise.friendly_token[0, 20]
)
end
######Füge das hinzu!######
user.skip_confirmation!
#######################
user
end
private
def self.dummy_email(auth)
"#{auth.uid}-#{auth.provider}@example.com"
end
end
routes.rb
devise_for :users, controllers: { }
Rails.application.routes.draw do
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks',
registrations: 'users/registrations' }
root 'pages#index'
get 'pages/show'
(Kürzung)...
end
registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
protected
#Anhängen
def update_resource(resource, params)
resource.update_without_password(params)
end
end
erb:views/devise/registrations/edit.html.erb
<div class="field">
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "current-password" %>
</div>
Lassen Sie uns dieses Formular löschen.
Jetzt können Sie Ihre Benutzerregistrierungsinformationen eingeben, ohne Ihr Passwort eingeben zu müssen Es ist jetzt möglich zu bearbeiten!
** Erstellen Sie zusätzlich zur grundlegenden Benutzerauthentifizierungsfunktion einen Mechanismus, der die Registrierung mit einem Klick bei der SNS-Authentifizierung ermöglicht. ** ** ** [* Rails *] Verwendung von Devise (Rails5-Version) Verfahren zum Implementieren der Benutzerauthentifizierung mit Devise + OmniAuth in Rails
** Ich möchte Umgebungsvariablen verwenden, um den API-Schlüssel auszublenden und ihn remote zu übertragen (ich möchte App Secret usw. nicht hart codieren) ** [Rails] Verwalten wir Umgebungsvariablen, indem wir verstehen, wie dotenv-Rails installiert und verwendet werden! Einstellungen für Umgebungsvariablen
** Ich möchte die in Twitter oder Facebook registrierte E-Mail anstelle des Dummys in die Datenbank bringen (dies dauert ungefähr 3 Tage) ** Omniauth - E-Mail-Informationen auf Twitter abrufen Versuchen Sie es mit Twitter oauth (erhalten Sie auch eine E-Mail) Versuchen Sie, oauth auf Facebook zu verwenden (erhalten Sie auch eine E-Mail) Probleme und Gegenmaßnahmen, wenn nach dem 9. Juli 2015 keine E-Mail-Adresse mit Facebook-Authentifizierung mehr abgerufen werden kann
** Ich möchte mich sofort registrieren können, ohne eine temporäre Registrierungs-E-Mail zur Authentifizierung über externe Websites wie Twitter, Google und Github zu verwenden. ** Datensätze werden nicht gespeichert, auch wenn die Omniauth-Twitter-Authentifizierung in Devise abgeschlossen ist Überspringen Sie die E-Mail-Überprüfung und E-Mail-Übertragung, wenn Sie sich bei Twitter anmelden [Rails5] Implementierung, die die Registrierung und Anmeldung ohne E-Mail-Adresse durch SNS-Authentifizierung ermöglicht
** Ich möchte mit i18n Geräte ins Japanische übersetzen ** Japanische Lokalisierung mit i18n
** Ich bin es leid, jedes Mal, wenn ich Benutzerinformationen bearbeite, nach einem Passwort gefragt zu werden ** [Gerät] Benutzerinformationen ohne Eingabe eines Passworts bearbeiten
** Registrieren Sie sich als Benutzer nur mit Ihrer E-Mail-Adresse. ** ** ** So registrieren Sie sich als Benutzer mit Gerät nur mit einer E-Mail-Adresse und legen später ein Kennwort fest How To: Email only sign up
** So melden Sie sich bei der Anmeldung mit einer Nicht-E-Mail-Adresse an ** How To: Allow users to sign in with something other than their email address
** Eine Methode, für die beim Aktualisieren der E-Mail-Adresse keine Bestätigung erforderlich ist (ich möchte sie überspringen) ** Müssen Sie im Gerät nach Aktualisierungen der E-Mail-Adresse suchen? Überprüfung der E-Mail-Adresse in Devise überspringen
** Andere ** [Rails] Was tun, wenn "Unauthorized 403 Forbidden" in der Twitter-Authentifizierung des Geräts angezeigt wird? Dokumentation erstellen
Recommended Posts