From bb11c76649e5db48cc42d38676b623ce004c6b63 Mon Sep 17 00:00:00 2001
From: Arie Peterson <arie@greenhost.nl>
Date: Tue, 19 Sep 2023 17:00:46 +0200
Subject: [PATCH] End kratos session in prelogout as well

---
 backend/web/login/login.py | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/backend/web/login/login.py b/backend/web/login/login.py
index 57225371..6947038e 100644
--- a/backend/web/login/login.py
+++ b/backend/web/login/login.py
@@ -580,15 +580,32 @@ def prelogout():
 
     current_app.logger.info("Logout request hydra, subject %s", logout_request.subject)
 
-    # Accept logout request and direct to hydra to remove cookies
+    # Accept logout request. We ignore the redirect URL
+    # (`hydra_return.redirect_to`) because we also need to do the kratos logout
+    # browser flow and we can't do both.
     try:
         hydra_return = hydra_admin_api.accept_logout_request(challenge)
-        if hydra_return:
-          return redirect(hydra_return.redirect_to)
-
     except Exception as ex:
         current_app.logger.info("Error logging out hydra: %s", str(ex))
 
+    # Now start ending the kratos session.
+    kratos_cookie = get_kratos_cookie()
+    if not kratos_cookie:
+        # No kratos cookie, already logged out from kratos.
+        current_app.logger.info("Expected kratos cookie but not found. Redirecting to hydra post-logout");
+        return redirect(hydra_post_logout)
+    try:
+        # Create a Logout URL for Browsers
+        kratos_api_response = \
+            admin_frontend_api.create_browser_logout_flow(
+                cookie=kratos_cookie)
+        current_app.logger.info(kratos_api_response)
+        return render_template("clear.html",
+            url=kratos_api_response.logout_url)
+    except ory_kratos_client.ApiException as ex:
+        current_app.logger.error("Exception when calling"
+            " create_browser_logout_flow: %s\n",
+            ex)
 
     current_app.logger.info("Hydra logout not completed. Redirecting to kratos logout, maybe user removed cookies manually")
     return redirect("logout")
-- 
GitLab