Fix bug: if you create token in django admin, token field is empty

This commit is contained in:
vlados31 2022-09-25 17:23:31 +03:00
parent 5017e004c2
commit bf4af285e8
3 changed files with 42 additions and 10 deletions

View File

@ -2,4 +2,7 @@ from django.contrib import admin
from .models import *
admin.site.register(UserToken)
@admin.register(UserToken)
class DevEventAdmin(admin.ModelAdmin):
readonly_fields = ['access_token']
fields = ['user', 'creation_time', 'access_token']

View File

@ -19,6 +19,11 @@ def account_auth(params):
return api_make_response({"access_token": token.access_token})
def account_deauth(params):
UserToken.deauth(api_get_param_str(params, "access_token"))
return api_make_response({})
def account_register(params):
name = api_get_param_str(params, "name")
surname = api_get_param_str(params, "surname")
@ -132,6 +137,15 @@ api_methods = {
"returns": "В случае правильных логина и пароля <code>access_token</code>. В противном случае объект ошибки."
},
"account.deauth": {
"func": account_deauth,
"doc": "Удаление токена, дальшейшие вызовы API с этим токеном вернут ошибку невалидного токена",
"params": [
__make_argument_access_token()
],
"returns": "В случае успеха стандартный код успеха"
},
"account.register": {
"func": account_register,
"doc": "Регистрация нового пользователя",

View File

@ -16,15 +16,7 @@ class UserToken(models.Model):
@staticmethod
def create_token(user: SiteUser):
source = bytearray(user.email + user.password + str(datetime.now()), 'utf-8')
h = sha512(source).hexdigest()
# чекаем токен в базе
if UserToken.objects.filter(access_token=h).count() != 0:
# по какой-то причине есть, выкидываем исключение
raise Exception(API_ERROR_TOKEN_CREATION)
token = UserToken(access_token=h, user=user)
token = UserToken(user=user)
token.save()
print(f"created token {token.access_token[:16]}...")
@ -43,6 +35,15 @@ class UserToken(models.Model):
return user[0]
@staticmethod
def deauth(token: str):
t = UserToken.objects.filter(access_token=token)
if len(t) == 0:
raise Exception(API_ERROR_INVALID_TOKEN)
t[0].delete()
@staticmethod
def get_user_by_token(token: str):
t = UserToken.objects.filter(access_token=token)
@ -53,3 +54,17 @@ class UserToken(models.Model):
def __str__(self):
return self.user.email + ": " + self.access_token[:10] + "..."
def save(self, *args, **kwargs):
if len(self.access_token) == 0:
source = bytearray(self.user.email + self.user.password + str(datetime.now()), 'utf-8')
t = sha512(source).hexdigest()
# чекаем токен в базе
if UserToken.objects.filter(access_token=t).count() != 0:
# по какой-то причине есть, выкидываем исключение
raise Exception(API_ERROR_TOKEN_CREATION)
self.access_token = t
super().save(*args, **kwargs)