fix auth
This commit is contained in:
@@ -3,6 +3,7 @@ from datetime import timedelta
|
|||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_jwt_extended import JWTManager
|
from flask_jwt_extended import JWTManager
|
||||||
|
from flask_cors import CORS
|
||||||
|
|
||||||
from app.services.auth_service import AuthService
|
from app.services.auth_service import AuthService
|
||||||
from app.database import init_db
|
from app.database import init_db
|
||||||
@@ -33,6 +34,13 @@ def create_app():
|
|||||||
app.config["JWT_ACCESS_COOKIE_PATH"] = "/api/"
|
app.config["JWT_ACCESS_COOKIE_PATH"] = "/api/"
|
||||||
app.config["JWT_REFRESH_COOKIE_PATH"] = "/api/auth/refresh"
|
app.config["JWT_REFRESH_COOKIE_PATH"] = "/api/auth/refresh"
|
||||||
|
|
||||||
|
# Initialize CORS
|
||||||
|
CORS(app,
|
||||||
|
origins=["http://localhost:3000"], # Frontend URL
|
||||||
|
supports_credentials=True, # Allow cookies
|
||||||
|
allow_headers=["Content-Type", "Authorization"],
|
||||||
|
methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"])
|
||||||
|
|
||||||
# Initialize JWT manager
|
# Initialize JWT manager
|
||||||
jwt = JWTManager(app)
|
jwt = JWTManager(app)
|
||||||
|
|
||||||
|
|||||||
@@ -19,10 +19,27 @@ def login_oauth(provider):
|
|||||||
@bp.route("/callback/<provider>")
|
@bp.route("/callback/<provider>")
|
||||||
def callback(provider):
|
def callback(provider):
|
||||||
"""Handle OAuth callback from specified provider."""
|
"""Handle OAuth callback from specified provider."""
|
||||||
|
from flask import redirect, make_response
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return auth_service.handle_callback(provider)
|
auth_response = auth_service.handle_callback(provider)
|
||||||
|
|
||||||
|
# If successful, redirect to frontend dashboard with cookies
|
||||||
|
if auth_response.status_code == 200:
|
||||||
|
redirect_response = make_response(redirect("http://localhost:3000/dashboard"))
|
||||||
|
|
||||||
|
# Copy all cookies from the auth response
|
||||||
|
for cookie in auth_response.headers.getlist('Set-Cookie'):
|
||||||
|
redirect_response.headers.add('Set-Cookie', cookie)
|
||||||
|
|
||||||
|
return redirect_response
|
||||||
|
else:
|
||||||
|
# If there was an error, redirect to login with error
|
||||||
|
return redirect("http://localhost:3000/login?error=oauth_failed")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {"error": str(e)}, 400
|
error_msg = str(e).replace(' ', '_').replace('"', '')
|
||||||
|
return redirect(f"http://localhost:3000/login?error={error_msg}")
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/providers")
|
@bp.route("/providers")
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ class TokenService:
|
|||||||
"email": user_data["email"],
|
"email": user_data["email"],
|
||||||
"name": user_data["name"],
|
"name": user_data["name"],
|
||||||
"picture": user_data.get("picture"),
|
"picture": user_data.get("picture"),
|
||||||
|
"role": user_data.get("role"),
|
||||||
|
"is_active": user_data.get("is_active"),
|
||||||
|
"provider": user_data.get("provider"),
|
||||||
|
"providers": user_data.get("providers", []),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ requires-python = ">=3.12"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"authlib==1.6.0",
|
"authlib==1.6.0",
|
||||||
"flask==3.1.1",
|
"flask==3.1.1",
|
||||||
|
"flask-cors==6.0.1",
|
||||||
"flask-jwt-extended==4.7.1",
|
"flask-jwt-extended==4.7.1",
|
||||||
"flask-migrate==4.1.0",
|
"flask-migrate==4.1.0",
|
||||||
"flask-sqlalchemy==3.1.1",
|
"flask-sqlalchemy==3.1.1",
|
||||||
|
|||||||
15
uv.lock
generated
15
uv.lock
generated
@@ -211,6 +211,19 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/3d/68/9d4508e893976286d2ead7f8f571314af6c2037af34853a30fd769c02e9d/flask-3.1.1-py3-none-any.whl", hash = "sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c", size = 103305 },
|
{ url = "https://files.pythonhosted.org/packages/3d/68/9d4508e893976286d2ead7f8f571314af6c2037af34853a30fd769c02e9d/flask-3.1.1-py3-none-any.whl", hash = "sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c", size = 103305 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "flask-cors"
|
||||||
|
version = "6.0.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "flask" },
|
||||||
|
{ name = "werkzeug" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/76/37/bcfa6c7d5eec777c4c7cf45ce6b27631cebe5230caf88d85eadd63edd37a/flask_cors-6.0.1.tar.gz", hash = "sha256:d81bcb31f07b0985be7f48406247e9243aced229b7747219160a0559edd678db", size = 13463 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/17/f8/01bf35a3afd734345528f98d0353f2a978a476528ad4d7e78b70c4d149dd/flask_cors-6.0.1-py3-none-any.whl", hash = "sha256:c7b2cbfb1a31aa0d2e5341eea03a6805349f7a61647daee1a15c46bbe981494c", size = 13244 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flask-jwt-extended"
|
name = "flask-jwt-extended"
|
||||||
version = "4.7.1"
|
version = "4.7.1"
|
||||||
@@ -518,6 +531,7 @@ source = { virtual = "." }
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "authlib" },
|
{ name = "authlib" },
|
||||||
{ name = "flask" },
|
{ name = "flask" },
|
||||||
|
{ name = "flask-cors" },
|
||||||
{ name = "flask-jwt-extended" },
|
{ name = "flask-jwt-extended" },
|
||||||
{ name = "flask-migrate" },
|
{ name = "flask-migrate" },
|
||||||
{ name = "flask-sqlalchemy" },
|
{ name = "flask-sqlalchemy" },
|
||||||
@@ -537,6 +551,7 @@ dev = [
|
|||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "authlib", specifier = "==1.6.0" },
|
{ name = "authlib", specifier = "==1.6.0" },
|
||||||
{ name = "flask", specifier = "==3.1.1" },
|
{ name = "flask", specifier = "==3.1.1" },
|
||||||
|
{ name = "flask-cors", specifier = "==6.0.1" },
|
||||||
{ name = "flask-jwt-extended", specifier = "==4.7.1" },
|
{ name = "flask-jwt-extended", specifier = "==4.7.1" },
|
||||||
{ name = "flask-migrate", specifier = "==4.1.0" },
|
{ name = "flask-migrate", specifier = "==4.1.0" },
|
||||||
{ name = "flask-sqlalchemy", specifier = "==3.1.1" },
|
{ name = "flask-sqlalchemy", specifier = "==3.1.1" },
|
||||||
|
|||||||
Reference in New Issue
Block a user