diff --git a/api/admin.py b/api/admin.py index ac7bb93..5733a15 100644 --- a/api/admin.py +++ b/api/admin.py @@ -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'] diff --git a/api/api_methods.py b/api/api_methods.py index 00c361c..817c188 100644 --- a/api/api_methods.py +++ b/api/api_methods.py @@ -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": "В случае правильных логина и пароля access_token. В противном случае объект ошибки." }, + "account.deauth": { + "func": account_deauth, + "doc": "Удаление токена, дальшейшие вызовы API с этим токеном вернут ошибку невалидного токена", + "params": [ + __make_argument_access_token() + ], + "returns": "В случае успеха стандартный код успеха" + }, + "account.register": { "func": account_register, "doc": "Регистрация нового пользователя", diff --git a/api/models.py b/api/models.py index 678b173..31daf02 100644 --- a/api/models.py +++ b/api/models.py @@ -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)