75 lines
2.1 KiB
Bash
Executable File
75 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
|
}
|
|
|
|
require_cmd() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
echo "Required command not found: $1" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_cmd curl
|
|
require_cmd python3
|
|
|
|
ISSUER="${SKD_OIDC_ISSUER:-}"
|
|
REG_ENDPOINT_DEFAULT=""
|
|
if [[ -n "${ISSUER}" ]]; then
|
|
REG_ENDPOINT_DEFAULT="${ISSUER%/}/connect/register"
|
|
fi
|
|
|
|
REG_ENDPOINT="${OIDC_REGISTRATION_ENDPOINT:-$REG_ENDPOINT_DEFAULT}"
|
|
INITIAL_TOKEN="${OIDC_INITIAL_ACCESS_TOKEN:-}"
|
|
CLIENT_NAME="${OIDC_CLIENT_NAME:-Safe Kiddo Daemon}"
|
|
REDIRECT_URI="${SKD_OIDC_REDIRECT_URI:-http://localhost:8000/login/oidc/callback}"
|
|
|
|
if [[ -z "${REG_ENDPOINT}" || -z "${INITIAL_TOKEN}" ]]; then
|
|
cat >&2 <<'EOF'
|
|
Missing configuration. Set:
|
|
SKD_OIDC_ISSUER (or OIDC_REGISTRATION_ENDPOINT)
|
|
OIDC_INITIAL_ACCESS_TOKEN
|
|
Optional:
|
|
OIDC_CLIENT_NAME (default: Safe Kiddo Daemon)
|
|
SKD_OIDC_REDIRECT_URI (default: http://localhost:8000/login/oidc/callback)
|
|
EOF
|
|
exit 1
|
|
fi
|
|
|
|
log "Registering client at ${REG_ENDPOINT} with redirect ${REDIRECT_URI}..."
|
|
|
|
TMP_RESP="$(mktemp)"
|
|
trap 'rm -f "${TMP_RESP}"' EXIT
|
|
|
|
HTTP_CODE=$(curl -sS -o "${TMP_RESP}" -w '%{http_code}' \
|
|
-X POST "${REG_ENDPOINT}" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer ${INITIAL_TOKEN}" \
|
|
-d "{\"client_name\":\"${CLIENT_NAME}\",\"redirect_uris\":[\"${REDIRECT_URI}\"]}")
|
|
|
|
if [[ "${HTTP_CODE}" != "200" && "${HTTP_CODE}" != "201" ]]; then
|
|
echo "Client registration failed (HTTP ${HTTP_CODE}):" >&2
|
|
cat "${TMP_RESP}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
python3 - "$TMP_RESP" <<'PYCODE'
|
|
import json, sys
|
|
path = sys.argv[1]
|
|
data = json.load(open(path, "r"))
|
|
client_id = data.get("client_id")
|
|
client_secret = data.get("client_secret")
|
|
print("Client registered.")
|
|
if client_id:
|
|
print(f"Client ID: {client_id}")
|
|
if client_secret:
|
|
print(f"Client Secret: {client_secret}")
|
|
if not (client_id and client_secret):
|
|
print("Warning: Response missing client_id or client_secret", file=sys.stderr)
|
|
PYCODE
|