Невозможно войти в систему пользователям Django
Я пишу сайт с пользовательской моделью пользователя. Я хочу получить доступ к сайту через telegram. Все работает, но сама аутентификация - функция login ничего не делает( Я не понимаю в чем дело, уже 3 дня пробую разные способы, но ничего не получается. Буду рад любому совету. А вот мой код
#users/urls.py
from django.urls import path
from . import views
app_name = 'users'
urlpatterns = [
path('telegram_auth/generate_code/', views.GenerateTelegramCodeView.as_view(), name='generate_telegram_code'),
path('telegram_auth/', views.TelegramAuthView.as_view(), name='telegram_auth'),
path('auth/', views.AuthenticateView.as_view(), name='authenticate'),
]
#users/backend.py
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth import get_user_model
import logging
logger = logging.getLogger(__name__)
class TelegramAuthBackend(BaseBackend):
def authenticate(self, request, telegram_id=None):
logger.debug(f"Trying to authenticate user with telegram_id={telegram_id}")
UserModel = get_user_model()
try:
user = UserModel.objects.get(telegram_id=telegram_id, is_active=True)
logger.debug("User found and is active")
return user
except UserModel.DoesNotExist:
logger.debug("User not found")
return None
#users/models.py
from django.db import models
import uuid
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
from django.utils.translation import gettext_lazy as _
class AuthCode(models.Model):
code = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
session_id = models.CharField(max_length=50, null=True, blank=True)
telegram_id = models.CharField(max_length=50, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
expiry_time = models.DateTimeField() # Убедитесь, что это поле добавлено
is_used = models.BooleanField(default=False)
def __str__(self):
return f"{self.code} - Expires at {self.expiry_time}"
class CustomUserManager(BaseUserManager):
def create_user(self, telegram_id, password=None, **extra_fields):
if not telegram_id:
raise ValueError(_('The Telegram ID must be set'))
user = self.model(telegram_id=telegram_id, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, telegram_id, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(telegram_id, password, **extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
telegram_id = models.CharField(_('Telegram ID'), unique=True, max_length=50)
is_active = models.BooleanField(_('Active'), default=True)
is_staff = models.BooleanField(_('Staff status'), default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'telegram_id'
REQUIRED_FIELDS = []
# Изменение related_name для каждого поля, чтобы избежать конфликта
groups = models.ManyToManyField(
'auth.Group',
verbose_name=_('groups'),
blank=True,
help_text=_('The groups this user belongs to. A user will get all permissions granted to each of their groups.'),
related_name="customuser_set",
related_query_name="customuser",
)
user_permissions = models.ManyToManyField(
'auth.Permission',
verbose_name=_('user permissions'),
blank=True,
help_text=_('Specific permissions for this user.'),
related_name="customuser_set",
related_query_name="customuser",
)
def __str__(self):
return self.telegram_id
#authenticate.html (script)
<script>
function checkLoginStatus() {
fetch('/users/auth/', {
method: 'POST', // Явное указание, что это POST-запрос
headers: {
'Content-Type': 'application/json',
// Добавьте 'X-CSRF-Token': 'токен' если CSRF защита включена
},
credentials: 'include'
})
.then(response => response.json())
.then(data => {
if (data.isLoggedIn) {
console.log(data.message); // Пользователь вошёл в систему
clearInterval(loginStatusInterval); // Остановка интервала
window.location.href = "/"; // Перенаправление на защищённую страницу
} else {
console.log(data.message); // Пользователь не вошёл в систему
}
})
.catch(error => console.error('Ошибка при запросе статуса входа:', error));
}
// Установка интервала для периодической проверки статуса входа
let loginStatusInterval = setInterval(checkLoginStatus, 1000);
</script>
#base.html (script)
<script>
function openLoginModal() {
document.getElementById('loginModal').style.display = 'block';
}
function getTelegramCode() {
fetch('/users/telegram_auth/generate_code/')
.then(response => response.json())
.then(data => {
// Открыть ссылку в новой вкладке
window.open(`https://t.me/xkiks_bot?start=${data.code}`, '_blank');
// Закрыть модальное окно
document.getElementById('loginModal').style.display = 'none';
// Задержка перед перенаправлением, чтобы у пользователя было время увидеть открытие новой вкладки
setTimeout(function() {
window.location.href = "/users/auth/";
}, 1000); // Задержка в 1000 миллисекунд (1 секунда)
})
.catch(error => {
console.error('Error:', error);
alert('Произошла ошибка при попытке получить код доступа.');
});
}
function authenticateUser(telegram_id, code) {
fetch('/users/telegram_auth/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ telegram_id: telegram_id, code: code })
})
.then(response => response.json())
.then(data => {
if (data.status === 'success') {
alert('Успешный вход');
// Вы можете перенаправить пользователя или обновить UI, например:
// window.location.href = '/profile';
} else {
alert(data.message); // Показать ошибку пользователю
}
})
.catch(error => console.error('Error:', error));
}
</script>
Я прочитал официальную документацию и попытался разобраться в исходном коде. Но не нашел там ничего подозрительного