@@ -367,17 +367,66 @@ def validate_logout_request(self, id_token_hint, client_id, post_logout_redirect
367
367
return application , id_token .user if id_token else None
368
368
369
369
def must_prompt (self , token_user ):
370
- """Indicate whether the logout has to be confirmed by the user. This happens if the
371
- specifications force a confirmation, or it is enabled by `OIDC_RP_INITIATED_LOGOUT_ALWAYS_PROMPT`.
370
+ """
371
+ per: https://openid.net/specs/openid-connect-rpinitiated-1_0.html
372
+
373
+ > At the Logout Endpoint, the OP SHOULD ask the End-User whether to log
374
+ > out of the OP as well. Furthermore, the OP MUST ask the End-User this
375
+ > question if an id_token_hint was not provided or if the supplied ID
376
+ > Token does not belong to the current OP session with the RP and/or
377
+ > currently logged in End-User.
372
378
373
- A logout without user interaction (i.e. no prompt) is only allowed
374
- if an ID Token is provided that matches the current user.
375
379
"""
376
- return (
377
- oauth2_settings .OIDC_RP_INITIATED_LOGOUT_ALWAYS_PROMPT
378
- or token_user is None
379
- or token_user != self .request .user
380
- )
380
+
381
+ if not self .request .user .is_authenticated :
382
+ """
383
+ > the OP MUST ask ask the End-User whether to log out of the OP as
384
+
385
+ If the user does not have an active session with the OP, they cannot
386
+ end their OP session, so there is nothing to prompt for. This occurs
387
+ in cases where the user has logged out of the OP via another channel
388
+ such as the OP's own logout page, session timeout or another RP's
389
+ logout page.
390
+ """
391
+ return False
392
+
393
+ if oauth2_settings .OIDC_RP_INITIATED_LOGOUT_ALWAYS_PROMPT :
394
+ """
395
+ > At the Logout Endpoint, the OP SHOULD ask the End-User whether to
396
+ > log out of the OP as well
397
+
398
+ The admin has configured the OP to always prompt the userfor logout
399
+ per the SHOULD recommendation.
400
+ """
401
+ return True
402
+
403
+ if token_user is None :
404
+ """
405
+ > the OP MUST ask ask the End-User whether to log out of the OP as
406
+ > well if the supplied ID Token does not belong to the current OP
407
+ > session with the RP.
408
+
409
+ token_user will only be populated if an ID token was found for the
410
+ RP (Application) that is requesting the logout. If token_user is not
411
+ then we must prompt the user.
412
+ """
413
+ return True
414
+
415
+ if token_user != self .request .user :
416
+ """
417
+ > the OP MUST ask ask the End-User whether to log out of the OP as
418
+ > well if the supplied ID Token does not belong to the logged in
419
+ > End-User.
420
+
421
+ is_authenticated indicates that there is a logged in user and was
422
+ tested in the first condition.
423
+ token_user != self.request.user indicates that the token does not
424
+ belong to the logged in user, Therefore we need to prompt the user.
425
+ """
426
+ return True
427
+
428
+ """ We didn't find a reason to prompt the user """
429
+ return False
381
430
382
431
def do_logout (self , application = None , post_logout_redirect_uri = None , state = None , token_user = None ):
383
432
user = token_user or self .request .user
0 commit comments