main.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env python3
  2. from typing import Optional
  3. from authlib.integrations.starlette_client import OAuth, OAuthError
  4. from fastapi import Request
  5. from starlette.responses import RedirectResponse
  6. from nicegui import app, ui
  7. # Get the credentials from the Google Cloud Console
  8. # https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid#get_your_google_api_client_id
  9. GOOGLE_CLIENT_ID = '...'
  10. GOOGLE_CLIENT_SECRET = '...'
  11. oauth = OAuth()
  12. oauth.register(
  13. name='google',
  14. server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
  15. client_id=GOOGLE_CLIENT_ID,
  16. client_secret=GOOGLE_CLIENT_SECRET,
  17. client_kwargs={'scope': 'openid email profile'},
  18. )
  19. @app.get('/auth')
  20. async def google_oauth(request: Request) -> RedirectResponse:
  21. try:
  22. user_data = await oauth.google.authorize_access_token(request)
  23. except OAuthError as e:
  24. print(f'OAuth error: {e}')
  25. return RedirectResponse('/') # or return an error page/message
  26. app.storage.user['user_data'] = user_data
  27. return RedirectResponse('/')
  28. def logout() -> None:
  29. del app.storage.user['user_data']
  30. ui.navigate.to('/')
  31. @ui.page('/')
  32. async def main(request: Request) -> Optional[RedirectResponse]:
  33. user_data = app.storage.user.get('user_data', None)
  34. if user_data:
  35. ui.label(f'Welcome {user_data.get("userinfo", {}).get("name", "")}!')
  36. ui.button('Logout', on_click=logout)
  37. return None
  38. else:
  39. url = request.url_for('google_oauth')
  40. return await oauth.google.authorize_redirect(request, url)
  41. ui.run(host='localhost', storage_secret='random secret goes here')