Próbowałem swego czasu zrobić Facebook login feature w Starlette dla mojej aplikacji. Generalnie to pokazany przez nich sposób autentykacji w Middleware trochę wydał mi się tu nie trafiony i chciałem to zrobić to w view (po Facebook login przechodzimy na nowy, wskazany wcześniej endpoint, więc trochę nielogiczne, jeśli nie niemożliwe wydało mi się zrobienie tego w middleware). Zrobiłem to w pokazany niżej sposób i zastanawiam się czy jest to bezpieczne:
# Dekorator do zabezpieczania endpointów
def requires_auth(view):
@wraps(view)
def wrapper(request: Request, **kwargs: Optional[Dict]):
if not request.session.get('logged_in_user'):
raise HTTPException(status_code=403, detail="User not authenticated, please log in.")
return view(request, **kwargs)
return wrapper
@app.get("/login")
async def login(request: Request):
try:
user = await google_sso.verify_and_process(request)
except SSOLoginError as e:
raise e
else:
request.session['logged_in_user'] = user.email
return "Welcome"
@app.get("/test")
@requires_auth
async def test():
return JSONResponse({"hello": "world"})
Będę wdzięczny za odpowiedź. Teoretycznie jeśli "session" nie jest modyfikowalne z poza poziomu programu, to powinno być to bezpieczne (bo czemu nie?), z drugiej, zastanawiam się czemu sami nie przedstawili tego właśnie w taki (imo) nieco prostszy sposób.