Authentication with Sessions

Setup Session Middleware

from stario import Stario
from stario.middleware import SessionMiddleware

app = Stario()

app.add_middleware(SessionMiddleware, 
    secret_key="your-secret-key",
    session_cookie="session_id",
    max_age=86400  # 1 day
)

Login Endpoint

from stario import Command
from stario.requests import Request

@app.command("/login")
async def login(request: Request, username: str = "", password: str = ""):
    user = db.find_user(username)

    if user and verify_password(password, user.password_hash):
        request.session["user_id"] = user.id
        request.session["username"] = user.username
        return redirect("/dashboard")

    return html('<p class="error">Invalid credentials</p>')

Protect Endpoints

from stario import Query
from stario.requests import Request

@app.query("/dashboard")
async def dashboard(request: Request):
    if "user_id" not in request.session:
        return redirect("/login")

    user_id = request.session["user_id"]
    user = db.get_user(user_id)
    return html(f"<h1>Welcome {user.username}</h1>")

Logout

from stario import Command
from stario.requests import Request

@app.command("/logout")
async def logout(request: Request):
    request.session.clear()
    return redirect("/")

Check Authentication

from stario import Query
from stario.requests import Request

async def require_auth(request: Request):
    if "user_id" not in request.session:
        raise UnauthorizedError("Not authenticated")
    return request.session["user_id"]

@app.query("/profile")
async def profile(user_id: int = require_auth(request)):
    user = db.get_user(user_id)
    return html(f"<p>{user.email}</p>")

Session Data

from stario import Command
from stario.requests import Request

@app.command("/set-preference")
async def set_preference(request: Request, theme: str):
    request.session["theme"] = theme
    request.session.save()  # Persist to store
    return {"status": "ok"}

Secure Cookies

from stario.middleware import SessionMiddleware

app.add_middleware(SessionMiddleware,
    secret_key="secure-random-key",
    session_cookie="session_id",
    max_age=3600,
    secure=True,      # Only HTTPS
    httponly=True,    # No JavaScript access
    samesite="Strict" # CSRF protection
)