-
Notifications
You must be signed in to change notification settings - Fork 818
Description
Describe the bug
Revoking AccessTokens does not revoke the corresponding RefreshTokens. So in case, AccessToken is revoked, its deleted from the dB. If a request for a new token on TokenView comes with the existing RefreshToken, it would cause the flow to break at OAuth2Validator.get_original_scopes() due to lack of existence of AccessToken.
File "/usr/local/lib/python3.7/site-packages/oauth2_provider/oauth2_backends.py", line 138, in create_token_response
headers, extra_credentials)
File "/usr/local/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/endpoints/base.py", line 64, in wrapper
return f(endpoint, uri, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/endpoints/token.py", line 117, in create_token_response
request, self.default_token_type)
File "/usr/local/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py", line 59, in create_token_response
self.validate_token_request(request)
File "/usr/local/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py", line 117, in validate_token_request
request.refresh_token, request))
File "/usr/local/lib/python3.7/site-packages/oauth2_provider/oauth2_validators.py", line 605, in get_original_scopes
return AccessToken.objects.get(source_refresh_token_id=rt.id).scope
File "/usr/local/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
line 408, in get
self.model._meta.object_name
oauth2_provider.models.AccessToken.DoesNotExist: AccessToken matching query does not exist.
To Reproduce
- Generate access token/ refresh token pair.
- Revoke only access token by hitting:
/o/revoke_token/endpoint with a body that would look like:
{ 'token': <your access token>,
'token_type_hint': 'access_token',
'client_id': ...,
'client_secret': ...}
- Try regenerating access/refresh token pair using
refresh_tokenas yourgrant_type.
Expected behaviour
If revoking (aka deleting) only AccessTokens is allowed without revoking refresh tokens, this should not crash when generating new token with existing valid refresh token.
Version
django-oauth-toolkit==1.2.0
- I have tested with the latest published release and it's still a problem.
- I have tested with the master branch and it's still a problem.
Should be reproducible on the newer version.
Additional context
It came with this merging of this issue:
#497
wherein it was intended to provide grace period window by not deleting the Refresh token if the Access Token. This has lead to above unintended consequences.