[RUBY] (Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 12]

supposition

・ Le tutoriel Rails est la 4ème édition ・ Cette étude est le 3e tour (2e tour après le chapitre 9) ・ L'auteur est un débutant qui a fait tout Progate

Politique de base

・ Si vous le lisez, vous ne le comprendrez pas. ・ Recherchez et résumez les termes que vous ne comprenez pas (en bas de l'article, glossaire). ・ Plongez dans ce que vous ne comprenez pas. ・ Travaillez sur tous les exercices. ・ Ne copiez pas le code autant que possible.

C'est le chapitre 12 des 6e et derniers épisodes de développement du système d'authentification! Le monde a quatre jours fériés consécutifs, mais il n'y a pas de vacances pour apprendre. Faisons tout. Faites des efforts constants.   Cliquez ici pour la chanson d'aujourd'hui. SUPERCAR "PLANET short ver." Les bonnes chansons ne se faneront pas avec les années.

[12.1.1 Exercice du contrôleur de réinitialisation de mot de passe]

  1. À ce stade, assurez-vous que la suite de tests est verte. → C'est VERT.

2. La route nommée dans le tableau 12.1 indique que _url doit être utilisé à la place de _path. Pourquoi, pensez-y. Conseil: pour la même raison que l'exercice que vous avez effectué dans l'activation de compte (11.1.1.1). → Parce qu'une URL complète (chemin absolu) est requise.

[12.1.2 Exercice pour définir un nouveau mot de passe]

  1. Pourquoi la méthode form_for du Listing 12.4 utilise-t-elle: password_reset au lieu de @password_reset? → Parce qu'il n'y a pas de modèle password_reset. Si vous avez un modèle, vous pouvez utiliser cette variable (@user, etc.), mais cette fois il n'y a pas de telle variable.

[12.1.3 Exercice de réinitialisation du mot de passe avec l'action de création]

  1. Envoyons une adresse e-mail valide à partir du formulaire (Fig. 12.6). Quel message d'erreur avez-vous reçu? → ArgumentError in PasswordResetsController#create wrong number of arguments (given 1, expected 0)

2. Accédez à la console et, suite à l'envoi dans l'exercice précédent, confirmons que l'objet utilisateur correspondant (bien qu'il soit affiché comme une erreur) a reset_digest et reset_sent_at. Aussi, quelles sont les valeurs respectives? → Il y en avait. Suivant.

>> user = User.find_by(email: "[email protected]")
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "[email protected]"], ["LIMIT", 1]]
=> #<User id: 102, name: "kawa", email: "[email protected]", created_at: "2020-09-17 22:39:47",
 updated_at: "2020-09-20 04:23:52", password_digest: "$2a$10$kgv1Loz8fVDaaZvtUMtkZOUBnbCcHZNIBQBrgb18QMj...", remember_digest: nil, admin: false, activation_digest: "$2a$10$bmgQ2XztK7kgePhH8pVDiuKenXFDEl51XktqmfPUwHv...", activated: true, activated_at: "2020-09-17 22:40:33", 
reset_digest: "$2a$10$iuW.1GDheym2P5Nkuo7QUu7YjCs1DyooYonE0RY2lck...", reset_sent_at: "2020-09-20 04:23:52">

[12.2.1 E-mail de réinitialisation du mot de passe et exercice de modèle]

  1. Voyons un aperçu du courrier envoyé depuis le navigateur. Quel type d'informations est affiché dans la colonne "Date"? → Date: Sun, 20 Sep 2020 04:49:13 +0000

  2. Envoyons une adresse e-mail valide à partir du formulaire de réinitialisation du mot de passe. Consultez également les journaux du serveur Rails pour voir quels sont les e-mails sortants. → Ci-dessous

----==_mimepart_5f66df073210_17841d9a2dc334fd
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

To reset your password click the link below:

https://545f54b8b0d74dfd8bcc26b33cb0f3fe.vfs.cloud9.us-east-2.amazonaws.com/password_resets/TaQ06fMRyqZk-wHJp8fnyw/edit?email=kawa%40kawa.com

This link will expire in two hours.

if you did not request your password to be reset, 
please ignore this email and your password will stay as it is.

