12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #!/usr/bin/env python3
- from typing import Optional
- from authlib.integrations.starlette_client import OAuth, OAuthError
- from fastapi import Request
- from starlette.responses import RedirectResponse
- from nicegui import app, ui
- # Get the credentials from the Google Cloud Console
- # https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid#get_your_google_api_client_id
- GOOGLE_CLIENT_ID = '...'
- GOOGLE_CLIENT_SECRET = '...'
- oauth = OAuth()
- oauth.register(
- name='google',
- server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
- client_id=GOOGLE_CLIENT_ID,
- client_secret=GOOGLE_CLIENT_SECRET,
- client_kwargs={'scope': 'openid email profile'},
- )
- @app.get('/auth')
- async def google_oauth(request: Request) -> RedirectResponse:
- try:
- user_data = await oauth.google.authorize_access_token(request)
- except OAuthError as e:
- print(f'OAuth error: {e}')
- return RedirectResponse('/') # or return an error page/message
- app.storage.user['user_data'] = user_data
- return RedirectResponse('/')
- def logout() -> None:
- del app.storage.user['user_data']
- ui.navigate.to('/')
- @ui.page('/')
- async def main(request: Request) -> Optional[RedirectResponse]:
- user_data = app.storage.user.get('user_data', None)
- if user_data:
- ui.label(f'Welcome {user_data.get("userinfo", {}).get("name", "")}!')
- ui.button('Logout', on_click=logout)
- return None
- else:
- url = request.url_for('google_oauth')
- return await oauth.google.authorize_redirect(request, url)
- ui.run(host='localhost', storage_secret='random secret goes here')
|