docker.openwebuibundle / auth_service.py
duds1977's picture
Update auth_service.py
31a66b8 verified
raw
history blame
2.53 kB
from fastapi import FastAPI, Request
from fastapi.responses import Response, RedirectResponse
import os
import re
import secrets
app = FastAPI()
COOKIE_NAME = "anon_session"
ADMIN_COOKIE_NAME = "admin_session"
COOKIE_MAX_AGE = 60 * 60 * 24 * 7 # 7 days
SAFE_RE = re.compile(r"^[a-f0-9]{32}$")
ADMIN_BOOTSTRAP_TOKEN = os.getenv("ADMIN_BOOTSTRAP_TOKEN", "")
ADMIN_EMAIL = "admin@demo.local"
ADMIN_NAME = "Rob Admin"
def generate_session_id() -> str:
return secrets.token_hex(16)
def session_to_identity(session_id: str) -> tuple[str, str]:
short_id = session_id[:12]
email = f"anon-{session_id}@demo.local"
name = f"Guest {short_id}"
return email, name
@app.get("/bootstrap")
async def bootstrap(request: Request):
token = request.query_params.get("token", "")
if not ADMIN_BOOTSTRAP_TOKEN or token != ADMIN_BOOTSTRAP_TOKEN:
return Response(status_code=403, content="Invalid bootstrap token")
response = RedirectResponse(url="/", status_code=302)
response.set_cookie(
key=ADMIN_COOKIE_NAME,
value="1",
max_age=COOKIE_MAX_AGE,
httponly=True,
samesite="lax",
secure=True,
path="/",
)
return response
@app.get("/logout-admin")
async def logout_admin():
response = RedirectResponse(url="/", status_code=302)
response.delete_cookie(ADMIN_COOKIE_NAME, path="/")
return response
@app.get("/resolve")
async def resolve(request: Request):
admin_cookie = request.cookies.get(ADMIN_COOKIE_NAME)
if admin_cookie == "1":
response = Response(status_code=204)
response.headers["X-Auth-Request-Email"] = ADMIN_EMAIL
response.headers["X-Auth-Request-Name"] = ADMIN_NAME
return response
cookie_val = request.cookies.get(COOKIE_NAME)
if not cookie_val or not SAFE_RE.match(cookie_val):
cookie_val = generate_session_id()
new_cookie = True
else:
new_cookie = False
email, name = session_to_identity(cookie_val)
response = Response(status_code=204)
response.headers["X-Auth-Request-Email"] = email
response.headers["X-Auth-Request-Name"] = name
if new_cookie:
response.set_cookie(
key=COOKIE_NAME,
value=cookie_val,
max_age=COOKIE_MAX_AGE,
httponly=True,
samesite="lax",
secure=True,
path="/",
)
return response
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=9000)