bugfix use pk instead of id in refresh token

This commit is contained in:
Sayyid Hamid Mahdavi 2024-12-30 17:48:26 +03:30
parent 10e497fd0a
commit ed227c43dc
4 changed files with 112 additions and 44 deletions

View file

@ -77,8 +77,11 @@ OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = 'gooyal_oauth2.RefreshToken'
OIDC_RSA_PRIVATE_KEY_FILE_PATH = config('OIDC_RSA_PRIVATE_KEY_FILE_PATH', default=None) OIDC_RSA_PRIVATE_KEY_FILE_PATH = config('OIDC_RSA_PRIVATE_KEY_FILE_PATH', default=None)
if OIDC_RSA_PRIVATE_KEY_FILE_PATH:
with open(OIDC_RSA_PRIVATE_KEY_FILE_PATH) as oidc_rsa_private_key_file: with open(OIDC_RSA_PRIVATE_KEY_FILE_PATH) as oidc_rsa_private_key_file:
OIDC_RSA_PRIVATE_KEY = oidc_rsa_private_key_file.read() OIDC_RSA_PRIVATE_KEY = oidc_rsa_private_key_file.read()
else:
OIDC_RSA_PRIVATE_KEY = None
OAUTH2_PROVIDER = { OAUTH2_PROVIDER = {
# this is the list of available scopes # this is the list of available scopes

View file

@ -0,0 +1,35 @@
# Generated by Django 5.1.4 on 2024-12-30 13:48
import oauth2_provider.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gooyal_oauth2', '0002_alter_application_name'),
]
operations = [
migrations.AddField(
model_name='accesstoken',
name='token_checksum',
field=oauth2_provider.models.TokenChecksumField(db_index=True, default='', max_length=64, unique=True),
preserve_default=False,
),
migrations.AddField(
model_name='refreshtoken',
name='token_family',
field=models.UUIDField(blank=True, editable=False, null=True),
),
migrations.AlterField(
model_name='accesstoken',
name='token',
field=models.TextField(),
),
migrations.AlterField(
model_name='application',
name='name',
field=models.CharField(max_length=255, unique=True),
),
]

View file

@ -1,12 +1,18 @@
import requests import requests
from django.conf import settings
from django.db import models
from django.db.models import JSONField from django.db.models import JSONField
from oauth2_provider.models import AbstractApplication, AbstractAccessToken, AbstractGrant, AbstractRefreshToken, \ from oauth2_provider.models import AbstractApplication, AbstractAccessToken, AbstractGrant, AbstractRefreshToken, \
AbstractIDToken AbstractIDToken, get_access_token_model, get_refresh_token_model
from oauth2_provider.scopes import get_scopes_backend from oauth2_provider.scopes import get_scopes_backend
from oauth2_provider.settings import oauth2_settings from oauth2_provider.settings import oauth2_settings
import uuid import uuid
from contextlib import suppress
from django.conf import settings
from django.db import models, router, transaction
from django.utils import timezone
from .settings import oauth2_settings
class Resource(models.Model): class Resource(models.Model):
@ -176,6 +182,30 @@ class RefreshToken(AbstractRefreshToken):
application = models.ForeignKey( application = models.ForeignKey(
oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, related_name='refresh_tokens') oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, related_name='refresh_tokens')
# TODO: submit merge request
def revoke(self):
"""
Mark this refresh token revoked and revoke related access token
"""
access_token_model = get_access_token_model()
access_token_database = router.db_for_write(access_token_model)
refresh_token_model = get_refresh_token_model()
# Use the access_token_database instead of making the assumption it is in 'default'.
with transaction.atomic(using=access_token_database):
token = refresh_token_model.objects.select_for_update().filter(pk=self.pk, revoked__isnull=True)
if not token:
return
self = list(token)[0]
with suppress(access_token_model.DoesNotExist):
access_token_model.objects.get(pk=self.access_token_id).revoke()
self.access_token = None
self.revoked = timezone.now()
self.save()
class AccessToken(AbstractAccessToken): class AccessToken(AbstractAccessToken):
id = None id = None

View file

@ -4,27 +4,27 @@
# #
# pip-compile # pip-compile
# #
amqp==5.2.0 amqp==5.3.1
# via kombu # via kombu
asgiref==3.8.1 asgiref==3.8.1
# via # via
# django # django
# django-cors-headers # django-cors-headers
async-timeout==4.0.3 async-timeout==5.0.1
# via redis # via redis
attrs==23.2.0 attrs==24.3.0
# via # via
# jsonschema # jsonschema
# referencing # referencing
billiard==4.2.0 billiard==4.2.1
# via celery # via celery
celery==5.4.0 celery==5.4.0
# via -r requirements.in # via -r requirements.in
certifi==2024.6.2 certifi==2024.12.14
# via requests # via requests
cffi==1.16.0 cffi==1.17.1
# via cryptography # via cryptography
charset-normalizer==3.3.2 charset-normalizer==3.4.0
# via requests # via requests
click==8.1.7 click==8.1.7
# via # via
@ -38,11 +38,11 @@ click-plugins==1.1.1
# via celery # via celery
click-repl==0.3.0 click-repl==0.3.0
# via celery # via celery
crispy-bootstrap5==2024.2 crispy-bootstrap5==2024.10
# via -r requirements.in # via -r requirements.in
cryptography==42.0.8 cryptography==44.0.0
# via jwcrypto # via jwcrypto
django==5.0.6 django==5.1.4
# via # via
# -r requirements.in # -r requirements.in
# crispy-bootstrap5 # crispy-bootstrap5
@ -56,31 +56,31 @@ django==5.0.6
# drf-spectacular # drf-spectacular
django-betterforms==2.0.0 django-betterforms==2.0.0
# via -r requirements.in # via -r requirements.in
django-cors-headers==4.4.0 django-cors-headers==4.6.0
# via -r requirements.in # via -r requirements.in
django-crispy-forms==2.2 django-crispy-forms==2.3
# via # via
# -r requirements.in # -r requirements.in
# crispy-bootstrap5 # crispy-bootstrap5
django-filter==24.2 django-filter==24.3
# via -r requirements.in # via -r requirements.in
django-jalali-date==1.1.3 django-jalali-date==1.1.3
# via -r requirements.in # via -r requirements.in
django-oauth-toolkit==2.4.0 django-oauth-toolkit==3.0.1
# via -r requirements.in # via -r requirements.in
djangorestframework==3.15.2 djangorestframework==3.15.2
# via # via
# -r requirements.in # -r requirements.in
# drf-spectacular # drf-spectacular
drf-spectacular==0.27.2 drf-spectacular==0.28.0
# via -r requirements.in # via -r requirements.in
gevent==24.2.1 gevent==24.11.1
# via -r requirements.in # via -r requirements.in
greenlet==3.0.3 greenlet==3.1.1
# via gevent # via gevent
gunicorn==22.0.0 gunicorn==23.0.0
# via -r requirements.in # via -r requirements.in
idna==3.7 idna==3.10
# via requests # via requests
inflection==0.5.1 inflection==0.5.1
# via drf-spectacular # via drf-spectacular
@ -88,27 +88,27 @@ jalali-core==1.0.0
# via jdatetime # via jdatetime
jdatetime==5.0.0 jdatetime==5.0.0
# via django-jalali-date # via django-jalali-date
jsonschema==4.22.0 jsonschema==4.23.0
# via drf-spectacular # via drf-spectacular
jsonschema-specifications==2023.12.1 jsonschema-specifications==2024.10.1
# via jsonschema # via jsonschema
jwcrypto==1.5.6 jwcrypto==1.5.6
# via django-oauth-toolkit # via django-oauth-toolkit
kombu==5.3.7 kombu==5.4.2
# via celery # via celery
markdown==3.6 markdown==3.7
# via -r requirements.in # via -r requirements.in
oauthlib==3.2.2 oauthlib==3.2.2
# via django-oauth-toolkit # via django-oauth-toolkit
packaging==24.1 packaging==24.2
# via gunicorn # via gunicorn
pillow==10.3.0 pillow==11.0.0
# via -r requirements.in # via -r requirements.in
prompt-toolkit==3.0.47 prompt-toolkit==3.0.48
# via click-repl # via click-repl
psycopg[binary]==3.1.19 psycopg[binary]==3.2.3
# via -r requirements.in # via -r requirements.in
psycopg-binary==3.1.19 psycopg-binary==3.2.3
# via psycopg # via psycopg
pycparser==2.22 pycparser==2.22
# via cffi # via cffi
@ -116,11 +116,9 @@ python-dateutil==2.9.0.post0
# via celery # via celery
python-decouple==3.8 python-decouple==3.8
# via -r requirements.in # via -r requirements.in
pytz==2024.1 pyyaml==6.0.2
# via django-oauth-toolkit
pyyaml==6.0.1
# via drf-spectacular # via drf-spectacular
redis==5.0.6 redis==5.2.1
# via -r requirements.in # via -r requirements.in
referencing==0.35.1 referencing==0.35.1
# via # via
@ -128,23 +126,25 @@ referencing==0.35.1
# jsonschema-specifications # jsonschema-specifications
requests==2.32.3 requests==2.32.3
# via django-oauth-toolkit # via django-oauth-toolkit
rpds-py==0.18.1 rpds-py==0.22.3
# via # via
# jsonschema # jsonschema
# referencing # referencing
six==1.16.0 six==1.17.0
# via python-dateutil # via python-dateutil
sqlparse==0.5.0 sqlparse==0.5.3
# via django # via django
typing-extensions==4.12.2 typing-extensions==4.12.2
# via # via
# jwcrypto # jwcrypto
# psycopg # psycopg
tzdata==2024.1 tzdata==2024.2
# via celery # via
# celery
# kombu
uritemplate==4.1.1 uritemplate==4.1.1
# via drf-spectacular # via drf-spectacular
urllib3==2.2.2 urllib3==2.2.3
# via requests # via requests
vine==5.1.0 vine==5.1.0
# via # via
@ -155,7 +155,7 @@ wcwidth==0.2.13
# via prompt-toolkit # via prompt-toolkit
zope-event==5.0 zope-event==5.0
# via gevent # via gevent
zope-interface==6.4.post2 zope-interface==7.2
# via gevent # via gevent
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file: