| |
|
| | from fastapi import APIRouter, Request |
| | from fastapi.responses import RedirectResponse |
| | from authlib.integrations.starlette_client import OAuth |
| | import os, json |
| |
|
| | router = APIRouter() |
| |
|
| | oauth = OAuth() |
| | oauth.register( |
| | name='google', |
| | client_id=os.getenv("GOOGLE_CLIENT_ID"), |
| | client_secret=os.getenv("GOOGLE_CLIENT_SECRET"), |
| | access_token_url='https://oauth2.googleapis.com/token', |
| | access_token_params=None, |
| | authorize_url='https://accounts.google.com/o/oauth2/v2/auth', |
| | authorize_params=None, |
| | api_base_url='https://www.googleapis.com/oauth2/v1/', |
| | client_kwargs={ |
| | 'scope': 'openid email profile https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/calendar', |
| | 'prompt': 'consent' |
| | } |
| | ) |
| |
|
| | CREDENTIALS_PATH = os.path.join(os.path.dirname(__file__), "../data/user_credentials.json") |
| |
|
| | @router.get("/auth/google") |
| | async def login(request: Request): |
| | redirect_uri = request.url_for('auth_callback') |
| | return await oauth.google.authorize_redirect(request, redirect_uri) |
| |
|
| | @router.get("/auth/google/callback") |
| | async def auth_callback(request: Request): |
| | token = await oauth.google.authorize_access_token(request) |
| | user = await oauth.google.parse_id_token(request, token) |
| | |
| | |
| | try: |
| | with open(CREDENTIALS_PATH, "r") as f: |
| | creds = json.load(f) |
| | except: |
| | creds = {} |
| |
|
| | creds["google"] = token |
| |
|
| | with open(CREDENTIALS_PATH, "w") as f: |
| | json.dump(creds, f) |
| |
|
| | return RedirectResponse(url="/frontend/index.html") |
| |
|