La boite courriel locale de Phoenix

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

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 :

La boite courriel locale de Phoenix#1 - Le courriel donne l'url de la page de changement de mot de passe
La boite courriel locale de Phoenix#1 – Le courriel donne l’url de la page de changement de mot de passe

Ouverture du compte avec le nouveau mot de passe :

La boite courriel locale de Phoenix#2 - Le changement de mot de passe fonctionne
La boite courriel locale de Phoenix#2 – Le changement de mot de passe fonctionne

Accès à la liste des articles créés par le compte francois-martin@gmail.com/martinmartinmartin :

La boite courriel locale de Phoenix#3 - Accès à la liste des articles grâce au nouveau mot de passe
La boite courriel locale de Phoenix#3 – Accès à la liste des articles grâce au nouveau mot de passe

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.

La boite courriel locale de Phoenix#4 - La boite contenant les courriels
La boite courriel locale de Phoenix#4 – La boite contenant les 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.

Si vous avez aimé l'article vous êtes libre de le partager :-)

Laisser un commentaire