#!/usr/bin/env python3
"""This is just a very simple authentication example.
Please see the `OAuth2 example at FastAPI `_ or
use the great `Authlib package `_ to implement a classing real authentication system.
Here we just demonstrate the NiceGUI integration.
"""
from fastapi.responses import RedirectResponse
from nicegui import app, ui
# in reality users passwords would obviously need to be hashed
passwords = {'user1': 'pass1', 'user2': 'pass2'}
@ui.page('/')
def main_page() -> None:
if not app.storage.user.get('authenticated', False):
return RedirectResponse('/login')
with ui.column().classes('absolute-center items-center'):
ui.label(f'Hello {app.storage.user["username"]}!').classes('text-2xl')
ui.button(on_click=lambda: (app.storage.user.clear(), ui.open('/login')), icon='logout').props('outline round')
@ui.page('/login')
def login() -> None:
def try_login() -> None: # local function to avoid passing username and password as arguments
if passwords.get(username.value) == password.value:
app.storage.user.update({'username': username.value, 'authenticated': True})
ui.open('/')
else:
ui.notify('Wrong username or password', color='negative')
if app.storage.user.get('authenticated', False):
return RedirectResponse('/')
with ui.card().classes('absolute-center'):
username = ui.input('Username').on('keydown.enter', try_login)
password = ui.input('Password', password=True, password_toggle_button=True).on('keydown.enter', try_login)
ui.button('Log in', on_click=try_login)
ui.run(storage_secret='THIS_NEEDS_TO_BE_CHANGED')