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é.
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
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/**/*"
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
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
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.
→ 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]