token expires check 01

This commit is contained in:
Corban-Lee Jones 2024-05-31 23:47:18 +01:00
parent e27b7d679d
commit 5a486de8f4
5 changed files with 39 additions and 4 deletions

View File

@ -37,6 +37,12 @@ class DiscordAuthenticationBackend(BaseBackend):
based on the provided `discord_user_data`.
"""
# TODO:
# also check the new `token_expires` field to see if the token is invalid
# then request a new token, instead of making the user login again
#
# https://discord.com/developers/docs/game-sdk/applications#data-models
log.debug(discord_user_data)
discord_user_id = discord_user_data["id"]

View File

@ -45,6 +45,7 @@ class DiscordUserOAuth2Manager(BaseUserManager):
locale=user["locale"],
mfa_enabled=user["mfa_enabled"],
access_token=user["access_token"],
token_expires=user["token_expires"],
**extra_fields
)

View File

@ -0,0 +1,19 @@
# Generated by Django 5.0.4 on 2024-05-31 22:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentication', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='discorduser',
name='token_expires',
field=models.DateTimeField(default=0, help_text='when to request a new access token.', verbose_name='token expires'),
preserve_default=False,
),
]

View File

@ -66,6 +66,11 @@ class DiscordUser(PermissionsMixin):
help_text=_("token for the application to make api calls on behalf of the user.")
)
token_expires = models.DateTimeField(
_("token expires"),
help_text=_("when to request a new access token.")
)
# Custom Attributes
class USER_TYPES(models.TextChoices):

View File

@ -31,16 +31,17 @@ class DiscordLoginRedirect(View):
return redirect("auth:login")
code = request.GET.get("code")
access_token = self.exchange_code_for_token(code)
access_token, token_expires = self.exchange_code_for_token(code)
raw_user_data = self.get_raw_user_data(access_token)
raw_user_data["access_token"] = access_token
raw_user_data["token_expires"] = token_expires
discord_user = authenticate(request, discord_user_data=raw_user_data)
login(request, discord_user)
return redirect("home:index")
def exchange_code_for_token(self, code: str) -> dict:
def exchange_code_for_token(self, code: str) -> tuple[str, str]:
"""
Exchanges the given code for an access token.
A call is made to the Discord API.
@ -58,9 +59,12 @@ class DiscordLoginRedirect(View):
headers=request_data["headers"]
)
log.debug(response)
resp_json = response.json()
log.debug(resp_json)
access_token = resp_json["access_token"]
expires = resp_json["expires"]
return response.json()["access_token"]
return access_token, expires
def get_raw_user_data(self, access_token: str):
"""