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

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.

Vient ensuite le chapitre 9, le développement du système d'authentification, la quatrième étape et la seconde moitié de l'implémentation de la connexion. Dans le chapitre 8, nous passerons d'une session temporaire à une session permanente utilisant des cookies. Il y a beaucoup de termes liés à la sécurité, mais gardons le contenu bas dans une certaine mesure. Il existe également un compte docomo, nous devons donc sensibiliser à la sécurité.   Cliquez ici pour la BGM d'aujourd'hui. Ma petite amie décédée "Aki No Hachiouji" Je sens l'arrivée de l'automne progressivement.

[9.1.1 Jeton de mémoire et mémo et exercice de chiffrement]

Mot de passe: créé et géré par l'utilisateur Token: créé et géré par un ordinateur urlsafe_base64: une méthode dans le module SecureRandom de la bibliothèque standard Ruby. Renvoie une chaîne aléatoire de 22 longueurs composée de l'un des caractères A – Z, a – z, 0–9, «-» et «_» (64 types).

Gardez à l'esprit les cinq politiques de création de session permanente suivantes. ** 1. Générez et utilisez une chaîne de caractères aléatoire pour le jeton de stockage. ** ** ** 2. Définissez une date d'expiration lors du stockage des jetons dans les cookies du navigateur. ** ** ** 3. Convertissez les jetons en valeurs de hachage avant de les stocker dans la base de données. ** ** ** 4. Cryptez l'ID utilisateur enregistré dans les cookies du navigateur. ** ** ** 5. Lorsque vous recevez un cookie contenant un ID utilisateur persistant, recherchez cet ID dans la base de données et assurez-vous que les cookies de jeton stockés correspondent à la valeur de hachage dans la base de données. ** **

  1. Ouvrez la console et affectez le premier utilisateur de la base de données à l'utilisateur variable. Voyons ensuite si la méthode Remember fonctionne correctement à partir de cet objet utilisateur. Vérifiez également la différence entre Remember_token et Remember_digest. → Ci-dessous. Le Remember_digest haché est stocké.
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "[email protected]", created_at: "2020-09-12 09:09:50", updated_at: "2020-09-12 09:09:50", password_digest: "$2a$10$hrOEzw0faSd4yurmH8bQJOnggeNnUqTZg33yE9g7Tnk...", remember_digest: nil>
>> user.remember
   (0.1ms)  begin transaction
  SQL (3.0ms)  UPDATE "users" SET "updated_at" = ?, "remember_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2020-09-13 22:33:06.439353"], ["remember_digest", "$2a$10$IQ/x1avxRSAG281J18FRi.f2icjx8Kac5y8bWua5IDVae.C.Kdwcu"], ["id", 1]]
   (5.9ms)  commit transaction
=> true
>> user.remember_token
=> "aGtKYk5iEjSHFs16uB7xTQ"
>> user.remember_digest
=> "$2a$10$IQ/x1avxRSAG281J18FRi.f2icjx8Kac5y8bWua5IDVae.C.Kdwcu"

2. Dans le Listing 9.3, nous avons défini de nouveaux jetons et méthodes de classe pour les résumés en appelant explicitement la classe User. En fait, il peut maintenant être appelé en utilisant User.new_token ou User.digest, c'est donc probablement le moyen le plus clair de définir une méthode de classe. Cependant, il existe en fait deux façons de définir davantage de méthodes de classe «Ruby-correct». L'un sera un peu déroutant et l'autre sera très déroutant. Exécutez la suite de tests pour vous assurer que l'implémentation légèrement déroutante du Listing 9.4 et l'implémentation très déroutante du Listing 9.5 fonctionnent. Astuce: Notez que self fait référence au «modèle» utilisateur, ou instance de l'objet utilisateur, dans le contexte normal, mais dans le contexte du Listing 9.4 et du Listing 9.5, self fait référence à la «classe» Utilisateur. Cela fait partie de la raison de l'incompréhensibilité. → Si vous écrivez comme indiqué, les deux sont VERTS. J'ai étudié le style d'écriture qui apparaît ici. Il semble que celle remplacée par le premier User → self s'appelle la méthode de la méthode singulière, et celle résumée par class << self est appelée la méthode de la classe singulière. Pour plus d'informations, consultez cet article. ](Https://magazine.rubyist.net/articles/0046/0046-SingletonClassForBeginners.html)

