|
@@ -1,46 +1,57 @@
|
|
#!/usr/bin/env python3
|
|
#!/usr/bin/env python3
|
|
|
|
+'''This is only a very simple authentication example which stores session ids in memory and does not do any password hashing.
|
|
|
|
+
|
|
|
|
+Please see the `OAuth2 example at FastAPI <https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/>`_ or
|
|
|
|
+use the great `Authlib package <https://docs.authlib.org/en/v0.13/client/starlette.html#using-fastapi>`_ to implement a real authentication system.
|
|
|
|
+
|
|
|
|
+Here we just demonstrate the NiceGUI integration.
|
|
|
|
+'''
|
|
|
|
+
|
|
import uuid
|
|
import uuid
|
|
from typing import Dict
|
|
from typing import Dict
|
|
|
|
|
|
|
|
+from fastapi import Request
|
|
|
|
+from fastapi.responses import RedirectResponse
|
|
from starlette.middleware.sessions import SessionMiddleware
|
|
from starlette.middleware.sessions import SessionMiddleware
|
|
-from starlette.requests import Request
|
|
|
|
|
|
|
|
from nicegui import app, ui
|
|
from nicegui import app, ui
|
|
|
|
|
|
-app.add_middleware(SessionMiddleware, secret_key='some_random_string')
|
|
|
|
|
|
+app.add_middleware(SessionMiddleware, secret_key='some_random_string') # use your own secret key here
|
|
|
|
|
|
-session_info: Dict[str, Dict] = {} # in reality in a database
|
|
|
|
|
|
+# in reality users and session_info would be persistent (e.g. database, file, ...) and passwords obviously hashed
|
|
|
|
+users = [('user1', 'pass1'), ('user2', 'pass2')]
|
|
|
|
+session_info: Dict[str, Dict] = {}
|
|
|
|
|
|
|
|
|
|
@ui.page('/')
|
|
@ui.page('/')
|
|
def main_page(request: Request) -> None:
|
|
def main_page(request: Request) -> None:
|
|
if is_authenticated(request):
|
|
if is_authenticated(request):
|
|
- create_welcome_message(session_info[request.session['id']]['username'])
|
|
|
|
|
|
+ session = session_info[request.session['id']]
|
|
|
|
+ with ui.row().classes('absolute-center'):
|
|
|
|
+ ui.label(f'Hello {session["username"]}!').classes('text-2xl')
|
|
else:
|
|
else:
|
|
- request.session['id'] = str(uuid.uuid4())
|
|
|
|
- create_login_form(request.session['id'])
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-def is_authenticated(request: Request) -> bool:
|
|
|
|
- return session_info.get(request.session.get('id'), {}).get('authenticated', False)
|
|
|
|
|
|
+ return RedirectResponse('/login')
|
|
|
|
|
|
|
|
|
|
-def create_login_form(session_id: str) -> None:
|
|
|
|
|
|
+@ui.page('/login')
|
|
|
|
+def login(request: Request) -> None:
|
|
|
|
+ if is_authenticated(request):
|
|
|
|
+ return RedirectResponse('/')
|
|
|
|
+ request.session['id'] = str(uuid.uuid4()) # NOTE this stores a new session id in the cookie of the client
|
|
with ui.card().classes('absolute-center'):
|
|
with ui.card().classes('absolute-center'):
|
|
username = ui.input('Username')
|
|
username = ui.input('Username')
|
|
password = ui.input('Password').classes('w-full').props('type=password')
|
|
password = ui.input('Password').classes('w-full').props('type=password')
|
|
- ui.button('Log in', on_click=lambda: try_login(session_id, username.value, password.value))
|
|
|
|
|
|
+ ui.button('Log in', on_click=lambda: try_login(request.session['id'], username.value, password.value))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def is_authenticated(request: Request) -> bool:
|
|
|
|
+ return session_info.get(request.session.get('id'), {}).get('authenticated', False)
|
|
|
|
|
|
|
|
|
|
def try_login(session_id: str, username: str, password: str) -> None:
|
|
def try_login(session_id: str, username: str, password: str) -> None:
|
|
- if (username, password) in [('user1', 'pass1'), ('user2', 'pass2')]:
|
|
|
|
|
|
+ if (username, password) in users:
|
|
session_info[session_id] = {'username': username, 'authenticated': True}
|
|
session_info[session_id] = {'username': username, 'authenticated': True}
|
|
ui.open('/')
|
|
ui.open('/')
|
|
|
|
|
|
|
|
|
|
-def create_welcome_message(username: str) -> None:
|
|
|
|
- with ui.row().classes('absolute-center'):
|
|
|
|
- ui.label(f'Hello {username}!').classes('text-2xl')
|
|
|
|
-
|
|
|
|
-
|
|
|
|
ui.run()
|
|
ui.run()
|