67 lines
1.8 KiB
Python
67 lines
1.8 KiB
Python
import json
|
|
from fastapi import FastAPI, Request
|
|
from fastapi.templating import Jinja2Templates
|
|
from starlette.config import Config
|
|
from starlette.middleware.sessions import SessionMiddleware
|
|
from starlette.responses import HTMLResponse, RedirectResponse
|
|
from authlib.integrations.starlette_client import OAuth, OAuthError
|
|
|
|
from .settings import settings
|
|
|
|
config = Config("secret.env") # TODO unify this with settings
|
|
|
|
oauth = OAuth(config)
|
|
oauth.register(
|
|
name="gitea",
|
|
server_metadata_url="https://git.leafbla.de/.well-known/openid-configuration",
|
|
)
|
|
|
|
app = FastAPI()
|
|
app.add_middleware(SessionMiddleware, secret_key=config.get("SESSION_SECRET_KEY"))
|
|
|
|
|
|
templates = Jinja2Templates(directory="templates")
|
|
|
|
manifest = dict()
|
|
if not settings.dev_mode:
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
with open(f"{settings.frontend_path}/manifest.json", "r") as f:
|
|
manifest = json.load(f)
|
|
|
|
|
|
@app.get("/")
|
|
async def index(request: Request):
|
|
return templates.TemplateResponse(
|
|
"index.html",
|
|
{"request": request, "dev_mode": settings.dev_mode, "manifest": manifest},
|
|
)
|
|
|
|
|
|
@app.get("/login")
|
|
async def login(request: Request):
|
|
redirect_uri = request.url_for("auth")
|
|
return await oauth.gitea.authorize_redirect(request, redirect_uri)
|
|
|
|
|
|
@app.get("/auth")
|
|
async def auth(request: Request):
|
|
try:
|
|
token = await oauth.gitea.authorize_access_token(request)
|
|
except OAuthError as e:
|
|
return HTMLResponse(f"<h1>{e.error}</h1>")
|
|
user = await oauth.gitea.userinfo(token=token)
|
|
if user:
|
|
request.session["user"] = dict(user)
|
|
return RedirectResponse(url="/")
|
|
|
|
|
|
@app.get("/logout")
|
|
async def logout(request: Request):
|
|
request.session.pop("user", None)
|
|
return RedirectResponse(url="/")
|
|
|
|
|
|
if not settings.dev_mode:
|
|
app.mount("/", StaticFiles(directory=settings.frontend_path))
|