From cf33d617e90b3082716384d59f33a5fc60c64b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=86=E0=A4=AF=E0=A5=81=E0=A4=B7=20=E0=A4=9D=E0=A4=BE?= Date: Mon, 17 May 2021 18:00:47 +0545 Subject: [PATCH] Separate token creation logic from the create method Separates the logic of creating cryptographic token from the create method. This way, implementing another way to generate tokens becomes easier. Any function that returns a dict with the following layout can be plugged in. { "token": , "expiry": , "expiry": , } --- knox/models.py | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/knox/models.py b/knox/models.py index 4dbee1ae..9f8f3404 100644 --- a/knox/models.py +++ b/knox/models.py @@ -10,30 +10,52 @@ class AuthTokenManager(models.Manager): def create(self, user, expiry=knox_settings.TOKEN_TTL): + crypto_obj = self.generate_token() + token = crypto_obj.get("token") + digest = crypto_obj.get("digest") + expiry = crypto_obj.get("expiry") + instance = super(AuthTokenManager, self).create( + token_key=token[: CONSTANTS.TOKEN_KEY_LENGTH], + digest=digest, + user=user, + expiry=expiry, + ) + return instance, token + + def generate_token(self): + """ + Returns a dict with token, digest and expiry datetime + + Example: + { + "token": , + "expiry": , + "expiry": , + } + """ token = crypto.create_token_string() digest = crypto.hash_token(token) if expiry is not None: expiry = timezone.now() + expiry - - instance = super(AuthTokenManager, self).create( - token_key=token[:CONSTANTS.TOKEN_KEY_LENGTH], digest=digest, - user=user, expiry=expiry) - return instance, token + return {"token": token, "digest": digest, "expiry": expiry} class AuthToken(models.Model): objects = AuthTokenManager() - digest = models.CharField( - max_length=CONSTANTS.DIGEST_LENGTH, primary_key=True) - token_key = models.CharField( - max_length=CONSTANTS.TOKEN_KEY_LENGTH, db_index=True) - user = models.ForeignKey(User, null=False, blank=False, - related_name='auth_token_set', on_delete=models.CASCADE) + digest = models.CharField(max_length=CONSTANTS.DIGEST_LENGTH, primary_key=True) + token_key = models.CharField(max_length=CONSTANTS.TOKEN_KEY_LENGTH, db_index=True) + user = models.ForeignKey( + User, + null=False, + blank=False, + related_name="auth_token_set", + on_delete=models.CASCADE, + ) created = models.DateTimeField(auto_now_add=True) expiry = models.DateTimeField(null=True, blank=True) def __str__(self): - return '%s : %s' % (self.digest, self.user) + return "%s : %s" % (self.digest, self.user)