Логин не устанавливает sessionid в Cookies в браузере Safari с onrender.com [Django]
Я развернул Django в качестве бэкенда на render.com, я настроил csrf и правила сессии на settings.py
вот так.
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_ENGINE = "django.contrib.sessions.backends.db"
SESSION_COOKIE_AGE = 1209600 # 2 weeks
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = "None"
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = "None"
CSRF_TRUSTED_ORIGINS = [
"http://localhost:5173",
config("LOCAL_SERVER"),
config("FRONTEND_URL"),
config("BACKEND_URL"),
]
Сервер даже ответил статусом 200, но пользователь не хранится в cookies, поэтому на самом деле он не вошел в систему. Я попытался войти в систему в браузере Brave, и это сработало. Но проблема существует в Safari и мобильных браузерах. В чем может быть проблема?
Это метод входа в систему в Django.
@csrf_protect
@api_view(["POST"])
@permission_classes([AllowAny])
def login_view(request):
username = request.data.get("username")
password = request.data.get("password")
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
csrf_token = get_token(request)
if request.data.get("favorites") or request.data.get("cart"):
request.user = user
# Call sync function with the cookie data
sync_user_data(request)
response = JsonResponse({"message": "Login success"}, status=status.HTTP_200_OK)
response.set_cookie(
"sessionid",
request.session.session_key,
httponly=True,
secure=True,
samesite="None",
domain=config("ALLOWED_HOST_BACKEND"),
max_age=1209600,
)
response.set_cookie("csrftoken", csrf_token, httponly=True)
return response
else:
return JsonResponse(
{"message": "Invalid credentials"}, status=status.HTTP_400_BAD_REQUEST
)
Это функция входа в систему, вызывающая Backend API,
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
try {
const response = await axiosInstance.post(
"/auth/login/",
{
username,
password,
},
{
headers: {
"X-CSRFToken": csrfToken,
},
}
);
if (response.status === 200) {
alert("Login successful!");
// reload the page after login
window.location.reload();
}
} catch (err) {
console.error("Login error:", err);
setError("Invalid username or password.");
}
};