Skip to content

Commit f28ca84

Browse files
authored
Fix 500 errors no user is found during logout (#1284)
1 parent 9000f45 commit f28ca84

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
### Added
2020
* #1273 Add caching of loading of OIDC private key.
2121

22+
- ### Fixed
23+
* #1284 Allow to logout whith no id_token_hint even if the browser session already expired
24+
2225
## [2.3.0] 2023-05-31
2326

2427
### WARNING

oauth2_provider/views/oidc.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from urllib.parse import urlparse
33

44
from django.contrib.auth import logout
5+
from django.contrib.auth.models import AnonymousUser
56
from django.http import HttpResponse, JsonResponse
67
from django.urls import reverse
78
from django.utils.decorators import method_decorator
@@ -362,12 +363,13 @@ def form_valid(self, form):
362363
return self.error_response(error)
363364

364365
def do_logout(self, application=None, post_logout_redirect_uri=None, state=None, token_user=None):
365-
# Delete Access Tokens
366-
if oauth2_settings.OIDC_RP_INITIATED_LOGOUT_DELETE_TOKENS:
366+
user = token_user or self.request.user
367+
# Delete Access Tokens if a user was found
368+
if oauth2_settings.OIDC_RP_INITIATED_LOGOUT_DELETE_TOKENS and not isinstance(user, AnonymousUser):
367369
AccessToken = get_access_token_model()
368370
RefreshToken = get_refresh_token_model()
369371
access_tokens_to_delete = AccessToken.objects.filter(
370-
user=token_user or self.request.user,
372+
user=user,
371373
application__client_type__in=self.token_deletion_client_types,
372374
application__authorization_grant_type__in=self.token_deletion_grant_types,
373375
)

tests/test_oidc_views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,15 @@ def test_rp_initiated_logout_post_allowed(logged_in_client, oidc_tokens, rp_sett
401401
assert not is_logged_in(logged_in_client)
402402

403403

404+
@pytest.mark.django_db
405+
def test_rp_initiated_logout_post_no_session(client, oidc_tokens, rp_settings):
406+
form_data = {"client_id": oidc_tokens.application.client_id, "allow": True}
407+
rsp = client.post(reverse("oauth2_provider:rp-initiated-logout"), form_data)
408+
assert rsp.status_code == 302
409+
assert rsp["Location"] == "http://testserver/"
410+
assert not is_logged_in(client)
411+
412+
404413
@pytest.mark.django_db
405414
@pytest.mark.oauth2_settings(presets.OIDC_SETTINGS_RP_LOGOUT)
406415
def test_rp_initiated_logout_expired_tokens_accept(logged_in_client, application, expired_id_token):

0 commit comments

Comments
 (0)