Lorsque nous utilisons le module d’authentification, nous avons une gestion de compte avec une boite courriel locale pour Phoenix. Les courriels offrent la possibilité de récupérer le mot de passe grâce à l’envoie d’un courriel. La gestion des courriels est mise en place par la commande mix phx.gen.auth Accounts User users et fonctionne en local.
Nous allons voir comment utiliser le code mis en place afin de pouvoir tester la fonction de récupération de mot de passe. Nous reprenons notre suite d’articles de création de blog pour montrer le fonctionnement de la boite locale Phoenix.
Bibliographie
- comment mettre en place les courriel avec Phoenix
- les adaptateurs de Swoosh et son integration dans Phoenix
Le code généré pour la boite courriel locale par Phoenix
Phoenix utilise lle module Blogset.Accounts.UserNotifier pour envoyer des courriel. Ce module contient trois format de courriel et une fonction pour l’envoie :
- deliver_confirmation_instructions
- deliver_reset_password_instructions
- deliver_update_email_instructions
BLOGSET/lib/blogset/accounts/user_notifier.ex :
defmodule Blogset.Accounts.UserNotifier do import Swoosh.Email alias Blogset.Mailer # Delivers the email using the application mailer. defp deliver(recipient, subject, body) do email = new() |> to(recipient) |> from({"Blogset", "contact@example.com"}) |> subject(subject) |> text_body(body) with {:ok, _metadata} <- Mailer.deliver(email) do {:ok, email} end end
Afin de pouvoir vérifier l’utilisation de ces fonctions d’envoie de courriel nous ajoutons la trace de son utilisation avec IO.inspect (ligne 10 ci-dessous)
# Delivers the email using the application mailer. defp deliver(recipient, subject, body) do email = new() |> to(recipient) |> from({"Blogset", "contact@example.com"}) |> subject(subject) |> text_body(body) IO.inspect(email) with {:ok, _metadata} <- Mailer.deliver(email) do {:ok, email} end end
Nous allons maintenant voir si nous pouvons utiliser la trace pour récupérer les comptes créés dans l’application blogset pour lesquels nous aurions perdu le mot de passe.
Tester l’envoie de courriel sur la boite locale de Phoenix
- cd C:\CarbonX1\Phoenix\Projets\blogset ‘dossier du projet
- code . ‘ouvrir vs code
- iex -S mix phx.server ‘execution en mode interactif
- http://localhost:4000/users/reset_password ‘page de mot de passe perdu
La trace affihhe le courriel avec l’url pour changer le mot de passe :
↳ BlogsetWeb.UserForgotPasswordLive.handle_event/3, at: lib/blogset_web/live/user_forgot_password_live.ex:35 [debug] QUERY OK source="users_tokens" db=13.2ms queue=1.4ms idle=1369.2ms INSERT INTO "users_tokens" ("context","token","user_id","sent_to","inserted_at") VALUES ($1,$2,$3,$4,$5) RETURNING "id" ["reset_password", <<42, 43, 53, 5, 60, 251, 172, 192, 214, 230, 15, 176, 120, 74, 163, 131, 221, 223, 33, 241, 152, 199, 33, 173, 38, 182, 180, 78, 48, 217, 205, 178>>, 4, "francois-martin@gmail.com", ~N[2024-01-29 09:48:03]] ↳ Blogset.Accounts.deliver_user_reset_password_instructions/2, at: lib/blogset/accounts.ex:306 %Swoosh.Email{ subject: "Reset password instructions", from: {"Blogset", "contact@example.com"}, to: [{"", "francois-martin@gmail.com"}], cc: [], bcc: [], text_body: "\n==============================\n\nHi francois-martin@gmail.com,\n\nYou can reset your password by visiting the URL below:\n\nhttp://localhost:4000/users/reset_password/gNKfWNyB3Sqj4MTq0LcB3kxKP4vz8yNDY5eorvjuq0U\n\nIf you didn't request this change, please ignore this.\n\n==============================\n", html_body: nil, attachments: [], reply_to: nil, headers: %{}, private: %{}, assigns: %{}, provider_options: %{} } [debug] Replied in 230ms [info] GET /
Nous utilisons l’url fourni dans le courriel pour demander le changement de mot de passe :
Ouverture du compte avec le nouveau mot de passe :
Accès à la liste des articles créés par le compte francois-martin@gmail.com/martinmartinmartin :
La boite courriel gérée par Swoosh en local pour le projet Phoenix
Swoosh est utilisé par Phoenix pour gérer les courriels. Nous avons dans config.ex la description de l’adaptateur mis en oeuvre.
BLOGSET/config/config.ex :
# Configures the mailer # # By default it uses the "Local" adapter which stores the emails # locally. You can see the emails in your browser, at "/dev/mailbox". # # For production it's recommended to configure a different adapter # at the `config/runtime.exs`. config :blogset, Blogset.Mailer, adapter: Swoosh.Adapters.Local
Nous pouvons aller voir les courriel dans la boite local :
- cd C:\CarbonX1\Phoenix\Projets\blogset ‘dossier du projet
- code . ‘ouvrir vs code
- iex -S mix phx.server ‘execution en mode interactif
- http://localhost:4000/dev/mailbox ‘gestion des courriels
Nous pouvons aller dans la boite de reception des courriels.
Nous retrouvons le courriel envoyé pour la récupération du mot de passe.
L’accès à la page des email est défini pour /dev/mailbox dans router.ex (lligne 14 ci-dessous).
BLOGSET/lib/blogset_web/router.ex :
# Enable LiveDashboard and Swoosh mailbox preview in development if Application.compile_env(:blogset, :dev_routes) do # If you want to use the LiveDashboard in production, you should put # it behind authentication and allow only admins to access it. # If your application does not have an admins-only section yet, # you can use Plug.BasicAuth to set up some basic authentication # as long as you are also using SSL (which you should anyway). import Phoenix.LiveDashboard.Router scope "/dev" do pipe_through :browser live_dashboard "/dashboard", metrics: BlogsetWeb.Telemetry forward "/mailbox", Plug.Swoosh.MailboxPreview end end
Conclusion
Nous avons montré comment utilisé la boite courriel llocal de Phoenix. Si nous souhaitons passer en production, nous devrons trouver un service de gestion d’email et suivre la documentation pour l’installlation de ce service.
Les clef de sécurités devront être installé en dehors du dossier projet pour éviter de les rendre disponibles à tous à travers GIT. Le chargement de ces cllef se fera dans le script de configuration config/runtime.exs.