・ 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
・ 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.
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.
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">
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
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">
2. Confirmons que le test devient rouge lorsque le deuxième CGI.escape du Listing 12.12 est supprimé. → C'était ROUGE.
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
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
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
Couper ici! !! La raison est la même que dans le chapitre précédent! !!
-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
Pas cette fois.
Recommended Posts