Anonymous
Серверная часть FastAPI всегда возвращает HTTP 200 при входе в систему (даже с неправильными учетными данными), и после
Сообщение
Anonymous » 10 янв 2026, 14:52
У меня есть интерфейс React, взаимодействующий с внутренним сервером. Когда я запускаю и тестирую обе системы локально, аутентификация работает правильно — неудачные попытки входа возвращают соответствующие статусы ошибок (например, 401 или 403). Однако после развертывания обоих на удаленном хосте серверная часть всегда возвращает HTTP 200 с сообщением «аутентификация успешна», независимо от того, действительны ли учетные данные или нет.
/admin.auth.py
Код: Выделить всё
from fastapi.routing import APIRouter
from fastapi.responses import JSONResponse, Response
from fastapi import Form, Request, Depends
from typing import Annotated
import bcrypt
import uuid
from admin.model import LoginFormData, UserSession
from database.depends import get_SQLManager
auth_router = APIRouter(prefix="/auth", tags=["admin"])
@auth_router.post("/login")
async def login(request: Request,
form_data: Annotated[LoginFormData, Form()],
db_manager=Depends(get_SQLManager)):
if request.session and request.session["role"] == "admin":
response = {"status": "success", "message": "login successful"}
return JSONResponse(content=response, status_code=200)
username = form_data.username
password = form_data.password
user = await db_manager.UserTable.get_user(username)
await db_manager.close()
if not user:
response = {"status": "fail", "message": "user does not exist"}
return JSONResponse(content=response, status_code=404)
password_encoded = password.encode("utf-8")
password_stored_encoded = user.password.encode("utf-8")
verified = bcrypt.checkpw(password_encoded, password_stored_encoded)
if not verified:
response = {"status": "fail", "message": "login failed"}
return JSONResponse(content=response, status_code=404)
request.session["role"] = "admin"
response = {"status": "success", "message": "login successful"}
return JSONResponse(content=response, status_code=200)
@auth_router.post("/session")
async def login(request: Request):
if request.session and request.session["role"] == "admin":
response = {"status": "success", "message": "login successful"}
return JSONResponse(content=response, status_code=200)
return Response(status_code=403)
nginx.conf
Код: Выделить всё
server {
listen 80;
server_name www.tomanshome.com tomanshome.com backend.tomanshome.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
server_name www.tomanshome.com tomanshome.com;
ssl_certificate /etc/letsencrypt/live/www.tomanshome.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.tomanshome.com/privkey.pem;
add_header Content-Security-Policy "upgrade-insecure-requests;";
access_log /var/log/nginx/tomanshome.com.access.log;
error_log /var/log/nginx/tomanshome.com.error.log;
root /home/deploy/tomanshome.com;
index index.html;
add_header X-XSS-Protection "1; mode=block" always;
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
server_name backend.tomanshome.com;
ssl_certificate /etc/letsencrypt/live/backend.tomanshome.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/backend.tomanshome.com/privkey.pem;
access_log /var/log/nginx/backend.tomanshome.com.access.log;
error_log /var/log/nginx/backend.tomanshome.com.error.log;
set $allowed_origin 'https://tomanshome.com';
proxy_intercept_errors off;
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $allowed_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PATCH, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
return 204;
}
proxy_pass http://127.0.0.1:8000;
proxy_pass_header Set-Cookie;
proxy_set_header Cookie $http_cookie;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header 'Access-Control-Allow-Origin' 'https://tomanshome.com' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
}
}
Что может привести к тому, что FastAPI всегда будет возвращать HTTP 200 с сообщением об успешной аутентификации независимо от учетных данных после развертывания?
почему файлы cookie не устанавливаются даже для того, что должно быть успешной аутентификацией?
Я не смог найти реального решения этой проблемы, поэтому буду очень признателен за любую помощь!
Подробнее здесь:
https://stackoverflow.com/questions/798 ... dentials-a
1768045922
Anonymous
У меня есть интерфейс React, взаимодействующий с внутренним сервером. Когда я запускаю и тестирую обе системы локально, аутентификация работает правильно — неудачные попытки входа возвращают соответствующие статусы ошибок (например, 401 или 403). Однако после развертывания обоих на удаленном хосте серверная часть всегда возвращает HTTP 200 с сообщением «аутентификация успешна», независимо от того, действительны ли учетные данные или нет. [b]/admin.auth.py[/b] [code]from fastapi.routing import APIRouter from fastapi.responses import JSONResponse, Response from fastapi import Form, Request, Depends from typing import Annotated import bcrypt import uuid from admin.model import LoginFormData, UserSession from database.depends import get_SQLManager auth_router = APIRouter(prefix="/auth", tags=["admin"]) @auth_router.post("/login") async def login(request: Request, form_data: Annotated[LoginFormData, Form()], db_manager=Depends(get_SQLManager)): if request.session and request.session["role"] == "admin": response = {"status": "success", "message": "login successful"} return JSONResponse(content=response, status_code=200) username = form_data.username password = form_data.password user = await db_manager.UserTable.get_user(username) await db_manager.close() if not user: response = {"status": "fail", "message": "user does not exist"} return JSONResponse(content=response, status_code=404) password_encoded = password.encode("utf-8") password_stored_encoded = user.password.encode("utf-8") verified = bcrypt.checkpw(password_encoded, password_stored_encoded) if not verified: response = {"status": "fail", "message": "login failed"} return JSONResponse(content=response, status_code=404) request.session["role"] = "admin" response = {"status": "success", "message": "login successful"} return JSONResponse(content=response, status_code=200) @auth_router.post("/session") async def login(request: Request): if request.session and request.session["role"] == "admin": response = {"status": "success", "message": "login successful"} return JSONResponse(content=response, status_code=200) return Response(status_code=403) [/code] [b]nginx.conf[/b] [code]server { listen 80; server_name www.tomanshome.com tomanshome.com backend.tomanshome.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; ssl_protocols TLSv1.2 TLSv1.3; server_name www.tomanshome.com tomanshome.com; ssl_certificate /etc/letsencrypt/live/www.tomanshome.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.tomanshome.com/privkey.pem; add_header Content-Security-Policy "upgrade-insecure-requests;"; access_log /var/log/nginx/tomanshome.com.access.log; error_log /var/log/nginx/tomanshome.com.error.log; root /home/deploy/tomanshome.com; index index.html; add_header X-XSS-Protection "1; mode=block" always; location / { try_files $uri $uri/ /index.html; } } server { listen 443 ssl; ssl_protocols TLSv1.2 TLSv1.3; server_name backend.tomanshome.com; ssl_certificate /etc/letsencrypt/live/backend.tomanshome.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/backend.tomanshome.com/privkey.pem; access_log /var/log/nginx/backend.tomanshome.com.access.log; error_log /var/log/nginx/backend.tomanshome.com.error.log; set $allowed_origin 'https://tomanshome.com'; proxy_intercept_errors off; location / { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' $allowed_origin always; add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PATCH, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always; add_header 'Access-Control-Allow-Credentials' 'true' always; return 204; } proxy_pass http://127.0.0.1:8000; proxy_pass_header Set-Cookie; proxy_set_header Cookie $http_cookie; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; add_header 'Access-Control-Allow-Origin' 'https://tomanshome.com' always; add_header 'Access-Control-Allow-Credentials' 'true' always; } } [/code] [list] [*]Что может привести к тому, что FastAPI всегда будет возвращать HTTP 200 с сообщением об успешной аутентификации независимо от учетных данных после развертывания? [*]почему файлы cookie не устанавливаются даже для того, что должно быть успешной аутентификацией? [/list] Я не смог найти реального решения этой проблемы, поэтому буду очень признателен за любую помощь! Подробнее здесь: [url]https://stackoverflow.com/questions/79864930/fastapi-backend-always-returns-http-200-on-login-even-with-wrong-credentials-a[/url]