Social-auth-app-django: как отключить пользователя без пароля
На моем сайте (www.raptors.ru) я использую social-auth-app-django для авторизации пользователей из Facebook. Чтобы облегчить им вход на сайт, я сделал следующие настройки:
ACCOUNT_PASSWORD_INPUT_RENDER_VALUE = True
, чтобы пользователям не нужно было вводить свой пароль. Когда пользователь FB входит в систему в первый раз, создается запись в таблице users. Что важно, у этого пользователя нет пароля на моем сайте. Однако этот пользователь полностью функционален: он может публиковать посты, делать комментарии и т.д. Проблемы начинаются, если пользователь хочет отключиться от своего социального аккаунта.
Во-первых, если пользователь пытается отключить свой аккаунт через LoginCancelledView (прямая ссылка https://raptors.ru/accounts/social/login/cancelled/), он получает сообщение, что он успешно отключился, но это неправда, поскольку его имя пользователя все еще отображается в заголовке страницы (см. скриншот).
Второй способ отключения - со страницы соединений (https://raptors.ru/accounts/social/connections/).
Однако, если пользователь нажимает кнопку Remove, Django не делает этого и сообщает следующую ошибку: Ваш аккаунт не имеет установленного пароля.
Подскажите, пожалуйста, какой правильный и рабочий способ отключить (или полностью удалить) пользователя Facebook с моего сайта? FB настаивает, что я должен предоставить такую возможность.
Allauth предоставляет представление для установки пароля существующего пользователя, которое может быть использовано для добавления пароля пользователю, который ранее имел только социальный логин. Из документации :
Аутентифицированные пользователи могут управлять своим паролем, используя представления
allauth.account.views.PasswordSetViewиallauth.account.views.PasswordChangeView, расположенные по адресу /accounts/password/set/ соответственно /accounts/password/change/ (имена URLaccount_set_passwordиaccount_change_passwordсоответственно).Пользователи перенаправляются между этими представлениями в зависимости от того, установили они пароль или нет (
.user.has_usable_password()). Обычно, когда пользователи регистрируются через социального провайдера, они не устанавливают пароль.
Сначала пользователь должен установить пароль (перейдя в /accounts/password/set/), а затем отключить социальный аккаунт.
Существует метод logout (django.contrib.auth), который может быть использован для этого, например. в моем views.py:
from django.contrib.auth import logout
from django.shortcuts import redirect
...
def logout_request(request)
logout(request)
return redirect('/')
и в моем urls.py, чтобы вызвать этот метод:
urlpatterns =[
...,
path('logout', views.logout_request, name="logout),
]
и это работает для меня


