testoauth.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import json
  2. from fastapi import FastAPI
  3. from starlette.config import Config
  4. from starlette.requests import Request
  5. from starlette.middleware.sessions import SessionMiddleware
  6. from starlette.responses import HTMLResponse, RedirectResponse
  7. from authlib.integrations.starlette_client import OAuth, OAuthError
  8. app = FastAPI()
  9. app.add_middleware(SessionMiddleware, secret_key="!secret")
  10. config = {}
  11. config['GOOGLE_CLIENT_ID']='813384606753-40sct043k48uaveu8r2e8m7t9u885cbs.apps.googleusercontent.com'
  12. config['GOOGLE_CLIENT_SECRET']='jvKKjKxCr9kUnn2e5niCQVTq'
  13. #Config('.env')
  14. oauth = OAuth(config)
  15. CONF_URL = 'https://accounts.google.com/.well-known/openid-configuration'
  16. oauth.register(
  17. name='google',
  18. server_metadata_url=CONF_URL,
  19. client_kwargs={
  20. 'scope': 'openid email profile'
  21. }
  22. )
  23. @app.route('/')
  24. async def homepage(request: Request):
  25. user = request.session.get('user')
  26. if user:
  27. data = json.dumps(user)
  28. html = (
  29. f'<pre>{data}</pre>'
  30. '<a href="/logout">logout</a>'
  31. )
  32. return HTMLResponse(html)
  33. return HTMLResponse('<a href="/login">login</a>')
  34. @app.route('/login')
  35. async def login(request: Request):
  36. redirect_uri = request.url_for('auth')
  37. return await oauth.google.authorize_redirect(request, redirect_uri)
  38. @app.route('/auth')
  39. async def auth(request: Request):
  40. try:
  41. token = await oauth.google.authorize_access_token(request)
  42. except OAuthError as error:
  43. return HTMLResponse(f'<h1>{error.error}</h1>')
  44. user = await oauth.google.parse_id_token(request, token)
  45. request.session['user'] = dict(user)
  46. return RedirectResponse(url='/')
  47. @app.route('/logout')
  48. async def logout(request: Request):
  49. request.session.pop('user', None)
  50. return RedirectResponse(url='/')
  51. if __name__ == '__main__':
  52. import uvicorn
  53. uvicorn.run(app, host='127.0.0.1', port=8000)