81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
import json
|
|
import logging
|
|
import uuid
|
|
|
|
from django.contrib.auth import get_user_model
|
|
from django.db import models
|
|
|
|
from spid_cie_oidc.entity.jwtse import unpad_jwt_payload
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class OidcAuthentication(models.Model):
|
|
client_id = models.CharField(max_length=255)
|
|
state = models.CharField(max_length=255, unique=True, default=uuid.uuid4)
|
|
endpoint = models.URLField(blank=True, null=True)
|
|
data = models.TextField(blank=True, null=True)
|
|
successful = models.BooleanField(default=False)
|
|
|
|
provider_id = models.CharField(max_length=255, blank=True, null=True)
|
|
provider_configuration = models.JSONField(
|
|
blank=True, null=True, default=dict
|
|
)
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
verbose_name = "OIDC Authentication"
|
|
verbose_name_plural = "OIDC Authentications"
|
|
|
|
def __str__(self):
|
|
return f"{self.client_id} {self.state} to {self.endpoint}"
|
|
|
|
|
|
class OidcAuthenticationToken(models.Model):
|
|
user = models.ForeignKey(
|
|
get_user_model(), on_delete=models.SET_NULL, blank=True, null=True
|
|
)
|
|
authz_request = models.ForeignKey(OidcAuthentication, on_delete=models.CASCADE)
|
|
code = models.CharField(max_length=2048, blank=True, null=True)
|
|
access_token = models.TextField(blank=True, null=True)
|
|
id_token = models.TextField(blank=True, null=True)
|
|
refresh_token = models.TextField(blank=True, null=True)
|
|
|
|
scope = models.CharField(max_length=255, blank=True, null=True)
|
|
token_type = models.CharField(max_length=255, blank=True, null=True)
|
|
expires_in = models.IntegerField(blank=True, null=True)
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
revoked = models.DateTimeField(blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.authz_request} {self.code}"
|
|
|
|
def token_preview(self, token):
|
|
if token:
|
|
try:
|
|
data = unpad_jwt_payload(token)
|
|
dumps = json.dumps(data, indent=2)
|
|
return dumps # mark_safe(dumps.replace("\n", "<br>").replace(" ", " "))
|
|
except Exception as e:
|
|
logger.error(e)
|
|
else:
|
|
return '--'
|
|
|
|
@property
|
|
def access_token_preview(self):
|
|
return self.token_preview(self.access_token)
|
|
|
|
@property
|
|
def id_token_preview(self):
|
|
return self.token_preview(self.id_token)
|
|
|
|
def save(self, *args, **kwargs):
|
|
super().save(*args, **kwargs)
|
|
self.authz_request.successful = True
|
|
self.authz_request.save()
|