Как сделать аутентификацию по номеру телефона?

Чтобы реализовать аутентификацию по номеру телефона в Django, вам потребуется следовать нескольким шагам. Ниже приведены подробные инструкции по каждому из шагов:

Шаг 1: Установка зависимостей
Первым делом, вам нужно установить необходимые зависимости для работы с номерами телефонов. Одной из популярных библиотек, используемой в Django для работы с номерами телефонов, является phonenumbers. Вы можете установить его, выполнив команду pip install phonenumbers.

Шаг 2: Создание кастомной модели пользователя
Поскольку вам нужно расширить стандартную модель пользователя Django, вам следует создать кастомную модель пользователя. Вы можете сделать это, создав новый файл models.py в вашем приложении и добавив следующий код:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, unique=True)

Этот класс наследуется от AbstractUser и добавляет поле phone_number, которое будет использоваться для хранения номера телефона пользователя.

Шаг 3: Создание формы регистрации
Далее, вам нужно создать форму регистрации, которая будет использоваться для ввода номера телефона и других данных пользователя. Ваша форма может выглядеть примерно так:

from django import forms
from .models import CustomUser

class RegistrationForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ['username', 'password', 'phone_number']

Шаг 4: Регистрация пользователя с помощью номера телефона
Теперь, вам нужно создать представление, которое будет обрабатывать регистрацию пользователя. Вы можете создать новый файл views.py в вашем приложении и добавить следующий код:

from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import default_token_generator
from django.shortcuts import redirect, render
from django.http import HttpResponse

from .forms import RegistrationForm

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.set_password(form.cleaned_data['password'])
            user.is_active = False
            user.save()

            # Здесь вы можете отправить SMS-код подтверждения на номер телефона пользователя

            return redirect('verification_page') # Перенаправление на страницу подтверждения

    form = RegistrationForm()
    return render(request, 'registration/register.html', {'form': form})

Это представление создает нового пользователя с помощью номера телефона, указанного в форме. После успешной регистрации, вы можете отправить SMS-код подтверждения на номер телефона пользователя.

Шаг 5: Подтверждение номера телефона
Ваше приложение должно иметь механизм для проверки подлинности номера телефона. Один из способов это сделать - это создать отдельную страницу подтверждения, на которой пользователь может ввести код подтверждения. После подтверждения номера, вы можете установить флаг is_active для пользователя на True и разрешить ему вход в систему. Вот пример кода:

def verification_page(request):
    if request.method == 'POST':
        # Здесь вы можете проверить код подтверждения, введенный пользователем
        # Если код верен, установите флаг is_active на True для пользователя

        return redirect('login') # Перенаправление на страницу входа
    return render(request, 'registration/verify.html')

Вам также понадобится создать соответствующие шаблоны register.html и verify.html для отображения форм регистрации и подтверждения соответственно.

Шаг 6: Настройка маршрутов приложения
Наконец, вы должны настроить маршруты (URL) в вашем приложении для обработки запросов регистрации и подтверждения. В файле urls.py вашего приложения добавьте следующий код:

from django.urls import path
from .views import register, verification_page

urlpatterns = [
    path('register/', register, name='register'),
    path('verify/', verification_page, name='verification_page'),
]

Теперь ваше приложение должно поддерживать аутентификацию по номеру телефона. Пользователи могут зарегистрироваться, ввести код подтверждения и войти в систему, используя свой номер телефона. Вы также можете расширить этот функционал дополнительными возможностями, например, отправкой кода подтверждения по SMS.