Mark-Lasfar
commited on
Commit
·
8df87b3
1
Parent(s):
5fb061b
Update authorize for google
Browse files
main.py
CHANGED
|
@@ -12,7 +12,7 @@ from starlette.middleware.sessions import SessionMiddleware
|
|
| 12 |
from fastapi.openapi.docs import get_swagger_ui_html
|
| 13 |
from fastapi.middleware.cors import CORSMiddleware
|
| 14 |
from api.endpoints import router as api_router
|
| 15 |
-
from api.auth import fastapi_users, auth_backend,
|
| 16 |
from api.database import get_db, engine, Base
|
| 17 |
from api.models import User, UserRead, UserCreate, Conversation
|
| 18 |
from motor.motor_asyncio import AsyncIOMotorClient
|
|
@@ -27,7 +27,6 @@ from hashlib import md5
|
|
| 27 |
from datetime import datetime
|
| 28 |
import re
|
| 29 |
from httpx_oauth.exceptions import GetIdEmailError
|
| 30 |
-
from fastapi_users.router.oauth import OAuth2AuthorizeCallback
|
| 31 |
|
| 32 |
# Setup logging
|
| 33 |
logging.basicConfig(level=logging.INFO)
|
|
@@ -97,10 +96,13 @@ app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
| 97 |
# CORS setup
|
| 98 |
app.add_middleware(
|
| 99 |
CORSMiddleware,
|
| 100 |
-
allow_origins=[
|
|
|
|
|
|
|
|
|
|
| 101 |
allow_credentials=True,
|
| 102 |
-
allow_methods=["
|
| 103 |
-
allow_headers=["
|
| 104 |
)
|
| 105 |
|
| 106 |
# Include routers
|
|
@@ -155,24 +157,37 @@ async def debug_routes():
|
|
| 155 |
@app.get("/auth/google/callback", response_class=RedirectResponse)
|
| 156 |
async def google_oauth_callback(
|
| 157 |
request: Request,
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
)
|
| 161 |
):
|
| 162 |
try:
|
| 163 |
logger.info("Processing Google OAuth callback")
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
|
|
|
|
|
|
| 167 |
logger.info(f"Google user info: {user_info}")
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
)
|
|
|
|
|
|
|
|
|
|
| 174 |
logger.info("Google OAuth callback processed, redirecting to /chat")
|
| 175 |
-
|
|
|
|
|
|
|
| 176 |
except Exception as e:
|
| 177 |
logger.error(f"Google OAuth callback error: {str(e)}")
|
| 178 |
return RedirectResponse(url=f"/login?error=Google%20OAuth%20failed:%20{str(e)}", status_code=302)
|
|
@@ -180,24 +195,37 @@ async def google_oauth_callback(
|
|
| 180 |
@app.get("/auth/github/callback", response_class=RedirectResponse)
|
| 181 |
async def github_oauth_callback(
|
| 182 |
request: Request,
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
)
|
| 186 |
):
|
| 187 |
try:
|
| 188 |
logger.info("Processing GitHub OAuth callback")
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
|
|
|
|
|
|
| 192 |
logger.info(f"GitHub user info: {user_info}")
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 198 |
)
|
|
|
|
|
|
|
|
|
|
| 199 |
logger.info("GitHub OAuth callback processed, redirecting to /chat")
|
| 200 |
-
|
|
|
|
|
|
|
| 201 |
except Exception as e:
|
| 202 |
logger.error(f"GitHub OAuth callback error: {str(e)}")
|
| 203 |
return RedirectResponse(url=f"/login?error=GitHub%20OAuth%20failed:%20{str(e)}", status_code=302)
|
|
|
|
| 12 |
from fastapi.openapi.docs import get_swagger_ui_html
|
| 13 |
from fastapi.middleware.cors import CORSMiddleware
|
| 14 |
from api.endpoints import router as api_router
|
| 15 |
+
from api.auth import fastapi_users, auth_backend, google_oauth_client, github_oauth_client
|
| 16 |
from api.database import get_db, engine, Base
|
| 17 |
from api.models import User, UserRead, UserCreate, Conversation
|
| 18 |
from motor.motor_asyncio import AsyncIOMotorClient
|
|
|
|
| 27 |
from datetime import datetime
|
| 28 |
import re
|
| 29 |
from httpx_oauth.exceptions import GetIdEmailError
|
|
|
|
| 30 |
|
| 31 |
# Setup logging
|
| 32 |
logging.basicConfig(level=logging.INFO)
|
|
|
|
| 96 |
# CORS setup
|
| 97 |
app.add_middleware(
|
| 98 |
CORSMiddleware,
|
| 99 |
+
allow_origins=[
|
| 100 |
+
"https://mgzon-mgzon-app.hf.space",
|
| 101 |
+
"http://localhost:7860",
|
| 102 |
+
],
|
| 103 |
allow_credentials=True,
|
| 104 |
+
allow_methods=["GET", "POST", "OPTIONS"],
|
| 105 |
+
allow_headers=["Accept", "Content-Type", "Authorization"],
|
| 106 |
)
|
| 107 |
|
| 108 |
# Include routers
|
|
|
|
| 157 |
@app.get("/auth/google/callback", response_class=RedirectResponse)
|
| 158 |
async def google_oauth_callback(
|
| 159 |
request: Request,
|
| 160 |
+
token: str = Query(...),
|
| 161 |
+
state: str = Query(...),
|
| 162 |
+
db: Session = Depends(get_db)
|
| 163 |
):
|
| 164 |
try:
|
| 165 |
logger.info("Processing Google OAuth callback")
|
| 166 |
+
# Exchange code for access token
|
| 167 |
+
token_data = await google_oauth_client.get_access_token(token, "https://mgzon-mgzon-app.hf.space/auth/google/callback")
|
| 168 |
+
logger.info(f"Google OAuth token received: {token_data}")
|
| 169 |
+
# Get user info
|
| 170 |
+
user_info = await google_oauth_client.get_id_email(token_data["access_token"])
|
| 171 |
logger.info(f"Google user info: {user_info}")
|
| 172 |
+
# Create or update user
|
| 173 |
+
user_manager = fastapi_users.user_manager
|
| 174 |
+
user = await user_manager.oauth_callback(
|
| 175 |
+
oauth_name="google",
|
| 176 |
+
access_token=token_data["access_token"],
|
| 177 |
+
account_id=user_info["id"],
|
| 178 |
+
account_email=user_info["email"],
|
| 179 |
+
expires_at=token_data.get("expires_at"),
|
| 180 |
+
refresh_token=token_data.get("refresh_token"),
|
| 181 |
+
request=request,
|
| 182 |
+
db=db
|
| 183 |
)
|
| 184 |
+
logger.info("Google OAuth user processed, creating session")
|
| 185 |
+
# Create JWT token
|
| 186 |
+
token = await auth_backend.get_login_response(user, request)
|
| 187 |
logger.info("Google OAuth callback processed, redirecting to /chat")
|
| 188 |
+
response = RedirectResponse(url="/chat", status_code=302)
|
| 189 |
+
response.set_cookie("Authorization", f"Bearer {token.access_token}", httponly=True)
|
| 190 |
+
return response
|
| 191 |
except Exception as e:
|
| 192 |
logger.error(f"Google OAuth callback error: {str(e)}")
|
| 193 |
return RedirectResponse(url=f"/login?error=Google%20OAuth%20failed:%20{str(e)}", status_code=302)
|
|
|
|
| 195 |
@app.get("/auth/github/callback", response_class=RedirectResponse)
|
| 196 |
async def github_oauth_callback(
|
| 197 |
request: Request,
|
| 198 |
+
token: str = Query(...),
|
| 199 |
+
state: str = Query(...),
|
| 200 |
+
db: Session = Depends(get_db)
|
| 201 |
):
|
| 202 |
try:
|
| 203 |
logger.info("Processing GitHub OAuth callback")
|
| 204 |
+
# Exchange code for access token
|
| 205 |
+
token_data = await github_oauth_client.get_access_token(token, "https://mgzon-mgzon-app.hf.space/auth/github/callback")
|
| 206 |
+
logger.info(f"GitHub OAuth token received: {token_data}")
|
| 207 |
+
# Get user info
|
| 208 |
+
user_info = await github_oauth_client.get_id_email(token_data["access_token"])
|
| 209 |
logger.info(f"GitHub user info: {user_info}")
|
| 210 |
+
# Create or update user
|
| 211 |
+
user_manager = fastapi_users.user_manager
|
| 212 |
+
user = await user_manager.oauth_callback(
|
| 213 |
+
oauth_name="github",
|
| 214 |
+
access_token=token_data["access_token"],
|
| 215 |
+
account_id=user_info["id"],
|
| 216 |
+
account_email=user_info["email"],
|
| 217 |
+
expires_at=token_data.get("expires_at"),
|
| 218 |
+
refresh_token=token_data.get("refresh_token"),
|
| 219 |
+
request=request,
|
| 220 |
+
db=db
|
| 221 |
)
|
| 222 |
+
logger.info("GitHub OAuth user processed, creating session")
|
| 223 |
+
# Create JWT token
|
| 224 |
+
token = await auth_backend.get_login_response(user, request)
|
| 225 |
logger.info("GitHub OAuth callback processed, redirecting to /chat")
|
| 226 |
+
response = RedirectResponse(url="/chat", status_code=302)
|
| 227 |
+
response.set_cookie("Authorization", f"Bearer {token.access_token}", httponly=True)
|
| 228 |
+
return response
|
| 229 |
except Exception as e:
|
| 230 |
logger.error(f"GitHub OAuth callback error: {str(e)}")
|
| 231 |
return RedirectResponse(url=f"/login?error=GitHub%20OAuth%20failed:%20{str(e)}", status_code=302)
|