#!/usr/bin/env python3 import httpx from fastapi import Form, HTTPException from fastapi.responses import RedirectResponse from nicegui import app, ui # Get your Google Client ID from the Google Cloud Console. # For local development, you should add http://localhost:8080 to the authorized JavaScript origins. # In production, you should add the domain of your website to the authorized JavaScript origins. # See https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid#get_your_google_api_client_id. GOOGLE_CLIENT_ID = '...' @ui.page('/') def main_page() -> None: user_data = app.storage.user.get('user_data', None) if not user_data: ui.add_head_html('') ui.html(f'''
''') ui.label('Sign in with Google One Tap') else: ui.label(f'Welcome {user_data["name"]}!') ui.button('Logout', on_click=logout) def logout() -> None: del app.storage.user['user_data'] ui.navigate.to('/') @app.post('/auth') async def google_auth(credential: str = Form(...)) -> RedirectResponse: async with httpx.AsyncClient() as http_client: response = await http_client.get(f'https://oauth2.googleapis.com/tokeninfo?id_token={credential}') if response.status_code != 200: raise HTTPException(status_code=400, detail='Invalid token') app.storage.user['user_data'] = response.json() return RedirectResponse('/', status_code=303) ui.run(host='localhost', storage_secret='here you should pick a random secret string for your app')