Skip to content

Commit 0bf0113

Browse files
committed
Fix 500 errors no user is found during logout
1 parent 2f3dd45 commit 0bf0113

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-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: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import json
2+
23
from urllib.parse import urlparse
34

45
from django.contrib.auth import logout
6+
from django.contrib.auth.models import AnonymousUser
57
from django.http import HttpResponse, JsonResponse
68
from django.urls import reverse
79
from django.utils.decorators import method_decorator
@@ -362,12 +364,13 @@ def form_valid(self, form):
362364
return self.error_response(error)
363365

364366
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:
367+
user = token_user or self.request.user
368+
# Delete Access Tokens if a user was found
369+
if oauth2_settings.OIDC_RP_INITIATED_LOGOUT_DELETE_TOKENS and not isinstance(user, AnonymousUser):
367370
AccessToken = get_access_token_model()
368371
RefreshToken = get_refresh_token_model()
369372
access_tokens_to_delete = AccessToken.objects.filter(
370-
user=token_user or self.request.user,
373+
user=user,
371374
application__client_type__in=self.token_deletion_client_types,
372375
application__authorization_grant_type__in=self.token_deletion_grant_types,
373376
)

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)