import json from fastapi import FastAPI from starlette.config import Config from starlette.requests import Request from starlette.middleware.sessions import SessionMiddleware from starlette.responses import HTMLResponse, RedirectResponse from authlib.integrations.starlette_client import OAuth, OAuthError from fastapi.staticfiles import StaticFiles app = FastAPI() app.add_middleware(SessionMiddleware, secret_key="!secret") config = Config('.env') #config. #config['GOOGLE_CLIENT_ID']='813384606753-40sct043k48uaveu8r2e8m7t9u885cbs.apps.googleusercontent.com' #config['GOOGLE_CLIENT_SECRET']='jvKKjKxCr9kUnn2e5niCQVTq' #Config('.env') oauth = OAuth(config) app.mount("/static", StaticFiles(directory="static"), name="static") CONF_URL = 'https://accounts.google.com/.well-known/openid-configuration' oauth.register( name='google', server_metadata_url=CONF_URL, client_kwargs={ 'scope': 'openid email profile' } ) @app.route('/') async def homepage(request: Request): user = request.session.get('user') if user: data = json.dumps(user) html = ( f'
{data}
' 'logout' ) return HTMLResponse(html) return HTMLResponse('login') @app.route('/login') async def login(request: Request): redirect_uri = request.url_for('auth') return await oauth.google.authorize_redirect(request, redirect_uri) @app.route('/auth') async def auth(request: Request): try: token = await oauth.google.authorize_access_token(request) except OAuthError as error: return HTMLResponse(f'

{error.error}

') user = await oauth.google.parse_id_token(request, token) request.session['user'] = dict(user) return RedirectResponse(url='/') @app.route('/logout') async def logout(request: Request): request.session.pop('user', None) return RedirectResponse(url='/') if __name__ == '__main__': import uvicorn uvicorn.run(app, host='127.0.0.1', port=8000)