Skip to content

Authentication & Authorization

kokage-ui provides pre-built authentication UI components and route protection decorators.

LoginForm

from kokage_ui import LoginForm, Page

@ui.page("/login")
def login_page():
    return Page(
        LoginForm(
            action="/login",
            register_url="/register",
            forgot_url="/forgot-password",
        ),
        title="Login",
    )
Parameter Type Description
action str Form submit URL (default: "/login")
method str HTTP method (default: "post")
title str Form title (default: "Login")
username_label str Username field label (default: "Username")
username_field str Username input name (default: "username")
password_label str Password field label (default: "Password")
password_field str Password input name (default: "password")
submit_text str Submit button text (default: "Login")
submit_color str Button color (default: "primary")
register_url str | None Registration page URL
forgot_url str | None Forgot password page URL
error str | None Error message to display
use_email bool Use email input type (default: False)

RegisterForm

from kokage_ui import RegisterForm

RegisterForm(
    action="/register",
    login_url="/login",
    confirm_password=True,
)
Parameter Type Description
action str Form submit URL (default: "/register")
title str Form title (default: "Create Account")
fields list[tuple] | None Custom fields: [(name, label, type), ...]
confirm_password bool Add password confirmation field (default: True)
login_url str | None Login page link URL
error str | None Error message to display

UserMenu

Dropdown menu for the navigation bar:

from kokage_ui import NavBar, UserMenu

NavBar(
    start=A("My App", href="/"),
    end=UserMenu(
        username="alice@example.com",
        avatar_url="https://example.com/avatar.jpg",
        menu_items=[("Settings", "/settings"), ("Help", "/help")],
        logout_url="/logout",
    ),
)
Parameter Type Description
username str Display name (required)
avatar_url str | None Avatar image URL
logout_url str Logout URL (default: "/logout")
menu_items list[tuple] | None [(label, href), ...] for dropdown items

RoleGuard

Conditionally render content based on user role (server-side, no HTML leak):

from kokage_ui import RoleGuard

RoleGuard(
    A("Admin Panel", href="/admin"),
    role="admin",
    user_role=current_user.role,
    fallback=Span("Access denied"),
)
Parameter Type Description
*children Any Content to show if authorized
role str | list[str] Required role(s)
user_role str | list[str] | None Current user's role(s)
fallback Any Content when unauthorized (default: empty)

@protected Decorator

Protect page/fragment routes with authentication and optional role checking:

from kokage_ui import protected

async def get_user(request: Request):
    token = request.cookies.get("token")
    if not token:
        return None
    return {"username": "alice", "role": "admin"}

@ui.page("/dashboard")
@protected(get_user, role="admin", redirect_to="/login")
async def dashboard(request: Request):
    user = request.state.user
    return Page(H1(f"Welcome, {user['username']}"))
Parameter Type Description
auth_check Callable (Request) -> user \| None (sync or async)
redirect_to str Redirect URL when unauthenticated (default: "/login")
role str | list[str] | None Required role(s) for authorization
role_key str Key/attribute name for user role (default: "role")

When auth_check returns None, the user is redirected. When a role is required but not matched, a 403 Forbidden is raised. The authenticated user is set on request.state.user.