Initial commit
This commit is contained in:
commit
f6aa79a3fd
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
venv/
|
||||
moxxy_oidc_server.egg-info/
|
||||
**/__pycache__/
|
0
moxxy_oidc_server/__init__.py
Normal file
0
moxxy_oidc_server/__init__.py
Normal file
85
moxxy_oidc_server/main.py
Normal file
85
moxxy_oidc_server/main.py
Normal file
@ -0,0 +1,85 @@
|
||||
import uuid
|
||||
import os
|
||||
import urllib.parse
|
||||
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
import requests
|
||||
|
||||
|
||||
class SessionRequest(BaseModel):
|
||||
# Internal session ID
|
||||
session_id: str
|
||||
|
||||
# URL to show the user to perform authentication
|
||||
auth_url: str
|
||||
|
||||
class TokenResponse(BaseModel):
|
||||
token: str
|
||||
|
||||
OIDC_BASE_URI: str = os.environ["OIDC_BASE_URI"]
|
||||
REDIRECT_URI: str = os.environ["REDIRECT_URI"]
|
||||
CLIENT_ID: str = os.environ["CLIENT_ID"]
|
||||
CLIENT_SECRET: str = os.environ["CLIENT_SECRET"]
|
||||
app = FastAPI()
|
||||
|
||||
sessions: dict[str, str | None] = {}
|
||||
|
||||
@app.get("/.well-known/xmpp/oidc")
|
||||
def request_session(provider: str) -> SessionRequest:
|
||||
"""
|
||||
Build the correct "session" and GET url to authenticate to the OIDC
|
||||
provider.
|
||||
"""
|
||||
# TODO: Actually use provider
|
||||
|
||||
sid = uuid.uuid4().hex
|
||||
sessions[sid] = None
|
||||
|
||||
params: dict[str, str] = {
|
||||
"response_type": "code",
|
||||
"scope": "openid",
|
||||
"client_id": CLIENT_ID,
|
||||
"state": sid,
|
||||
"redirect_uri": REDIRECT_URI,
|
||||
}
|
||||
return SessionRequest(
|
||||
session_id=sid,
|
||||
auth_url=f"{OIDC_BASE_URI}/authorize/" + "?" + urllib.parse.urlencode(params),
|
||||
)
|
||||
|
||||
@app.get("/.well-known/xmpp/token")
|
||||
def request_token(sid: str) -> TokenResponse:
|
||||
"""
|
||||
Acquire the token that the server got from the OIDC provider.
|
||||
"""
|
||||
|
||||
if sessions.get(sid) is None:
|
||||
raise HTTPException(404)
|
||||
|
||||
return TokenResponse(
|
||||
token=sessions.pop(sid),
|
||||
)
|
||||
|
||||
@app.get("/.well-known/xmpp/callback")
|
||||
def oidc_callback(code: str, state: str) -> None:
|
||||
"""
|
||||
Callback for the OIDC redirect
|
||||
"""
|
||||
|
||||
token_req = requests.post(
|
||||
f"{OIDC_BASE_URI}/token/",
|
||||
data={
|
||||
"grant_type": "authorization_code",
|
||||
"code": code,
|
||||
"redirect_uri": REDIRECT_URI,
|
||||
"client_id": CLIENT_ID,
|
||||
"client_secret": CLIENT_SECRET,
|
||||
},
|
||||
)
|
||||
if not token_req.ok:
|
||||
print(f"Status Code: {token_req.status_code}")
|
||||
print(f"Body: {token_req.text}")
|
||||
raise HTTPException(500)
|
||||
|
||||
sessions[state] = token_req.json()["access_token"]
|
4
pyproject.toml
Normal file
4
pyproject.toml
Normal file
@ -0,0 +1,4 @@
|
||||
[project]
|
||||
name = "moxxy-oidc-server"
|
||||
version = "0.1.0"
|
||||
dependencies = ["requests", "fastapi[standard]"]
|
0
tests/test_behaviour.py
Normal file
0
tests/test_behaviour.py
Normal file
Loading…
Reference in New Issue
Block a user