|
@@ -0,0 +1,67 @@
|
|
|
+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
|
|
|
+
|
|
|
+app = FastAPI()
|
|
|
+app.add_middleware(SessionMiddleware, secret_key="!secret")
|
|
|
+
|
|
|
+config = {}
|
|
|
+config['GOOGLE_CLIENT_ID']='813384606753-40sct043k48uaveu8r2e8m7t9u885cbs.apps.googleusercontent.com'
|
|
|
+config['GOOGLE_CLIENT_SECRET']='jvKKjKxCr9kUnn2e5niCQVTq'
|
|
|
+
|
|
|
+#Config('.env')
|
|
|
+oauth = OAuth(config)
|
|
|
+
|
|
|
+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'<pre>{data}</pre>'
|
|
|
+ '<a href="/logout">logout</a>'
|
|
|
+ )
|
|
|
+ return HTMLResponse(html)
|
|
|
+ return HTMLResponse('<a href="/login">login</a>')
|
|
|
+
|
|
|
+
|
|
|
+@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'<h1>{error.error}</h1>')
|
|
|
+ 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)
|