From 67223c4b53acd10753b307176ba62bbf012b2b87 Mon Sep 17 00:00:00 2001 From: mahdavi Date: Sat, 20 Jul 2024 17:47:38 +0330 Subject: [PATCH] uuid as primary key --- apps/gooyal_oauth2/migrations/0001_initial.py | 77 ++++++++++------ apps/gooyal_oauth2/migrations/0002_initial.py | 92 ------------------- ...03_application_allowed_origins_and_more.py | 38 -------- apps/gooyal_oauth2/models.py | 13 ++- 4 files changed, 62 insertions(+), 158 deletions(-) delete mode 100644 apps/gooyal_oauth2/migrations/0002_initial.py delete mode 100644 apps/gooyal_oauth2/migrations/0003_application_allowed_origins_and_more.py diff --git a/apps/gooyal_oauth2/migrations/0001_initial.py b/apps/gooyal_oauth2/migrations/0001_initial.py index 7e76893..7f70edf 100644 --- a/apps/gooyal_oauth2/migrations/0001_initial.py +++ b/apps/gooyal_oauth2/migrations/0001_initial.py @@ -1,55 +1,41 @@ -# Generated by Django 4.1 on 2022-08-17 19:05 +# Generated by Django 5.0.6 on 2024-07-20 14:15 -from django.conf import settings -from django.db import migrations, models import django.db.models.deletion import oauth2_provider.generators import oauth2_provider.models import uuid +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): initial = True - run_before = [ - ('oauth2_provider', '0001_initial'), - ] - dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ - migrations.CreateModel( - name='AccessToken', - fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('token', models.CharField(max_length=255, unique=True)), - ('expires', models.DateTimeField()), - ('scope', models.TextField(blank=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('detail', models.JSONField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), migrations.CreateModel( name='Application', fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), ('client_id', models.CharField(db_index=True, default=oauth2_provider.generators.generate_client_id, max_length=100, unique=True)), ('redirect_uris', models.TextField(blank=True, help_text='Allowed URIs list, space separated')), + ('post_logout_redirect_uris', models.TextField(blank=True, default='', help_text='Allowed Post Logout URIs list, space separated')), ('client_type', models.CharField(choices=[('confidential', 'Confidential'), ('public', 'Public')], max_length=32)), ('authorization_grant_type', models.CharField(choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials'), ('openid-hybrid', 'OpenID connect hybrid')], max_length=32)), ('client_secret', oauth2_provider.models.ClientSecretField(blank=True, db_index=True, default=oauth2_provider.generators.generate_client_secret, help_text='Hashed on Save. Copy it now if this is a new secret.', max_length=255)), + ('hash_client_secret', models.BooleanField(default=True)), ('name', models.CharField(blank=True, max_length=255)), ('skip_authorization', models.BooleanField(default=False)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('algorithm', models.CharField(blank=True, choices=[('', 'No OIDC support'), ('RS256', 'RSA with SHA-2 256'), ('HS256', 'HMAC with SHA-2 256')], default='', max_length=5)), + ('allowed_origins', models.TextField(blank=True, default='', help_text='Allowed origins list to enable CORS, space separated')), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), ('allowed_scope', models.TextField(blank=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, @@ -58,7 +44,6 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Grant', fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), ('code', models.CharField(max_length=255, unique=True)), ('expires', models.DateTimeField()), ('redirect_uri', models.TextField()), @@ -69,6 +54,9 @@ class Migration(migrations.Migration): ('code_challenge_method', models.CharField(blank=True, choices=[('plain', 'plain'), ('S256', 'S256')], default='', max_length=10)), ('nonce', models.CharField(blank=True, default='', max_length=255)), ('claims', models.TextField(blank=True)), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='grants', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, @@ -77,12 +65,32 @@ class Migration(migrations.Migration): migrations.CreateModel( name='IDToken', fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), ('jti', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='JWT Token ID')), ('expires', models.DateTimeField()), ('scope', models.TextField(blank=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AccessToken', + fields=[ + ('token', models.CharField(db_index=True, max_length=255, unique=True)), + ('expires', models.DateTimeField()), + ('scope', models.TextField(blank=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('detail', models.JSONField(blank=True, null=True)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL)), + ('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='access_tokens', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('id_token', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='access_token', to=settings.OAUTH2_PROVIDER_ID_TOKEN_MODEL)), ], options={ 'abstract': False, @@ -91,28 +99,43 @@ class Migration(migrations.Migration): migrations.CreateModel( name='RefreshToken', fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), ('token', models.CharField(max_length=255)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('revoked', models.DateTimeField(null=True)), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('access_token', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='refresh_token', to=settings.OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL)), + ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='refresh_tokens', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, + 'unique_together': {('token', 'revoked')}, }, ), + migrations.AddField( + model_name='accesstoken', + name='source_refresh_token', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='refreshed_access_token', to=settings.OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL), + ), migrations.CreateModel( name='Resource', fields=[ ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), ('name', models.CharField(max_length=255)), ('expires', models.DateTimeField()), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='resources', to=settings.AUTH_USER_MODEL)), ], ), + migrations.AddField( + model_name='application', + name='resource', + field=models.OneToOneField(blank=True, help_text='The resource of application.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='application', to='gooyal_oauth2.resource'), + ), migrations.CreateModel( name='Scope', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), ('name', models.CharField(help_text='The name of the scope.', max_length=255, unique=True)), ('description', models.TextField(help_text='A brief description of the scope. This text is displayed to users when authorising access for the scope.')), ('is_default', models.BooleanField(default=False, help_text='Indicates if this scope should be included in the default scopes.')), diff --git a/apps/gooyal_oauth2/migrations/0002_initial.py b/apps/gooyal_oauth2/migrations/0002_initial.py deleted file mode 100644 index 933612f..0000000 --- a/apps/gooyal_oauth2/migrations/0002_initial.py +++ /dev/null @@ -1,92 +0,0 @@ -# Generated by Django 4.1 on 2022-08-17 19:05 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('gooyal_oauth2', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='resource', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='resources', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='refreshtoken', - name='access_token', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='refresh_token', to=settings.OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL), - ), - migrations.AddField( - model_name='refreshtoken', - name='application', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='refresh_tokens', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL), - ), - migrations.AddField( - model_name='refreshtoken', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='idtoken', - name='application', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL), - ), - migrations.AddField( - model_name='idtoken', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='grant', - name='application', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='grants', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL), - ), - migrations.AddField( - model_name='grant', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='application', - name='resource', - field=models.OneToOneField(blank=True, help_text='The resource of application.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='application', to='gooyal_oauth2.resource'), - ), - migrations.AddField( - model_name='application', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='accesstoken', - name='application', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='access_tokens', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL), - ), - migrations.AddField( - model_name='accesstoken', - name='id_token', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='access_token', to=settings.OAUTH2_PROVIDER_ID_TOKEN_MODEL), - ), - migrations.AddField( - model_name='accesstoken', - name='source_refresh_token', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='refreshed_access_token', to=settings.OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL), - ), - migrations.AddField( - model_name='accesstoken', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='refreshtoken', - unique_together={('token', 'revoked')}, - ), - ] diff --git a/apps/gooyal_oauth2/migrations/0003_application_allowed_origins_and_more.py b/apps/gooyal_oauth2/migrations/0003_application_allowed_origins_and_more.py deleted file mode 100644 index b3e78b1..0000000 --- a/apps/gooyal_oauth2/migrations/0003_application_allowed_origins_and_more.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 5.0.6 on 2024-06-26 12:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gooyal_oauth2', '0002_initial'), - ] - - operations = [ - migrations.AddField( - model_name='application', - name='allowed_origins', - field=models.TextField(blank=True, default='', help_text='Allowed origins list to enable CORS, space separated'), - ), - migrations.AddField( - model_name='application', - name='hash_client_secret', - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name='application', - name='post_logout_redirect_uris', - field=models.TextField(blank=True, default='', help_text='Allowed Post Logout URIs list, space separated'), - ), - migrations.AlterField( - model_name='accesstoken', - name='token', - field=models.CharField(db_index=True, max_length=255, unique=True), - ), - migrations.AlterField( - model_name='scope', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - ] diff --git a/apps/gooyal_oauth2/models.py b/apps/gooyal_oauth2/models.py index 2a988e5..59b3512 100644 --- a/apps/gooyal_oauth2/models.py +++ b/apps/gooyal_oauth2/models.py @@ -28,6 +28,8 @@ class Application(AbstractApplication): Application model for use with Django OAuth Toolkit that allows the scopes available to an application to be restricted on a per-application basis. """ + id=None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) # TODO: change it to owner user = models.ForeignKey( @@ -67,6 +69,8 @@ class Scope(models.Model): # NOTE: This is not used to limit access to the scope in any way - we want the # scope to be available to other applications in order to request access # to the resource it protects! + id = None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) application = models.ForeignKey( oauth2_settings.APPLICATION_MODEL, models.CASCADE, @@ -154,17 +158,23 @@ class Scope(models.Model): class Grant(AbstractGrant): + id = None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) application = models.ForeignKey( oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, related_name='grants' ) class RefreshToken(AbstractRefreshToken): + id = None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) application = models.ForeignKey( oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, related_name='refresh_tokens') class AccessToken(AbstractAccessToken): + id = None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) detail = JSONField(null=True, blank=True) application = models.ForeignKey( oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, blank=True, null=True, related_name='access_tokens' @@ -172,4 +182,5 @@ class AccessToken(AbstractAccessToken): class IDToken(AbstractIDToken): - pass \ No newline at end of file + id = None + uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True)