[9.1.2 Conserver le statut de connexion Notes et exercices]

méthode permanente: expire après 20 ans. méthode signée: effectue le traitement de la signature numérique et du cryptage.

  1. Vérifiez le cookie du navigateur et confirmez que le navigateur, après la connexion, a Remember_token et user_id chiffré. → Il est vrai que les deux ont augmenté!

2. Ouvrez la console et voyez si la méthode authentifiée? Du Listing 9.6 fonctionne. → OK si vous entrez le souvenir_token confirmé dans l'exercice 1 comme argument.

user = User.first
Abréviation
user.authenticated?("Exercice 1 rappelez-vous_token")
=> true

[9.1.3 Notes et exercices pour oublier les utilisateurs]

Oubliez l'utilisateur = mettez à jour Remember_digest avec nil.

  1. Mettez en commentaire la ligne que vous avez corrigée dans le Listing 9.16 et voyez le bogue causé par les deux onglets connectés. Déconnectez-vous d'abord sur un onglet, puis essayez de vous déconnecter à nouveau sur l'autre onglet. → NoMethodError in SessionsController#destroy undefined method `forget' for nil:NilClass

2. Commentez la ligne corrigée dans l'extrait 9.19 et voyez les bogues causés par les deux navigateurs connectés. Essayez de vous déconnecter dans un navigateur et de redémarrer l'autre pour accéder à l'exemple d'application. → Omis parce qu'il est sobre

3. Annulez la partie commentée dans le code ci-dessus et vérifiez que la suite de tests passe du rouge au vert. → Yes, GREEN !

[9.1.4 Deux exercices de bogue discrets]

  1. Veuillez vérifier avec votre navigateur si le flux de traitement de 8.1.4 fonctionne correctement. En particulier, n'oubliez pas d'aller sur une autre page après avoir affiché le message flash pour voir si le flash fonctionne bien. → Essayons-le. Si vous allez sur une autre page, le flash s'éteindra.

[9.2. [Remember me] case à cocher mémo et pratique]

Un opérateur ternaire a émergé. Il semble que vous puissiez écrire une instruction if-else sur une seule ligne. Vous pouvez maintenant voir le code du Listing 8.21 (bien que :: ne soit pas encore tout à fait correct). Donc, le code ci-dessous est

python


cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost

Quand ça devient comme ça.

python


if cost = ActiveModel::SecurePassword.min_cost
  BCrypt::Engine::MIN_COST
else
  BCrypt::Engine.cost
end

  1. Vérifiez les informations sur les cookies dans votre navigateur et vérifiez si le résultat est ce que vous vouliez lorsque vous avez coché [se souvenir de moi]. → Je peux y aller.

2. Ouvrez la console et considérez un exemple utilisant l'opérateur ternaire (colonne 9.2). → Très simple ci-dessous

>> x = 6
=> 6
>> x % 3 == 0 ? "Multiple de 3" : "Ne pas"
=> "Multiple de 3"

[9.3.1 Exercice pour tester la case [Se souvenir de moi]]

  1. Dans le test d'intégration du Listing 9.25, j'ai expliqué que l'attribut virtuel Remember_token n'est pas accessible, mais en fait, il est accessible en utilisant une méthode de test spéciale appelée assigns. Pour accéder aux variables d'instance définies dans le contrôleur depuis l'intérieur du test, utilisez la méthode assigns à l'intérieur du test. Passez le symbole correspondant à la variable d'instance à cette méthode. Par exemple, si l'action de création définit une variable d'instance appelée @user, vous pouvez accéder à la variable d'instance en écrivant assigns (: user) dans le test. Dans le cas de l'application de ce didacticiel, l'action de création du contrôleur de sessions a défini l'utilisateur comme une variable locale normale (pas une variable d'instance), mais si vous la remplacez par une variable d'instance, le jeton de mémoire de l'utilisateur sera correct dans les cookies. Vous pourrez tester s'il est inclus. Suivez cette idée pour combler les lacunes dans l'extrait 9.27 et l'extrait 9.28 (marqués avec? Et FILL_IN comme indice) et améliorer le test sur la case à cocher se souvenir de moi. → Définissez l'utilisateur sur @user et la partie appropriée du test de connexion comme suit.

sessions_controller.rb


def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
      log_in @user
      params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
      redirect_to @user
    else
      flash.now[:danger] = "Invalid email/password combination"
      render 'new'
    end
end

users_login_test.rb


  test "login with remembering" do
    log_in_as(@user, remember_me: '1')
    assert_equal cookies['remember_token'], assigns(:user).remember_token
  end

Ce test de connexion aux cookies ['Remember_token'], mais quand j'ai essayé les cookies pour la première fois [: Remember_token], le test a réussi. Je me suis demandé pourquoi et j'ai découvert Cet article. Puis-je utiliser des symboles maintenant? Mais la version Rails du tutoriel est ancienne ...

[9.3.2 Exercice pour tester [Remember me]]

  1. Assurons-nous que la suppression de l'expression authentifiée? Du Listing 9.33 entraîne l'échec du deuxième test du Listing 9.31 (assurez-vous que ce test teste la bonne cible). Let's). → Il a échoué à la partie concernée.

Résumé du chapitre 9

-Persist ID utilisateur et jeton de stockage avec la méthode des cookies. -Les opérations liées à la base de données sont définies dans la classe User. Les méthodes utilisées dans le contrôleur de session sont principalement définies dans l'assistant de session. Le premier est également utilisé dans le second. -La fonction Remember_me est comme un commutateur qui sépare s'il faut conserver ou supprimer les cookies selon que la valeur est 1 ou 0. -Current_user est déterminé par l'état et les informations de la session ou du cookie. ・ Les termes relatifs aux technologies de l'information étant dispersés, ils sont résumés dans le glossaire.

Ce chapitre est déroutant ... Puisqu'il s'agit d'une partie qui n'apparaît pas sur la page Web, il y a une partie où l'image ne peut pas être dessinée. Cependant, la partie sécurité ne peut être négligée. Peut-être que je pourrai recommencer après un certain temps.

Et bien ensuite! Chapitre 10! Nous allons implémenter des fonctions utilisateur non implémentées!

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

Glossaire qui saisit en quelque sorte l'image

・ Détournement de session Méthode d'attaque dans laquelle un tiers (attaquant) qui n'est pas partie à la communication prend le contrôle de la session en connaissant l'ID de session par certains moyens.

・ Renifleur de paquets Un terme courant pour les analyseurs LAN. Matériel ou logiciel pour surveiller et enregistrer le trafic passant sur le LAN.

・ Scripts intersites (XSS) Une vulnérabilité dans une application utilisée pour un site Web ou une attaque qui exploite la vulnérabilité. En particulier, une cyberattaque qui se produit en insérant un script malveillant malveillant dans un site dynamique qui peut être créé par un visualiseur Web (par exemple, SNS tel que Twitter, babillard, etc.) en utilisant la vulnérabilité. ..

· Signature numérique Type de technologie de cryptage à clé publique utilisée pour imiter les caractéristiques de sécurité des signatures manuscrites par écrit.

· Sel Données aléatoires ajoutées à l'entrée d'une fonction unidirectionnelle lors du hachage de données telles que des mots de passe et des phrases de passe. Comme vous pouvez le voir dans la note de traduction dans le texte, nous renforçons le code avec une pincée de sel au cas où.

・ Assert_empty Prétendez que obj.empty est vrai.

・ Assert_nil Revendiquer que obj.nil est vrai.

Recommended Posts

(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un tutoriel Rails [Chapitre 11]
(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 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 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