Log session id from handlers on selected auth routes. Adds request.state.log_extra for handlers to print access log extra.
This commit is contained in:
@@ -21,6 +21,7 @@ from paskia.fastapi import authz, session, user
|
||||
from paskia.fastapi.response import MsgspecResponse
|
||||
from paskia.fastapi.session import AUTH_COOKIE, AUTH_COOKIE_NAME, get_client_ip
|
||||
from paskia.globals import passkey as global_passkey
|
||||
from paskia.util.crypto import hash_secret
|
||||
from paskia.util import hostutil, htmlutil, passphrase, permutil, userinfo
|
||||
from paskia.util.apistructs import (
|
||||
ApiCheckUserResponse,
|
||||
@@ -56,6 +57,12 @@ async def http_exception_handler(_request: Request, exc: HTTPException):
|
||||
_REFRESH_INTERVAL = timedelta(minutes=5)
|
||||
|
||||
|
||||
def _set_log_extra(request: Request, *parts: str) -> None:
|
||||
values = [part for part in parts if part]
|
||||
if values:
|
||||
request.state.log_extra = " ".join(values)
|
||||
|
||||
|
||||
@app.exception_handler(ValueError)
|
||||
async def value_error_handler(_request: Request, exc: ValueError):
|
||||
return JSONResponse(status_code=400, content={"detail": str(exc)})
|
||||
@@ -110,6 +117,7 @@ async def validate_token(
|
||||
)
|
||||
session.set_session_cookie(response, auth)
|
||||
renewed = True
|
||||
_set_log_extra(request, ctx.session.key)
|
||||
return MsgspecResponse(
|
||||
ApiValidateResponse(
|
||||
valid=True,
|
||||
@@ -202,6 +210,7 @@ async def forward_authentication(
|
||||
host=request.headers.get("host"),
|
||||
max_age=max_age,
|
||||
)
|
||||
_set_log_extra(request, request.headers.get("x-forwarded-uri", ""), ctx.session.key)
|
||||
# Build permission scopes for Remote-Groups header
|
||||
role_permissions = (
|
||||
{p.scope for p in ctx.permissions} if ctx.permissions else set()
|
||||
@@ -276,6 +285,8 @@ async def api_user_info(
|
||||
clear_session=True,
|
||||
)
|
||||
|
||||
_set_log_extra(request, ctx.session.key)
|
||||
|
||||
return MsgspecResponse(
|
||||
await userinfo.build_user_info(
|
||||
user_uuid=ctx.user.uuid,
|
||||
@@ -351,5 +362,6 @@ async def api_set_session(
|
||||
if not ctx:
|
||||
raise HTTPException(401, f"Session not found on {host}")
|
||||
|
||||
_set_log_extra(request, hash_secret("cookie", secret))
|
||||
session.set_session_cookie(response, secret)
|
||||
return {"status": "ok", "user": str(ctx.user.uuid)}
|
||||
|
||||
@@ -256,12 +256,7 @@ class AccessLogMiddleware(BaseHTTPMiddleware):
|
||||
path = f"{path}?{request.url.query}"
|
||||
status = response.status_code
|
||||
|
||||
extra = ""
|
||||
# For forward-auth endpoint, include the original target URI when provided.
|
||||
if request.url.path == "/auth/api/forward":
|
||||
forwarded_uri = request.headers.get("x-forwarded-uri")
|
||||
if forwarded_uri:
|
||||
extra = forwarded_uri
|
||||
extra = getattr(request.state, "log_extra", "")
|
||||
|
||||
line = format_access_log(
|
||||
client, status, method, host, path, duration_ms, extra=extra
|
||||
|
||||
Reference in New Issue
Block a user