3. Accédez à la console et recherchez l'objet Utilisateur dont le mot de passe a été réinitialisé lors de l'exercice précédent. Une fois que vous avez trouvé l'objet, vérifions les valeurs reset_digest et reset_sent_at de l'objet. → Ci-dessous

reset_digest: "$2a$10$JUgxhUTG.XKFk7BnZqfLHeU8fdUIU/cnMvBGaAs.RCX...", 
reset_sent_at: "2020-09-20 04:48:06">

[12.2.2 Test du courrier envoyé]

  1. Essayez d'exécuter uniquement le test de messagerie. Ce test est-il vert? → VERT à $ rails test test /mailers/user_mailer_test.rb

2. Confirmons que le test devient rouge lorsque le deuxième CGI.escape du Listing 12.12 est supprimé. → C'était ROUGE.

[12.3.1 Exercice de réinitialisation avec action d'édition]

  1. Suivez la procédure indiquée en 12.2.1.1 pour trouver le courrier sortant dans le journal du serveur Rails et trouver le lien qui y est fourni. Essayez d'afficher ce lien depuis votre navigateur et voyez s'il ressemble à la figure 12.11. → L'écran Réinitialiser le mot de passe s'affiche.

2. Envoyons en fait un nouveau mot de passe à partir de la page affichée précédemment. Quels sont les résultats? → Unknown action The action 'update' could not be found for PasswordResetsController

[12.3.2 Exercice de mise à jour du mot de passe]

  1. Affichez le lien obtenu en 12.2.1.1 (obtenu à partir du journal du serveur Rails) sur le navigateur, et envoyez intentionnellement le mot de passe et les chaînes de caractères de confirmation par erreur. Quel message d'erreur obtenez-vous? → Password confirmation doesn't match Password

2. Accédez à la console et recherchez l'objet utilisateur qui a envoyé la réinitialisation du mot de passe. Une fois trouvé, essayez d'obtenir la valeur de password_digest pour cet objet. Ensuite, entrez un mot de passe valide à partir du formulaire de réinitialisation de mot de passe et soumettez-le (Fig. 12.13). Si la réinitialisation du mot de passe réussit, récupérez à nouveau la valeur password_digest et assurez-vous qu'elle est différente de la valeur obtenue précédemment. Conseil: vous devez obtenir la nouvelle valeur via user.reload. → Et quand j'essaye de réinitialiser le mot de passe, "SQLite3 :: BusyException: la base de données est verrouillée: commit transaction" apparaît. Reportez-vous à cet article, cela a fonctionné lorsque j'ai frappé ActiveRecord :: Base.connection.execute ("BEGIN TRANSACTION; END;") dans la console Rails. .. Le résultat est ci-dessous. C'est différent. Avant modification: \ $ 2a 10 $ $ kgv1Loz8fVDaaZvtUMtkZOUBnbCcHZNIBQBrgb18QMjyvnK.U3vlW Après modification: \ $ 2a $ 10 $ / lAIMLbkR84Zg0rBkVmcIeWn6u / UBEOaHGrU34rLR8ZMnmcIEomiu

[12.3.3 Exercice pour tester la réinitialisation du mot de passe]

  1. La méthode create_reset_digest du Listing 12.6 appelle update_attribute deux fois, ce qui signifie qu'elle interroge la base de données une fois pour chaque ligne. Combinons les appels update_attribute en un seul appel update_columns en utilisant le modèle présenté dans l'extrait 12.20 (cela vous permettra d'interroger la base de données une fois). Exécutez également le test après la modification et assurez-vous qu'il devient vert. En passant, le code du Listing 12.20 contient également les réponses aux exercices du chapitre précédent (Listing 11.39). → Ci-dessous

user.rb


  def create_reset_digest
    self.reset_token = User.new_token
    update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now)
  end

2. Remplissez le modèle du Listing 12.21 et couvrez le branchement (Listing 12.16) qui se produit en raison de la réinitialisation du mot de passe expiré avec un test d'intégration (response.body dans le code en 12.21 est le corps HTML de la page C'est une méthode qui renvoie tout). Il existe plusieurs façons de tester l'expiration, mais vous pouvez utiliser la technique recommandée dans l'extrait 12.21 pour vérifier le mot «expiré» dans le corps de la réponse (notez qu'il est insensible à la casse). .. → Ci-dessous (Qu'est-ce que / ~ / i? Je ne sais pas même si je le cherche)

