SilverSight/scripts/stack/setup_homarr_auth.py
allaun 85141a4b94 feat(nuvmap,braid): NUVMAP port + Rossby/Kelvin braid correspondence
- Port NUVMAP projection engine from Research Stack to SilverSight
  with Q16_16 fixed-point (zero Float) and CBOR serialization
- Add Rotational Wave — Braid Correspondence formalization at boundary
  (ChiralLabel, RossbyDrift, rossby_convergence_bound stubbed,
   kelvin_wave_eigensolid proven)
- Add auto-pipeline CI workflow, webhook receiver, Forgejo MCP server
- Add SOPS/Age encryption config
- Add stack compose for portable deployment
- Add rotational wave design doc
2026-06-30 16:38:11 -05:00

63 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Create Authentik OAuth2 provider + application for Homarr."""
import urllib.request, json, sys
AK = "9LyRvCaRLSmDrkGxQ45xRKt0JrBWMe3tI3sV2x0HV30mMcxaDBEA4cJ8QDZ2"
BASE = "http://localhost:9000"
def api(method, path, data=None):
req = urllib.request.Request(f"{BASE}{path}",
data=json.dumps(data).encode() if data else None,
headers={"Authorization": f"Bearer {AK}", "Content-Type": "application/json"},
method=method)
try:
with urllib.request.urlopen(req) as r:
return json.loads(r.read())
except urllib.error.HTTPError as e:
print(f" {method} {path}: {e.code} {e.read().decode()[:200]}")
return None
# 1. Get authorization flow
flows = api("GET", "/api/v3/flows/?slug=provider-authorization-implicit-consent")
if not flows or not flows.get("results"):
# Try alternative
flows = api("GET", "/api/v3/flows/")
if flows:
print(f"Available flows: {[(f['slug'], f['name']) for f in flows.get('results',[])]}")
flow_pk = flows["results"][0]["pk"]
else:
sys.exit(1)
else:
flow_pk = flows["results"][0]["pk"]
print(f"Flow PK: {flow_pk}")
# 2. Get provider type
provider_types = api("GET", "/api/v3/providers/all/types/")
print(f"Provider types: {provider_types}")
# 3. Create OAuth2 provider
provider = api("POST", "/api/v3/providers/oauth2/", {
"name": "Homarr",
"authorization_flow": flow_pk,
"client_type": "confidential",
"redirect_uris": "http://localhost:7575/api/auth/callback/authentik"
})
if provider:
print(f"Provider created: {provider.get('pk')} client_id={provider.get('client_id')}")
client_id = provider.get("client_id")
client_secret = provider.get("client_secret")
# 4. Create Application
app = api("POST", "/api/v3/core/applications/", {
"name": "Homarr",
"slug": "homarr",
"provider": provider["pk"]
})
if app:
print(f"Application created: {app.get('pk')} slug={app.get('slug')}")
print(f"\nHomarr OIDC config:")
print(f" Client ID: {client_id}")
print(f" Client Secret: {client_secret}")
print(f" Issuer: http://localhost:9000/application/o/homarr/")
else:
print("Failed to create application")