{"library":"python-keycloak","title":"Python Keycloak Client","description":"python-keycloak is a Python package providing access to the Keycloak API, acting as a client for OpenID Connect and OAuth2 workflows. It is currently at version 7.1.1 and receives regular updates, typically aligning with Keycloak's own release cycles for compatibility and feature support.","language":"python","status":"active","last_verified":"Wed May 20","install":{"commands":["pip install python-keycloak"],"cli":null},"imports":["from keycloak import KeycloakOpenID","from keycloak.admin import KeycloakAdmin"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom keycloak import KeycloakOpenID\n\n# Configuration from environment variables or sensible defaults\nKEYCLOAK_SERVER_URL = os.environ.get('KEYCLOAK_SERVER_URL', 'http://localhost:8080/')\nKEYCLOAK_REALM_NAME = os.environ.get('KEYCLOAK_REALM_NAME', 'myrealm')\nKEYCLOAK_CLIENT_ID = os.environ.get('KEYCLOAK_CLIENT_ID', 'my-client-id')\nKEYCLOAK_CLIENT_SECRET = os.environ.get('KEYCLOAK_CLIENT_SECRET', '') # Required for confidential clients\nKEYCLOAK_USERNAME = os.environ.get('KEYCLOAK_USERNAME', 'testuser')\nKEYCLOAK_PASSWORD = os.environ.get('KEYCLOAK_PASSWORD', 'password')\n\n# Initialize KeycloakOpenID client\nkeycloak_openid = KeycloakOpenID(\n    server_url=KEYCLOAK_SERVER_URL,\n    realm_name=KEYCLOAK_REALM_NAME,\n    client_id=KEYCLOAK_CLIENT_ID,\n    client_secret_key=KEYCLOAK_CLIENT_SECRET, # Pass if client is confidential, otherwise omit\n    verify_ssl_cert=False # Set to True for production, False for dev/self-signed certs\n)\n\ntry:\n    # Get initial tokens using Direct Access Grant (Resource Owner Password Credentials Flow)\n    # Note: This flow is generally not recommended for public clients (e.g., browser-based apps)\n    # and should be used cautiously, primarily for trusted backend services or CLI tools.\n    token = keycloak_openid.token(KEYCLOAK_USERNAME, KEYCLOAK_PASSWORD)\n    print(\"Successfully obtained token:\")\n    print(f\"  Access Token (first 10 chars): {token.get('access_token', '')[:10]}...\")\n    print(f\"  Refresh Token (first 10 chars): {token.get('refresh_token', '')[:10]}...\")\n    print(f\"  Expires in: {token.get('expires_in')}s\")\n\n    # Example: Verify token\n    decoded_token = keycloak_openid.decode_token(token['access_token'])\n    print(f\"  Decoded Access Token Subject: {decoded_token.get('sub')}\")\n\n    # Example: Refresh token\n    if 'refresh_token' in token and token['refresh_token']:\n        print(\"\\nAttempting to refresh token...\")\n        refreshed_token = keycloak_openid.refresh_token(token['refresh_token'])\n        print(\"Successfully refreshed token:\")\n        print(f\"  New Access Token (first 10 chars): {refreshed_token.get('access_token', '')[:10]}...\")\n        print(f\"  New Expires in: {refreshed_token.get('expires_in')}s\")\n    else:\n        print(\"No refresh token available or provided.\")\n\nexcept Exception as e:\n    print(f\"Error during Keycloak interaction: {e}\")\n    print(\"Please ensure Keycloak is running, the realm, client ID/secret, and user credentials are correct.\")\n    print(\"Also, verify 'Direct Access Grants' is enabled for the client in Keycloak's client settings.\")","lang":"python","description":"Demonstrates how to initialize the `KeycloakOpenID` client, obtain an access token using the Direct Access Grant (Resource Owner Password Credentials) flow, decode the token, and refresh it. Remember to configure your Keycloak server with a realm, client, and user. Set `verify_ssl_cert=True` in production environments.","tag":null,"tag_description":null,"last_tested":"2026-04-24","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-20","installed_version":"6.0.0","pypi_latest":"7.1.1","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.9,"avg_import_s":1.21,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.9,"mem_mb":16.6,"disk_size":"43.9M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.1,"mem_mb":16.4,"disk_size":"42.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4,"import_time_s":0.66,"mem_mb":16.6,"disk_size":"44M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.66,"mem_mb":16.4,"disk_size":"43M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.34,"mem_mb":18.9,"disk_size":"47.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.68,"mem_mb":18.7,"disk_size":"46.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.8,"import_time_s":1.2,"mem_mb":18.9,"disk_size":"48M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.23,"mem_mb":18.7,"disk_size":"47M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.36,"mem_mb":18.8,"disk_size":"39.0M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.57,"mem_mb":18.5,"disk_size":"37.8M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.4,"import_time_s":1.38,"mem_mb":18.8,"disk_size":"39M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.73,"mem_mb":18.5,"disk_size":"38M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.35,"mem_mb":19.7,"disk_size":"38.8M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.66,"mem_mb":19.5,"disk_size":"37.5M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.4,"import_time_s":1.33,"mem_mb":19.7,"disk_size":"39M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.57,"mem_mb":19.5,"disk_size":"38M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.81,"mem_mb":16.7,"disk_size":"43.8M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.99,"mem_mb":16.5,"disk_size":"42.7M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.8,"import_time_s":0.79,"mem_mb":16.7,"disk_size":"44M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"python-keycloak","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.9,"mem_mb":16.5,"disk_size":"43M"}]}}