token expires check 01
This commit is contained in:
parent
e27b7d679d
commit
5a486de8f4
@ -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"]
|
||||
|
@ -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
|
||||
)
|
||||
|
||||
|
@ -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,
|
||||
),
|
||||
]
|
@ -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):
|
||||
|
@ -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):
|
||||
"""
|
||||
|
Loading…
x
Reference in New Issue
Block a user