We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Reconfigure OIDC logout to send client_id
Login.gov recently changed their logout method to take `client_id` instead of the previous parameter `id_token_hint`. We need to change our code to match.

![Screen Shot 2022-10-20 at 15 26 58](https://user-images.githubusercontent.com/443389/197051545-59d60ba9-af91-42d7-8d00-d515c9210d4c.png)

@SSPJ knows this code the best of any of us.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/djangooidc/views.py`
Content:
```
1 # coding: utf-8
2 
3 import logging
4 
5 from django.conf import settings
6 from django.contrib.auth import logout as auth_logout
7 from django.contrib.auth import authenticate, login
8 from django.http import HttpResponseRedirect
9 from django.shortcuts import redirect, render
10 from urllib.parse import parse_qs, urlencode
11 
12 from djangooidc.oidc import Client
13 from djangooidc import exceptions as o_e
14 
15 
16 logger = logging.getLogger(__name__)
17 
18 try:
19     # Initialize provider using pyOICD
20     OP = getattr(settings, "OIDC_ACTIVE_PROVIDER")
21     CLIENT = Client(OP)
22     logger.debug("client initialized %s" % CLIENT)
23 except Exception as err:
24     CLIENT = None  # type: ignore
25     logger.warning(err)
26     logger.warning("Unable to configure OpenID Connect provider. Users cannot log in.")
27 
28 
29 def error_page(request, error):
30     """Display a sensible message and log the error."""
31     logger.error(error)
32     if isinstance(error, o_e.AuthenticationFailed):
33         return render(
34             request,
35             "401.html",
36             context={
37                 "friendly_message": error.friendly_message,
38                 "log_identifier": error.locator,
39             },
40             status=401,
41         )
42     if isinstance(error, o_e.InternalError):
43         return render(
44             request,
45             "500.html",
46             context={
47                 "friendly_message": error.friendly_message,
48                 "log_identifier": error.locator,
49             },
50             status=500,
51         )
52     if isinstance(error, Exception):
53         return render(request, "500.html", status=500)
54 
55 
56 def openid(request):
57     """Redirect the user to an authentication provider (OP)."""
58     request.session["next"] = request.GET.get("next", "/")
59 
60     try:
61         return CLIENT.create_authn_request(request.session)
62     except Exception as err:
63         return error_page(request, err)
64 
65 
66 def login_callback(request):
67     """Analyze the token returned by the authentication provider (OP)."""
68     try:
69         query = parse_qs(request.GET.urlencode())
70         userinfo = CLIENT.callback(query, request.session)
71         user = authenticate(request=request, **userinfo)
72         if user:
73             login(request, user)
74             logger.info("Successfully logged in user %s" % user)
75             return redirect(request.session.get("next", "/"))
76         else:
77             raise o_e.BannedUser()
78     except Exception as err:
79         return error_page(request, err)
80 
81 
82 def logout(request, next_page=None):
83     """Redirect the user to the authentication provider (OP) logout page."""
84     try:
85         username = request.user.username
86         request_args = {
87             # it is perfectly fine to send the token, even if it is expired
88             "id_token_hint": request.session["id_token_raw"],
89             "state": request.session["state"],
90         }
91         if (
92             "post_logout_redirect_uris" in CLIENT.registration_response.keys()
93             and len(CLIENT.registration_response["post_logout_redirect_uris"]) > 0
94         ):
95             request_args.update(
96                 {
97                     "post_logout_redirect_uri": CLIENT.registration_response[
98                         "post_logout_redirect_uris"
99                     ][0]
100                 }
101             )
102 
103         url = CLIENT.provider_info["end_session_endpoint"]
104         url += "?" + urlencode(request_args)
105         return HttpResponseRedirect(url)
106     except Exception as err:
107         return error_page(request, err)
108     finally:
109         # Always remove Django session stuff - even if not logged out from OP.
110         # Don't wait for the callback as it may never come.
111         auth_logout(request)
112         logger.info("Successfully logged out user %s" % username)
113         next_page = getattr(settings, "LOGOUT_REDIRECT_URL", None)
114         if next_page:
115             request.session["next"] = next_page
116 
117 
118 def logout_callback(request):
119     """Simple redirection view: after logout, redirect to `next`."""
120     next = request.session.get("next", "/")
121     return redirect(next)
122
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/djangooidc/views.py b/src/djangooidc/views.py
--- a/src/djangooidc/views.py
+++ b/src/djangooidc/views.py
@@ -84,8 +84,7 @@
     try:
         username = request.user.username
         request_args = {
-            # it is perfectly fine to send the token, even if it is expired
-            "id_token_hint": request.session["id_token_raw"],
+            "client_id": CLIENT.client_id,
             "state": request.session["state"],
         }
         if (

{"golden_diff": "diff --git a/src/djangooidc/views.py b/src/djangooidc/views.py\n--- a/src/djangooidc/views.py\n+++ b/src/djangooidc/views.py\n@@ -84,8 +84,7 @@\n     try:\n         username = request.user.username\n         request_args = {\n-            # it is perfectly fine to send the token, even if it is expired\n-            \"id_token_hint\": request.session[\"id_token_raw\"],\n+            \"client_id\": CLIENT.client_id,\n             \"state\": request.session[\"state\"],\n         }\n         if (\n", "issue": "Reconfigure OIDC logout to send client_id\nLogin.gov recently changed their logout method to take `client_id` instead of the previous parameter `id_token_hint`. We need to change our code to match.\r\n\r\n![Screen Shot 2022-10-20 at 15 26 58](https://user-images.githubusercontent.com/443389/197051545-59d60ba9-af91-42d7-8d00-d515c9210d4c.png)\r\n\r\n@SSPJ knows this code the best of any of us.\n", "before_files": [{"content": "# coding: utf-8\n\nimport logging\n\nfrom django.conf import settings\nfrom django.contrib.auth import logout as auth_logout\nfrom django.contrib.auth import authenticate, login\nfrom django.http import HttpResponseRedirect\nfrom django.shortcuts import redirect, render\nfrom urllib.parse import parse_qs, urlencode\n\nfrom djangooidc.oidc import Client\nfrom djangooidc import exceptions as o_e\n\n\nlogger = logging.getLogger(__name__)\n\ntry:\n    # Initialize provider using pyOICD\n    OP = getattr(settings, \"OIDC_ACTIVE_PROVIDER\")\n    CLIENT = Client(OP)\n    logger.debug(\"client initialized %s\" % CLIENT)\nexcept Exception as err:\n    CLIENT = None  # type: ignore\n    logger.warning(err)\n    logger.warning(\"Unable to configure OpenID Connect provider. Users cannot log in.\")\n\n\ndef error_page(request, error):\n    \"\"\"Display a sensible message and log the error.\"\"\"\n    logger.error(error)\n    if isinstance(error, o_e.AuthenticationFailed):\n        return render(\n            request,\n            \"401.html\",\n            context={\n                \"friendly_message\": error.friendly_message,\n                \"log_identifier\": error.locator,\n            },\n            status=401,\n        )\n    if isinstance(error, o_e.InternalError):\n        return render(\n            request,\n            \"500.html\",\n            context={\n                \"friendly_message\": error.friendly_message,\n                \"log_identifier\": error.locator,\n            },\n            status=500,\n        )\n    if isinstance(error, Exception):\n        return render(request, \"500.html\", status=500)\n\n\ndef openid(request):\n    \"\"\"Redirect the user to an authentication provider (OP).\"\"\"\n    request.session[\"next\"] = request.GET.get(\"next\", \"/\")\n\n    try:\n        return CLIENT.create_authn_request(request.session)\n    except Exception as err:\n        return error_page(request, err)\n\n\ndef login_callback(request):\n    \"\"\"Analyze the token returned by the authentication provider (OP).\"\"\"\n    try:\n        query = parse_qs(request.GET.urlencode())\n        userinfo = CLIENT.callback(query, request.session)\n        user = authenticate(request=request, **userinfo)\n        if user:\n            login(request, user)\n            logger.info(\"Successfully logged in user %s\" % user)\n            return redirect(request.session.get(\"next\", \"/\"))\n        else:\n            raise o_e.BannedUser()\n    except Exception as err:\n        return error_page(request, err)\n\n\ndef logout(request, next_page=None):\n    \"\"\"Redirect the user to the authentication provider (OP) logout page.\"\"\"\n    try:\n        username = request.user.username\n        request_args = {\n            # it is perfectly fine to send the token, even if it is expired\n            \"id_token_hint\": request.session[\"id_token_raw\"],\n            \"state\": request.session[\"state\"],\n        }\n        if (\n            \"post_logout_redirect_uris\" in CLIENT.registration_response.keys()\n            and len(CLIENT.registration_response[\"post_logout_redirect_uris\"]) > 0\n        ):\n            request_args.update(\n                {\n                    \"post_logout_redirect_uri\": CLIENT.registration_response[\n                        \"post_logout_redirect_uris\"\n                    ][0]\n                }\n            )\n\n        url = CLIENT.provider_info[\"end_session_endpoint\"]\n        url += \"?\" + urlencode(request_args)\n        return HttpResponseRedirect(url)\n    except Exception as err:\n        return error_page(request, err)\n    finally:\n        # Always remove Django session stuff - even if not logged out from OP.\n        # Don't wait for the callback as it may never come.\n        auth_logout(request)\n        logger.info(\"Successfully logged out user %s\" % username)\n        next_page = getattr(settings, \"LOGOUT_REDIRECT_URL\", None)\n        if next_page:\n            request.session[\"next\"] = next_page\n\n\ndef logout_callback(request):\n    \"\"\"Simple redirection view: after logout, redirect to `next`.\"\"\"\n    next = request.session.get(\"next\", \"/\")\n    return redirect(next)\n", "path": "src/djangooidc/views.py"}], "after_files": [{"content": "# coding: utf-8\n\nimport logging\n\nfrom django.conf import settings\nfrom django.contrib.auth import logout as auth_logout\nfrom django.contrib.auth import authenticate, login\nfrom django.http import HttpResponseRedirect\nfrom django.shortcuts import redirect, render\nfrom urllib.parse import parse_qs, urlencode\n\nfrom djangooidc.oidc import Client\nfrom djangooidc import exceptions as o_e\n\n\nlogger = logging.getLogger(__name__)\n\ntry:\n    # Initialize provider using pyOICD\n    OP = getattr(settings, \"OIDC_ACTIVE_PROVIDER\")\n    CLIENT = Client(OP)\n    logger.debug(\"client initialized %s\" % CLIENT)\nexcept Exception as err:\n    CLIENT = None  # type: ignore\n    logger.warning(err)\n    logger.warning(\"Unable to configure OpenID Connect provider. Users cannot log in.\")\n\n\ndef error_page(request, error):\n    \"\"\"Display a sensible message and log the error.\"\"\"\n    logger.error(error)\n    if isinstance(error, o_e.AuthenticationFailed):\n        return render(\n            request,\n            \"401.html\",\n            context={\n                \"friendly_message\": error.friendly_message,\n                \"log_identifier\": error.locator,\n            },\n            status=401,\n        )\n    if isinstance(error, o_e.InternalError):\n        return render(\n            request,\n            \"500.html\",\n            context={\n                \"friendly_message\": error.friendly_message,\n                \"log_identifier\": error.locator,\n            },\n            status=500,\n        )\n    if isinstance(error, Exception):\n        return render(request, \"500.html\", status=500)\n\n\ndef openid(request):\n    \"\"\"Redirect the user to an authentication provider (OP).\"\"\"\n    request.session[\"next\"] = request.GET.get(\"next\", \"/\")\n\n    try:\n        return CLIENT.create_authn_request(request.session)\n    except Exception as err:\n        return error_page(request, err)\n\n\ndef login_callback(request):\n    \"\"\"Analyze the token returned by the authentication provider (OP).\"\"\"\n    try:\n        query = parse_qs(request.GET.urlencode())\n        userinfo = CLIENT.callback(query, request.session)\n        user = authenticate(request=request, **userinfo)\n        if user:\n            login(request, user)\n            logger.info(\"Successfully logged in user %s\" % user)\n            return redirect(request.session.get(\"next\", \"/\"))\n        else:\n            raise o_e.BannedUser()\n    except Exception as err:\n        return error_page(request, err)\n\n\ndef logout(request, next_page=None):\n    \"\"\"Redirect the user to the authentication provider (OP) logout page.\"\"\"\n    try:\n        username = request.user.username\n        request_args = {\n            \"client_id\": CLIENT.client_id,\n            \"state\": request.session[\"state\"],\n        }\n        if (\n            \"post_logout_redirect_uris\" in CLIENT.registration_response.keys()\n            and len(CLIENT.registration_response[\"post_logout_redirect_uris\"]) > 0\n        ):\n            request_args.update(\n                {\n                    \"post_logout_redirect_uri\": CLIENT.registration_response[\n                        \"post_logout_redirect_uris\"\n                    ][0]\n                }\n            )\n\n        url = CLIENT.provider_info[\"end_session_endpoint\"]\n        url += \"?\" + urlencode(request_args)\n        return HttpResponseRedirect(url)\n    except Exception as err:\n        return error_page(request, err)\n    finally:\n        # Always remove Django session stuff - even if not logged out from OP.\n        # Don't wait for the callback as it may never come.\n        auth_logout(request)\n        logger.info(\"Successfully logged out user %s\" % username)\n        next_page = getattr(settings, \"LOGOUT_REDIRECT_URL\", None)\n        if next_page:\n            request.session[\"next\"] = next_page\n\n\ndef logout_callback(request):\n    \"\"\"Simple redirection view: after logout, redirect to `next`.\"\"\"\n    next = request.session.get(\"next\", \"/\")\n    return redirect(next)\n", "path": "src/djangooidc/views.py"}]}