Derzeit kann jeder über die API posten, aber ich möchte dies in eine Konfiguration ändern, die dies mit dem angemeldeten Benutzer verknüpft.
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
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/**/*"
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
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
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.
→ Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 11 Test und Validierung des Benutzermodells hinzugefügt [Zur Serialisierungstabelle]
Recommended Posts