Files
vigilcare-clinical/scripts/mint-gateway-jwt.sh
T
2026-06-24 03:01:00 +08:00

41 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Mint a dev JWT for the ward gateway API (issuer vigilcare-gateway).
# Usage: mint-gateway-jwt.sh [username] [clinical_role]
# Prints the token to stdout.
set -euo pipefail
USERNAME="${1:-nurse.demo}"
ROLE="${2:-NURSE}"
python3 - "$USERNAME" "$ROLE" <<'PY'
import json, hmac, hashlib, base64, datetime, os, sys
def b64url(data: bytes) -> str:
return base64.urlsafe_b64encode(data).decode().rstrip("=")
username = sys.argv[1]
role = sys.argv[2].upper()
secret = os.environ.get(
"GATEWAY_JWT_SECRET", "dev-signing-key-minimum-32-bytes-long!!").encode()
user_id = os.environ.get(
"GATEWAY_JWT_USER_ID", "11111111-1111-1111-1111-111111111111")
display = os.environ.get("GATEWAY_JWT_DISPLAY_NAME", "Demo Nurse")
header = b64url(json.dumps({"alg": "HS256", "typ": "JWT"}, separators=(",", ":")).encode())
now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
payload = {
"iss": "vigilcare-gateway",
"aud": "vigilcare-dashboard",
"exp": now + 86400,
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": user_id,
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": username,
"display_name": display,
"clinical_role": role,
}
payload_b64 = b64url(json.dumps(payload, separators=(",", ":")).encode())
signing_input = f"{header}.{payload_b64}".encode()
sig = b64url(hmac.new(secret, signing_input, hashlib.sha256).digest())
print(f"{header}.{payload_b64}.{sig}", end="")
PY