[RUBY] Introduction de # 10 devise_token_auth pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails 6

Introduction du sérialiseur n ° 9 pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6

Constitution

Actuellement, tout le monde peut publier en cliquant sur l'API, mais je voudrais changer cela en une configuration qui le lie à l'utilisateur connecté.

Introduction de devise, devise_token_auth

devise est la norme de facto autour de l'authentification dans Rails. Vous pouvez utiliser un large éventail de fonctions telles que la création d'utilisateur, la connexion / déconnexion, la réémission de mot de passe, l'enregistrement du nombre de connexions, le blocage des échecs de connexion, etc. simplement en entrant et en définissant cela. Au contraire, il est difficile à personnaliser en raison de sa multifonctionnalité, mais ...

La version authentifiée par jeton de ce dispositif est devise_token_auth. Puisque devise est dérivée, devise_token_auth nécessite devise.

Gemfile



...
+ #Authentification
+ gem "devise"
+ gem "devise_token_auth"

Installez à la fois devise et devist_token_auth.

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

Référence: Use [Rails] devise token auth

Changement de divers fichiers

Config / routes.rb est réécrit au moment de l'exécution, mais cette fois, je veux le mettre dans l'espace de noms v1, alors corrigez-le.

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

De plus, le fichier généré automatiquement est bloqué dans rubocop, donc corrigez-le. C'est un peu difficile, mais je vais définir des exclusions pour la migration et la configuration. En dehors de cela, nous le gérerons manuellement.

diff:.rubocop.yml



...
+ #Longueur de la méthode
+ Metrics/MethodLength:
+   Exclude:
+     - "db/migrate/**/*"
+
+ # AbcSize
+ Metrics/AbcSize:
+   Exclude:
+     - "db/migrate/**/*"
+
+ #Longueur de la ligne
+ Layout/LineLength:
+   Exclude:
+     - "config/initializers/**/*"

Changer de modèle et migration

Cette fois, nous n'utiliserons que les fonctions minimales nécessaires, supprimez donc les valeurs initiales inutiles.

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

Après avoir effectué les modifications jusqu'à présent, migrez.

$ rails db:migrate

Autoriser les colonnes autres que l'adresse e-mail et le mot de passe

Essayez-le avec curl.

$ 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"}}

Vous vous êtes inscrit avec succès. Cependant, si vous regardez attentivement, il est nul même si le nom est spécifié par hoge.

Être capable d'en deviner la cause est la preuve que vous êtes habitué aux Rails.

C'est parce que, comme d'autres contrôleurs, les colonnes qui peuvent être enregistrées avec des paramètres forts sont limitées. Par conséquent, nous prendrons les mesures suivantes.

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

Cela permet de s'inscrire avec la colonne de nom.

$ 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"}}

Référence: Comment utiliser un appareil super basique

Confirmer la connexion

Maintenant que vous vous êtes inscrit, nous confirmerons votre connexion.

$ 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"}}

En ajoutant l'option -i, les informations d'en-tête sont également renvoyées. Et à la fin, les informations de l'utilisateur enregistré précédemment sont répertoriées et l'en-tête renvoie également avec 200 OK, vous pouvez donc voir que vous pouvez vous connecter normalement.

En-têtes notables access-token: T4ZeomARybw3_o5nIHQAfw client: Fj772-EYBPnvJdETYhObyQ uid: test @ example.com Ce sont les trois. En incluant ces trois dans l'en-tête au moment de la demande, il est déterminé que l'accès est pour un compte authentifié.

En passant, que se passe-t-il si les informations d'identification sont incorrectes? Essayez de vous connecter avec une adresse e-mail ou un mot de passe incorrect.

$ 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."]}

Il sera retourné à 401.

A continué

Création d'une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 11 Test et validation du modèle utilisateur ajouté [Vers la table de sérialisation]

Recommended Posts

Introduction de # 10 devise_token_auth pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails 6
Présentation du sérialiseur n ° 9 pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
Introduction de l'expert n ° 15 pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
# 16 paramètre de stratégie pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6
Implémentation n ° 8 pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6
Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 13 Accorder l'en-tête d'authentification
Créez une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 6 show, créez une implémentation
Créez une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 17 Ajoutez des privilèges d'administrateur
Créer une API de tableau d'affichage avec autorisation de certification dans la mise à jour Rails 6 # 7, détruire l'implémentation
Construire une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 14 Seed Affichage du temps d'exécution
Créez une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 1 Construction de l'environnement
Créez une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 3 RSpec, FactoryBot introduit et post-modèle
Créer une API de tableau d'affichage avec autorisation dans Rails 6 # 12 Association d'utilisateur et de publication
Présentation de # 2 git et rubocop pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails
Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 11 Test et validation du modèle utilisateur ajoutés
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Essayez de créer un babillard en Java
Comment créer une API avec GraphQL et Rails
[Comment insérer une vidéo dans un hameau avec Rails]
Comment configurer un proxy avec authentification dans Feign
Comment renommer un modèle avec des contraintes de clé externes dans Rails
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
Comment insérer une vidéo dans Rails
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Comment créer un environnement Rails 6 avec Docker
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Convertir en balise dans la chaîne d'URL avec Rails
Créez un tableau d'affichage simple avec Java + MySQL
[Rails] rails nouveau pour créer une base de données avec PostgreSQL
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
[Rails] Comment créer un environnement avec Docker
[Rails] [Docker] Le copier-coller est OK! Comment créer un environnement de développement Rails avec Docker
Commande Docker pour créer un projet Rails avec un seul coup dans l'environnement sans Ruby
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
Comment gérer les erreurs dans Rails? Impossible de trouver un runtime JavaScript.
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Comment supprimer un objet new_record construit avec Rails
Je veux utiliser une petite icône dans Rails
Comment générer manuellement un JWT avec Knock in Rails
Lancer du SQL brut pour lire le réplica avec Rails
[Note] Créez un environnement Python3 avec Docker dans EC2
Comment écrire une recherche de comparaison de dates dans Rails
Je souhaite définir une fonction dans la console Rails
Comment interroger Array dans jsonb avec Rails + postgres
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
Environnement Build Rails (API) x MySQL x Nuxt.js avec Docker
[Rails] Comment charger JavaScript dans une vue spécifique
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1