Déconnexion - betagouv/omniauth-proconnect GitHub Wiki

La déconnexion d'un utilisateur est légèrement plus complexe à travers un fournisseur OIDC : une fois que l'utilisateur clique "Déconnexion", vous devez aussi le déconnecter du côté de ProConnect sinon vous créez une situation asymétrique (et pénible) où votre utilisateur est déconnecté chez vous mais pas côté ProConnect.

Pour remédier à ça, le protocole OIDC décrit une cinématique très simple où l'utilisateur est envoyé sur le fournisseur d'identité (ici, ProConnect) pour se déconnecter après quoi il est renvoyé sur une URL précise côté client, la fameuse post_logout_redirect_uri qui indique "l'utilisateur s'est bien déconnecté côté FI, à vous".

Commencez par renseignez votre URL de déconnexion sur l'Espace Partenaires de ProConnect, qui dans ce guide sera http://localhost:3000/auth/proconnect/logged_out.

Ensuite, une implémentation minimale ressemblerait à ça :

--- config/initializers/omniauth.rb
+++ config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider(
    :proconnect,
    {
      # [...]
+      post_logout_redirect_uri: "http://localhost:3000/auth/proconnect/logged_out"
    }
  )
end

--- config/routes.rb
+++ config/routes.rb
+delete "/logout", to: "sessions#destroy"
+get "/auth/proconnect/logged_out", to: "sessions#proconnect_logged_out"

--- app/controllers/sessions_controller.rb
+++ app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  # [...]
+  def destroy
+    redirect_to "/auth/proconnect/logout" # intercepté par la stratégie
+  end
+
+  def proconnect_logged_out
+    clear_proconnect_setup!
+  end
+
+  private
+
+  def clear_proconnect_setup!
+     session
+       .to_hash
+       .select   { |k, _| k.include?("omniauth.pc") } # préfixe de stockage de la stratégie
+       .each_key { |k| session.delete(k) }
+  end
end