From 7784c60c03ec277b456db6e2709383e302d9382b Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Fri, 3 Jul 2026 15:49:08 +0200 Subject: Added basic oauth flow --- authentication/backend.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 authentication/backend.py (limited to 'authentication/backend.py') diff --git a/authentication/backend.py b/authentication/backend.py new file mode 100644 index 0000000..29408e3 --- /dev/null +++ b/authentication/backend.py @@ -0,0 +1,48 @@ +from datetime import datetime, UTC +from typing import Optional + +from sqlalchemy import update +from sqlmodel import select +from starlette.authentication import AuthenticationBackend, AuthCredentials, BaseUser, UnauthenticatedUser +from starlette.requests import HTTPConnection + +from db.models import Session, User +from db.session import get_session_context + + +class AuthBackend(AuthenticationBackend): + async def authenticate(self, request: HTTPConnection) -> Optional[tuple[AuthCredentials, BaseUser]]: + if "id" not in request.session: + return None + + query = ( + select(Session) + .join(User) + .where( + Session.id == request.session['id'] + ) + ) + + + with get_session_context() as db_session: + session: Session = db_session.exec(query).first() + + if session is not None: + db_session.execute( + update(Session).where(Session.id == session.id) + ) + db_session.commit() + + return ( + AuthCredentials( + [ + "authenticated", + *[ + connection.type for connection in session.user.app_connections + ] + ] + if session is not None + else [] + ), + session.user if session is not None else UnauthenticatedUser() + ) -- cgit v1.2.3