56 lines
1.6 KiB
Python
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="/")
|