Django возвращает идентификатор сессии, но не аутентифицирует пользователя
У меня есть следующий код, который отправляет запросы для проверки JWT-токена, затем авторизует пользователя и возвращает авторизованную сессию с токеном доступа, токеном обновления и идентификатором сессии.
@csrf_exempt
def new_login_view(request, *args, **kwargs):
def convert_data(req):
data = {
"email": req.data['username'],
"password": req.data['password'],
}
try:
data["language"] = request.LANGUAGE_CODE
except:
data["language"] = request.POST.get('language', 'en')
return data
if request.user.is_authenticated and not request.META.get('HTTP_X_AVOID_COOKIES'):
return HttpResponseRedirect(request.GET.get(KEY_NEXT, '/'))
if request.method == 'POST':
request_data = convert_data(request)
# request to Accounts API to check if user exists
response = send_service_request(EnumAuthUrls.sign_in.value,
json_data=request_data,
original_response=True)
if isinstance(response, dict):
return JsonResponse(response)
if response.status_code == 200:
tok_ac = response.headers.get(HEADER_ACCESS_KEY)
tok_ref = response.headers.get(HEADER_REFRESH_KEY)
# checking JWT token
user = ApiAuthenticationBackend().authenticate(request, tok_ac)
# creates session
data = login_session(request, response, user)
data['user_id'] = request.user.id
data['account_id'] = request.user.profile.account_id
data['balance'] = request.user.balance
if request.META.get('HTTP_X_AVOID_COOKIES'):
return JsonResponse(data)
response = AuthResponse(
data=data,
ssid=request.session.session_key,
access_token=tok_ac,
refresh_token=tok_ref,
)
return response
else:
return ErrorApiResponse(response.json())
service = urllib.parse.quote_plus(request.build_absolute_uri())
return HttpResponseRedirect(settings.ACCOUNTS_URL + f'login/?service={service}')
Вот код login_session
фукнции:
def login_session(request: HttpRequest, response: HttpResponse, user):
request.user = user
request.session.create()
base_data = response.json().get(KEY_DATA)
return request.user.serialize(request, base_data, token=True)
А вот класс AuthResponse
, который в конечном итоге основан на HttpResponse
:
class AuthResponse(SuccessResponse):
def __init__(self, data={}, ssid='', access_token: str = '', refresh_token: str = '', **kwargs):
super().__init__(data, **kwargs)
if ssid:
logger.debug(f'Setting {settings.SESSION_COOKIE_NAME}: {ssid}')
self.set_cookie(key=settings.SESSION_COOKIE_NAME,
value=ssid)
if access_token:
self.set_cookie(key=settings.ACCESS_KEY_COOKIE_NAME,
value=access_token)
if refresh_token:
self.set_cookie(key=settings.REFRESH_KEY_COOKIE_NAME,
value=refresh_token)
Проблема в том, что со стороны браузера все выглядит хорошо, я получаю все необходимые cookies (токен доступа, токен обновления и идентификатор сессии), однако после попытки входа в систему я получаю перенаправление на главную страницу.
В начале была проблема с установкой cookies, но потом я выяснил, что не следует использовать SESSION_COOKIE_DOMAIN
, если он локальный. Таким образом, все cookies заработали без проблем, но это не решило ситуацию с авторизацией.
При установке cookies с помощью self.set_cookie()
я пытался использовать secure=True
, samesite='Lax'
, httponly=True
и все остальные параметры, но это не помогло.
Кто-нибудь знает, что еще я могу попробовать, чтобы исправить это?
Ну, я нашел, что было не так!
Имелось промежуточное ПО, которое должно было проверять токен от другого сервиса. Однако оно проверяло старый токен, а не новый.
Как только я изменил его и начал проверять новый токен - он работал просто отлично.
Итак, если нет других решений, убедитесь, что вы проверили промежуточное ПО или другой код, где это может повлиять на всю систему.