#!/usr/bin/env python3 """ Test OAuth client registration endpoint security. Verifies that: 1. Registration endpoint requires Master API Key 2. Unauthorized requests are rejected with 401 3. Valid Master API Key allows registration """ import os import requests BASE_URL = os.getenv("BASE_URL", "http://localhost:8000") MASTER_API_KEY = os.getenv("MASTER_API_KEY", "your_master_key_here") print("Testing OAuth Client Registration Security") print("=" * 60) # Test 1: Registration without Authorization header print("\n1. Testing registration WITHOUT Authorization header") try: payload = { "client_name": "Unauthorized Test Client", "redirect_uris": ["http://localhost:3000/callback"], "grant_types": ["authorization_code"], "scope": "read", } response = requests.post(f"{BASE_URL}/oauth/register", json=payload) print(f" Status: {response.status_code}") if response.status_code == 401: data = response.json() print(f" ✅ Correctly rejected: {data.get('error')}") print(f" Message: {data.get('error_description')}") else: print(f" ❌ SECURITY ISSUE: Should return 401, got {response.status_code}") print(f" Response: {response.text}") except Exception as e: print(f" ❌ Error: {e}") # Test 2: Registration with invalid API key print("\n2. Testing registration WITH invalid API key") try: payload = { "client_name": "Unauthorized Test Client 2", "redirect_uris": ["http://localhost:3000/callback"], "grant_types": ["authorization_code"], "scope": "read", } headers = {"Authorization": "Bearer invalid_api_key_12345"} response = requests.post(f"{BASE_URL}/oauth/register", json=payload, headers=headers) print(f" Status: {response.status_code}") if response.status_code == 401: data = response.json() print(f" ✅ Correctly rejected: {data.get('error')}") print(f" Message: {data.get('error_description')}") else: print(f" ❌ SECURITY ISSUE: Should return 401, got {response.status_code}") print(f" Response: {response.text}") except Exception as e: print(f" ❌ Error: {e}") # Test 3: Registration with valid Master API Key print("\n3. Testing registration WITH valid Master API Key") try: payload = { "client_name": "Authorized Test Client", "redirect_uris": ["http://localhost:3000/callback"], "grant_types": ["authorization_code", "refresh_token"], "scope": "read write", } headers = {"Authorization": f"Bearer {MASTER_API_KEY}"} response = requests.post(f"{BASE_URL}/oauth/register", json=payload, headers=headers) print(f" Status: {response.status_code}") if response.status_code == 201: data = response.json() print(" ✅ Successfully registered client") print(f" Client ID: {data.get('client_id')}") print(f" Client Secret: {data.get('client_secret', '')[:20]}...") print(f" Client Name: {data.get('client_name')}") else: print(f" ❌ Registration failed: {response.status_code}") print(f" Response: {response.text}") except Exception as e: print(f" ❌ Error: {e}") # Test 4: Attempt registration with wrong Authorization format print("\n4. Testing registration with wrong Authorization format") try: payload = { "client_name": "Test Client Wrong Format", "redirect_uris": ["http://localhost:3000/callback"], "grant_types": ["authorization_code"], "scope": "read", } headers = {"Authorization": MASTER_API_KEY} # Missing "Bearer " prefix response = requests.post(f"{BASE_URL}/oauth/register", json=payload, headers=headers) print(f" Status: {response.status_code}") if response.status_code == 401: data = response.json() print(f" ✅ Correctly rejected: {data.get('error')}") print(f" Message: {data.get('error_description')}") else: print(f" ❌ Should return 401, got {response.status_code}") except Exception as e: print(f" ❌ Error: {e}") print("\n" + "=" * 60) print("Security Test Complete!") print("\nExpected Results:") print(" ✅ Test 1 & 2 & 4: Should return 401 Unauthorized") print(" ✅ Test 3: Should return 201 Created with client credentials")