mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
Crude OpenID Connect client using Authlib
Developers can go to /sso/login to get redirected to the SSO. On successful login, the ID token is displayed. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
This commit is contained in:
parent
b1300117ac
commit
3b347d3989
8 changed files with 72 additions and 2 deletions
|
@ -11,7 +11,8 @@ before_script:
|
||||||
base-devel git gpgme protobuf pyalpm python-mysql-connector
|
base-devel git gpgme protobuf pyalpm python-mysql-connector
|
||||||
python-pygit2 python-srcinfo python-bleach python-markdown
|
python-pygit2 python-srcinfo python-bleach python-markdown
|
||||||
python-sqlalchemy python-alembic python-pytest python-werkzeug
|
python-sqlalchemy python-alembic python-pytest python-werkzeug
|
||||||
python-pytest-tap python-fastapi uvicorn nginx
|
python-pytest-tap python-fastapi uvicorn nginx python-authlib
|
||||||
|
python-itsdangerous python-httpx
|
||||||
|
|
||||||
test:
|
test:
|
||||||
script:
|
script:
|
||||||
|
|
3
TESTING
3
TESTING
|
@ -13,7 +13,8 @@ INSTALL.
|
||||||
|
|
||||||
# pacman -S --needed php php-sqlite sqlite words fortune-mod \
|
# pacman -S --needed php php-sqlite sqlite words fortune-mod \
|
||||||
python python-sqlalchemy python-alembic \
|
python python-sqlalchemy python-alembic \
|
||||||
python-fastapi uvicorn nginx
|
python-fastapi uvicorn nginx \
|
||||||
|
python-authlib python-itsdangerous python-httpx
|
||||||
|
|
||||||
Ensure to enable the pdo_sqlite extension in php.ini.
|
Ensure to enable the pdo_sqlite extension in php.ini.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
|
from starlette.middleware.sessions import SessionMiddleware
|
||||||
|
|
||||||
|
import aurweb.config
|
||||||
|
|
||||||
|
from aurweb.routers import sso
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
session_secret = aurweb.config.get("fastapi", "session_secret")
|
||||||
|
if not session_secret:
|
||||||
|
raise Exception("[fastapi] session_secret must not be empty")
|
||||||
|
|
||||||
|
app.add_middleware(SessionMiddleware, secret_key=session_secret)
|
||||||
|
|
||||||
|
app.include_router(sso.router)
|
||||||
|
|
5
aurweb/routers/__init__.py
Normal file
5
aurweb/routers/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"""
|
||||||
|
API routers for FastAPI.
|
||||||
|
|
||||||
|
See https://fastapi.tiangolo.com/tutorial/bigger-applications/
|
||||||
|
"""
|
30
aurweb/routers/sso.py
Normal file
30
aurweb/routers/sso.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import fastapi
|
||||||
|
|
||||||
|
from authlib.integrations.starlette_client import OAuth
|
||||||
|
from starlette.requests import Request
|
||||||
|
|
||||||
|
import aurweb.config
|
||||||
|
|
||||||
|
router = fastapi.APIRouter()
|
||||||
|
|
||||||
|
oauth = OAuth()
|
||||||
|
oauth.register(
|
||||||
|
name="sso",
|
||||||
|
server_metadata_url=aurweb.config.get("sso", "openid_configuration"),
|
||||||
|
client_kwargs={"scope": "openid"},
|
||||||
|
client_id=aurweb.config.get("sso", "client_id"),
|
||||||
|
client_secret=aurweb.config.get("sso", "client_secret"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/sso/login")
|
||||||
|
async def login(request: Request):
|
||||||
|
redirect_uri = aurweb.config.get("options", "aur_location") + "/sso/authenticate"
|
||||||
|
return await oauth.sso.authorize_redirect(request, redirect_uri, prompt="login")
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/sso/authenticate")
|
||||||
|
async def authenticate(request: Request):
|
||||||
|
token = await oauth.sso.authorize_access_token(request)
|
||||||
|
user = await oauth.sso.parse_id_token(request, token)
|
||||||
|
return dict(user)
|
|
@ -60,6 +60,9 @@ def generate_nginx_config():
|
||||||
location / {{
|
location / {{
|
||||||
proxy_pass http://{aurweb.config.get("php", "bind_address")};
|
proxy_pass http://{aurweb.config.get("php", "bind_address")};
|
||||||
}}
|
}}
|
||||||
|
location /sso {{
|
||||||
|
proxy_pass http://{aurweb.config.get("fastapi", "bind_address")};
|
||||||
|
}}
|
||||||
}}
|
}}
|
||||||
}}
|
}}
|
||||||
""")
|
""")
|
||||||
|
|
|
@ -68,6 +68,14 @@ username-regex = [a-zA-Z0-9]+[.\-_]?[a-zA-Z0-9]+$
|
||||||
git-serve-cmd = /usr/local/bin/aurweb-git-serve
|
git-serve-cmd = /usr/local/bin/aurweb-git-serve
|
||||||
ssh-options = restrict
|
ssh-options = restrict
|
||||||
|
|
||||||
|
[sso]
|
||||||
|
openid_configuration =
|
||||||
|
client_id =
|
||||||
|
client_secret =
|
||||||
|
|
||||||
|
[fastapi]
|
||||||
|
session_secret =
|
||||||
|
|
||||||
[serve]
|
[serve]
|
||||||
repo-path = /srv/http/aurweb/aur.git/
|
repo-path = /srv/http/aurweb/aur.git/
|
||||||
repo-regex = [a-z0-9][a-z0-9.+_-]*$
|
repo-regex = [a-z0-9][a-z0-9.+_-]*$
|
||||||
|
|
|
@ -20,6 +20,12 @@ aur_location = http://127.0.0.1:8080
|
||||||
disable_http_login = 0
|
disable_http_login = 0
|
||||||
enable-maintenance = 0
|
enable-maintenance = 0
|
||||||
|
|
||||||
|
; Single sign-on
|
||||||
|
[sso]
|
||||||
|
openid_configuration = http://127.0.0.1:8083/auth/realms/aurweb/.well-known/openid-configuration
|
||||||
|
client_id = aurweb
|
||||||
|
client_secret =
|
||||||
|
|
||||||
[php]
|
[php]
|
||||||
; Address PHP should bind when spawned in development mode by aurweb.spawn.
|
; Address PHP should bind when spawned in development mode by aurweb.spawn.
|
||||||
bind_address = 127.0.0.1:8081
|
bind_address = 127.0.0.1:8081
|
||||||
|
@ -30,3 +36,6 @@ htmldir = YOUR_AUR_ROOT/web/html
|
||||||
[fastapi]
|
[fastapi]
|
||||||
; Address uvicorn should bind when spawned in development mode by aurweb.spawn.
|
; Address uvicorn should bind when spawned in development mode by aurweb.spawn.
|
||||||
bind_address = 127.0.0.1:8082
|
bind_address = 127.0.0.1:8082
|
||||||
|
|
||||||
|
; Passphrase FastAPI uses to sign client-side sessions.
|
||||||
|
session_secret = secret
|
||||||
|
|
Loading…
Add table
Reference in a new issue