controlpanel/server/server/__init__.py
2022-09-03 10:16:53 +02:00

56 lines
1.6 KiB
Python

import json
from typing import Union
from fastapi import FastAPI
from starlette.config import Config
from starlette.requests import Request
from starlette.middleware.sessions import SessionMiddleware
from starlette.responses import HTMLResponse, RedirectResponse
from authlib.integrations.starlette_client import OAuth, OAuthError
config = Config(".env")
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"))
@app.get("/")
def index(request: Request):
header = f"<pre>{json.dumps(request.session)}</pre>"
user = request.session.get("user")
if user is None:
return HTMLResponse(f'{header}<a href="/login">login</a>')
data = json.dumps(user)
html = f"{header}<pre>{data}</pre>" '<a href="/logout">logout</a>'
return HTMLResponse(html)
@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)
print(user)
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="/")