password_resets_test.rb


test "expired token" do
    get new_password_reset_path
    post password_resets_path,
        params: { password_reset: { email: @user.email } }
    
    @user = assigns(:user)
    @user.update_attribute(:reset_sent_at, 3.hours.ago)
    patch password_reset_path(@user.reset_token),
        params: { email: @user.email,
            user: { password:        "foobar",
              password_confirmation: "foobar" } }
    assert_response :redirect
    follow_redirect!
    assert_match /expired/i, response.body
  end

3. La politique de ne pas pouvoir réinitialiser le mot de passe après 2 heures est une méthode préférable pour la sécurité. Mais il existe encore des moyens de l'améliorer. Par exemple, supposons qu'une réinitialisation du mot de passe se produit sur un ordinateur public (ou partagé). Même si vous vous déconnectez et quittez votre bureau, dans les 2 heures, vous pouvez afficher le formulaire de réinitialisation du mot de passe à partir de l'historique de l'ordinateur et mettre à jour le mot de passe (et le mécanisme de connexion est interrompu tel quel). Je vais!). Pour résoudre ce problème, ajoutons le code du Listing 12.22 et modifions le résumé pour qu'il soit nul après une réinitialisation réussie du mot de passe. → Entrez simplement @ user.update_attribute (: reset_digest, nil).

4. Ajoutez une ligne à la liste 12.18 et rédigez un test pour l'exercice précédent. Astuce: combinons la méthode assert_nil du Listing 9.25 avec la méthode user.reload du Listing 11.33 pour tester directement l'attribut reset_digest. → Seule la partie pertinente est ci-dessous

password_resets_test.rb


    #Mot de passe valide et confirmation du mot de passe
    patch password_reset_path(user.reset_token),
        params: { email: user.email,
            user: { password:        "foobaz",
              password_confirmation: "foobaz" } }
    assert is_logged_in?
    assert_nil user.reload.reset_digest
    assert_not flash.empty?
    assert_redirected_to user

[12.4 Exercice d'envoi de mail dans un environnement de production]

Couper ici! !! La raison est la même que dans le chapitre précédent! !!

Résumé du chapitre 12

-Modelé avec des ressources comme dans le chapitre précédent. -Ajouter reset_sent_at au modèle utilisateur pour définir une date d'expiration pour le lien de réinitialisation (pour l'utiliser comme heure de référence) -Hidden_field_tag conserve l'adresse e-mail même après l'envoi une fois (action d'édition). -Jouez une chaîne de caractères vide avec @ user.errors.add (: mot de passe ,: vide).

Enfin, le développement du système d'authentification est terminé. Même si vous le faites jusqu'à présent, vous serez familiarisé avec des termes tels que jetons et résumés. Même si vous ne comprenez pas un peu, si vous mangez et mangez tout le temps, cela sera digéré et deviendra sanglant. Faisons de notre mieux. Dans le prochain chapitre, nous allons implémenter la fonction de publication!

Allez au chapitre 13! Cliquez ici pour le chapitre 11 Cliquez ici pour les conditions préalables et le statut de l'auteur pour l'apprentissage

Glossaire qui saisit en quelque sorte l'image

Pas cette fois.

Recommended Posts

(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 1]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 14]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 12]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 5]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 3]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 4]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 8]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 6]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 13]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 9]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 10]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 7]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 2]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Introduction]
[Tutoriel Rails Chapitre 5] Créer une mise en page
(Ruby on Rails6) Création de données dans une table
tutoriel rails Chapitre 6
tutoriel rails Chapitre 1
tutoriel rails Chapitre 7
tutoriel rails Chapitre 5
tutoriel rails Chapitre 10
tutoriel rails Chapitre 9
tutoriel rails Chapitre 8
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Tutoriel Rails Chapitre 3 Apprentissage
Mémorandum du didacticiel Rails (Chapitre 3, 3.1)
Tutoriel Rails Chapitre 4 Apprentissage
Tutoriel Rails Chapitre 1 Apprentissage
Tutoriel Rails Chapitre 2 Apprentissage
Difficultés à créer un environnement Ruby on Rails (Windows 10) (SQLite3)
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Appliquer le CSS à une vue spécifique dans Ruby on Rails