[RUBY] Einführung von # 10 devise_token_auth zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6

Einführung des Serializers Nr. 9 zum Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6

Verfassung

Derzeit kann jeder über die API posten, aber ich möchte dies in eine Konfiguration ändern, die dies mit dem angemeldeten Benutzer verknüpft.

Einführung von devise, devise_token_auth

devise ist der De-facto-Standard für die Authentifizierung in Rails. Sie können eine Vielzahl von Funktionen wie Benutzererstellung, Anmelden / Abmelden, erneute Ausgabe von Kennwörtern, Aufzeichnung der Anmeldeanzahl, Blockierung von Anmeldefehlern usw. verwenden, indem Sie diese eingeben und einstellen. Im Gegenteil, es ist schwierig, aufgrund seiner Multifunktionalität anzupassen, aber ...

Die Token-authentifizierte Version dieses Geräts ist devise_token_auth. Da devise abgeleitet ist, erfordert devise_token_auth devise.

Gemfile



...
+ #Authentifizierung
+ gem "devise"
+ gem "devise_token_auth"

Installieren Sie sowohl devise als auch devist_token_auth.

$ rails g devise:install
$ rails g devise_token_auth:install User auth

Referenz: Verwenden Sie [Rails], um eine Tokenauthentifizierung zu erstellen

Änderung verschiedener Dateien

Config / route.rb wird zur Laufzeit neu geschrieben, aber dieses Mal möchte ich es in den v1-Namespace einfügen, also behebe es.

config/routes.rb


 # frozen_string_literal: true

 Rails.application.routes.draw do
-  mount_devise_token_auth_for 'User', at: 'auth'
   namespace "v1" do
     resources :posts
+    mount_devise_token_auth_for 'User', at: 'auth'
   end
 end

Außerdem bleibt die automatisch generierte Datei in Rubocop stecken. Korrigieren Sie sie daher. Es ist etwas rau, aber ich werde Ausschlüsse für Migration und Konfiguration festlegen. Ansonsten werden wir es manuell behandeln.

diff:.rubocop.yml



...
+ #Methodenlänge
+ Metrics/MethodLength:
+   Exclude:
+     - "db/migrate/**/*"
+
+ # AbcSize
+ Metrics/AbcSize:
+   Exclude:
+     - "db/migrate/**/*"
+
+ #Linienlänge
+ Layout/LineLength:
+   Exclude:
+     - "config/initializers/**/*"

Modell und Migration ändern

Dieses Mal verwenden wir nur die minimal erforderlichen Funktionen. Löschen Sie daher unnötige Anfangswerte.

app/models/user.rb


   devise :database_authenticatable, :registerable,
-         :recoverable, :rememberable, :trackable, :validatable
+         :rememberable, :validatable
   include DeviseTokenAuth::Concerns::User

db/migrate/xxxxxxxxxxxxxx_devise_token_auth_create_users.rb


       ## Database authenticatable
       t.string :encrypted_password, null: false, default: ""

 
-      ## Recoverable
-      t.string   :reset_password_token
-      t.datetime :reset_password_sent_at
-      t.boolean  :allow_password_change, default: false
-
       ## Rememberable
       t.datetime :remember_created_at
 

-      ## 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
-
       ## User Info
       t.string :name
-      t.string :nickname
-      t.string :image
       t.string :email
 
...
     add_index :users, :email, unique: true
     add_index :users, %i[uid provider], 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

Migrieren Sie nach den bisherigen Änderungen.

$ rails db:migrate

Erlaube andere Spalten als E-Mail und Passwort

Ich werde es mit Locken versuchen.

$ curl localhost:8080/v1/auth -X POST -H 'Content-Type: application/json' -d '{"email": "[email protected]", "password": "password", "name": "hoge"}'
{"status":"success","data":{"uid":"[email protected]","id":1,"email":"[email protected]","provider":"email","name":null,"created_at":"2020-09-08T04:40:44.659Z","updated_at":"2020-09-08T04:40:44.827Z"}}

Sie haben sich erfolgreich registriert. Wenn Sie genau hinschauen, ist es jedoch null, obwohl der Name durch hoge angegeben wird.

Die Ursache dafür erraten zu können, ist ein Beweis dafür, dass Sie an Rails gewöhnt sind.

Dies liegt daran, dass wie bei anderen Controllern die Spalten, die mit starken Parametern registriert werden können, begrenzt sind. Daher werden wir die folgenden Maßnahmen ergreifen.

app/controllers/application_controller.rb


 class ApplicationController < ActionController::API
   include DeviseTokenAuth::Concerns::SetUserByToken
   rescue_from ActiveRecord::RecordNotFound, with: :render_404
+  before_action :configure_permitted_parameters, if: :devise_controller?
 
   def render_404
     render status: 404, json: { message: "record not found." }
   end
+
+  def configure_permitted_parameters
+    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
+  end
 end

Dies ermöglicht die Registrierung einschließlich der Namensspalte.

$ rails db:reset
$ curl localhost:8080/v1/auth -X POST -H 'Content-Type: application/json' -d '{"email": "[email protected]", "password": "password", "name": "hoge"}'                                                  
{"status":"success","data":{"uid":"[email protected]","id":1,"email":"[email protected]","provider":"email","name":"hoge","created_at":"2020-09-08T04:51:42.527Z","updated_at":"2020-09-08T04:51:42.698Z"}}

