mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
- 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
63 lines
2.2 KiB
Python
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")
|