Проверка request.user.is_authenticated не работает так, как ожидалось, для маршрутов, отличных от тех, что предоставляются Django Allauth
У меня проблема, когда request.user.is_authenticated возвращает false с валидным X-Session-Token, отправленным в заголовке, когда запрос отправляется к другой части приложения, кроме тех url, которые предоставляются allauth и headless. Я новичок в Django и фактически это мой первый Django проект. Возможно, я что-то упускаю, но не нашел решения в других местах.
Я использовал пользовательский пользователь через CustomAccountAdapter, который расширяет allauth.account.adapter.DefaultAccountAdapter, переопределив функцию save_user, основываясь на том, что я почерпнул из документации. Я определил пользовательскую токен-стратегию для генерации access_token и refresh token, скопировав реализацию session token из allauth:
from allauth.account.adapter import DefaultAccountAdapter
from users.models.user_profile import UserProfile
from allauth.account.utils import user_email, user_username
import json
class CustomAccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=True):
data = json.loads(request.body)
email = data.get("email")
username = data.get("username")
user_email(user, email)
user_username(user, username)
if "password" in data:
user.set_password(data["password"])
else:
user.set_unusable_password()
self.populate_username(request, user)
user.is_creator = data.get('is_creator', False)
if commit:
# Ability not to commit makes it easier to derive from
# this adapter by adding
user.save()
if data.get('birth_date', False):
UserProfile.objects.create(user=user, birth_date=data.get('birth_date', None))
return user
У меня есть пользовательское промежуточное ПО, в котором я хочу заблокировать доступ неаутентифицированного запроса к некоторым шаблонам маршрутов, но промежуточное ПО не смогло получить запрос. Пользователь
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
class BlockAnonymousUsersMiddleware(MiddlewareMixin):
def process_request(self, request):
print(request.user)
protected_paths = ['/api/']
for path in protected_paths:
if request.path.startswith(path) and not request.user.is_authenticated:
return JsonResponse({
'status': 401,
'errors': [{'message': 'Authentication required'}]
})
Here is the middleware used in the app as contained in settings.py
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'allauth.account.middleware.AccountMiddleware',
'users.middlewares.BlockAnonymousUsersMiddleware',
]
Моя CustomTokenStrategy, похоже, не является причиной, так как ее комментирование ничего не меняет