Referenz: Grundlegende Verwendung von Geräten

Bestätigen Sie sign_in

Nachdem Sie sich registriert haben, bestätigen wir Ihre Anmeldung.

$ curl localhost:8080/v1/auth/sign_in -X POST -H 'Content-Type: application/json' -d '{"email": "[email protected]", "password": "password"}' -i
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
access-token: T4ZeomARybw3_o5nIHQAfw
token-type: Bearer
client: Fj772-EYBPnvJdETYhObyQ
expiry: 1600751367
uid: [email protected]
ETag: W/"8c41022d2e42ca28df0cb958a84ab2f4"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: d4ff732c-f6b5-4213-8984-5d9457b39cbd
X-Runtime: 0.510436
Transfer-Encoding: chunked

{"data":{"id":1,"email":"[email protected]","provider":"email","uid":"[email protected]","name":"hoge"}}

Durch Hinzufügen der Option "-i" werden auch die Header-Informationen zurückgegeben. Am Ende werden die Informationen des zuvor registrierten Benutzers aufgelistet, und der Header wird ebenfalls mit 200 OK zurückgegeben, sodass Sie sehen können, dass Sie sich normal anmelden können.

Bemerkenswerte Überschriften access-token: T4ZeomARybw3_o5nIHQAfw client: Fj772-EYBPnvJdETYhObyQ uid: test @ example.com Dies sind die drei. Durch Einfügen dieser drei in den Header zum Zeitpunkt der Anforderung wird festgestellt, dass der Zugriff für ein authentifiziertes Konto erfolgt.

Was passiert nebenbei, wenn die Anmeldeinformationen falsch sind? Versuchen Sie, sich mit der falschen E-Mail-Adresse oder dem falschen Passwort anzumelden.

$ curl localhost:8OST -H 'Content-Type: application/json' -d '{"email": "[email protected]", "password": "PASSWORD"}' -i                                                       
HTTP/1.1 401 Unauthorized
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
Cache-Control: no-cache
X-Request-Id: 12832212-9797-465b-a5b1-ecaa7e88a977
X-Runtime: 0.308726
Transfer-Encoding: chunked

{"success":false,"errors":["Invalid login credentials. Please try again."]}

Es wird bei 401 zurückgegeben.

Fortsetzung

Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 11 Test und Validierung des Benutzermodells hinzugefügt [Zur Serialisierungstabelle]

Recommended Posts

Einführung von # 10 devise_token_auth zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
Einführung des Serializers Nr. 9 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Einführung des Experten Nr. 15 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
# 16 Richtlinieneinstellung zum Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6
# 8 Seed-Implementierung zum Erstellen einer Bulletin Board-API mit Zertifizierungsautorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6 # 13 Grant-Authentifizierungsheader
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 17. Fügen Sie Administratorrechte hinzu
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung im Rails 6 # 7-Update und zerstören Sie die Implementierung
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Seed. Anzeige der Ausführungszeit
Erstellen Sie eine Bulletin-Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 1 Environment Construction
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 3 RSpec. FactoryBot wird eingeführt und ein Post-Modell erstellt
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 12 Assoziation von Benutzer und Beitrag
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 2 Einführung in Git und Rubocop
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 11. Benutzermodelltest und Validierung hinzugefügt
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Versuchen Sie, ein Bulletin Board in Java zu erstellen
So erstellen Sie eine API mit GraphQL und Rails
[So fügen Sie ein Video mit Rails in haml ein]
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant
So fügen Sie ein Video in Rails ein
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
Verwendung von credentials.yml.enc aus Rails 5.2
So erstellen Sie eine Rails 6-Umgebung mit Docker
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
Mit Rails in eine Tag-zu-URL-Zeichenfolge konvertieren
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
[Rails] So erstellen Sie eine Umgebung mit Docker
[Rails] [Docker] Kopieren und Einfügen ist in Ordnung! So erstellen Sie eine Rails-Entwicklungsumgebung mit Docker
Docker-Befehl zum Erstellen eines Rails-Projekts in einem einzigen Schlag in einer Umgebung ohne Ruby
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
So implementieren Sie eine nette Funktion in Ajax mit Rails
So löschen Sie ein mit Rails erstelltes new_record-Objekt
Ich möchte ein kleines Symbol in Rails verwenden
So generieren Sie manuell ein JWT mit Knock in Rails
Wirf Raw SQL mit Rails auf ein Lesereplikat
[Hinweis] Erstellen Sie eine Python3-Umgebung mit Docker in EC2
So schreiben Sie eine Datumsvergleichssuche in Rails
Ich möchte eine Funktion in der Rails Console definieren
Abfragen von Arrays in jsonb mit Rails + postgres
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
Build Rails (API) x MySQL x Nuxt.js Umgebung mit Docker
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Neuer Mitarbeiter hat versucht, mit Spring Security eine Authentifizierungs- / Autorisierungsfunktion von Grund auf neu zu erstellen
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 2 (Client Edition)
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1