{"library":"python3-saml","title":"python3-saml Toolkit","description":"The python3-saml library provides a robust SAML (Security Assertion Markup Language) toolkit for Python, enabling applications to act as a Service Provider (SP) for Single Sign-On (SSO) and Single Logout (SLO). It simplifies integration with various Identity Providers (IdPs). The current version is 1.16.0, and it maintains an active release cadence with updates typically every few months, focusing on security, bug fixes, and compatibility.","language":"python","status":"active","last_verified":"Wed May 20","install":{"commands":["pip install python3-saml"],"cli":null},"imports":["from onelogin.saml2.auth import OneLogin_Saml2_Auth","from onelogin.saml2.settings import OneLogin_Saml2_Settings","from onelogin.saml2.constants import OneLogin_Saml2_Constants"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport json\nfrom onelogin.saml2.auth import OneLogin_Saml2_Auth\nfrom onelogin.saml2.settings import OneLogin_Saml2_Settings\nfrom onelogin.saml2.constants import OneLogin_Saml2_Constants\n\n# Dummy request data, replace with actual request data from your web framework\n# This simulates the data typically extracted from a Flask/Django/FastAPI request object.\ndummy_request_data = {\n    'http_host': 'localhost:8000',\n    'script_name': '/saml/sso',\n    'server_port': '8000',\n    'get_data': {}, # GET parameters\n    'post_data': {}, # POST parameters\n    'query_string': '',\n    'https': 'off', # 'on' or 'off'\n    'requested_url': 'http://localhost:8000/saml/sso',\n    'metadata': {} # Used for metadata generation\n}\n\n# SAML settings are critical for proper functioning and security.\n# In a real application, load these from a secure configuration management system,\n# e.g., a JSON file specified by an environment variable.\nsettings_path = os.environ.get('ONELOGIN_SAML_SETTINGS_PATH', '')\nsettings_data = {}\n\nif settings_path and os.path.exists(settings_path):\n    try:\n        with open(settings_path, 'r') as f:\n            settings_data = json.load(f)\n        print(f\"Loaded settings from {settings_path}\")\n    except Exception as e:\n        print(f\"Error loading settings from {settings_path}: {e}\")\nelse:\n    # Minimal settings for demonstration (NOT PRODUCTION READY).\n    # You MUST configure these with real SP and IdP details, including certificates.\n    print(\"Using default minimal settings. Please provide a settings file for production.\")\n    settings_data = {\n        'strict': True,\n        'debug': True,\n        'sp': {\n            'entityId': 'http://localhost:8000/saml/metadata/',\n            'assertionConsumerService': {\n                'url': 'http://localhost:8000/saml/acs/',\n                'binding': OneLogin_Saml2_Constants.BINDING_HTTP_POST\n            },\n            'singleLogoutService': {\n                'url': 'http://localhost:8000/saml/sls/',\n                'binding': OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT\n            },\n            'NameIDFormat': OneLogin_Saml2_Constants.NAMEID_EMAIL_ADDRESS,\n            'x509cert': '', # Your SP public certificate\n            'privateKey': '' # Your SP private key\n        },\n        'idp': {\n            'entityId': 'http://idp.example.com/saml/metadata/',\n            'singleSignOnService': {\n                'url': 'http://idp.example.com/saml/sso/',\n                'binding': OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT\n            },\n            'singleLogoutService': {\n                'url': 'http://idp.example.com/saml/slo/',\n                'binding': OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT\n            },\n            'x509cert': '' # IdP public certificate\n        }\n    }\n\ntry:\n    # Initialize SAML toolkit with request data and settings\n    auth = OneLogin_Saml2_Auth(dummy_request_data, settings_data)\n\n    # Example 1: Get the SSO URL to redirect the user for login\n    sso_url = auth.get_sso_url()\n    print(f\"\\nSAML Auth initialized. SSO URL for IdP: {sso_url}\")\n\n    # Example 2: Get SP metadata (typically exposed at a /saml/metadata URL)\n    settings = OneLogin_Saml2_Settings(settings_data)\n    sp_metadata = settings.get_sp_metadata()\n    print(\"\\nGenerated SP Metadata (truncated to 500 chars):\\n\" + sp_metadata[:500] + \"...\")\n\n    # In a real scenario, you'd handle SAML responses like this:\n    # if 'SAMLResponse' in dummy_request_data['post_data']:\n    #     auth.process_response()\n    #     if not auth.is_authenticated():\n    #         print(f\"Authentication failed: {auth.get_errors()}\")\n    #     else:\n    #         print(f\"User authenticated: {auth.get_nameid()}\")\n\nexcept Exception as e:\n    print(f\"Error during SAML initialization or operation: {e}\")","lang":"python","description":"This quickstart demonstrates how to initialize the `OneLogin_Saml2_Auth` object with example settings and dummy request data. It shows how to obtain the Single Sign-On (SSO) URL for initiating an authentication flow and how to generate Service Provider (SP) metadata. For production, SAML settings must be securely loaded and contain valid certificate data and endpoint URLs for both the SP and the IdP.","tag":null,"tag_description":null,"last_tested":"2026-04-24","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-20","installed_version":"1.16.0","pypi_latest":"1.16.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.3,"avg_import_s":0.23,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.17,"mem_mb":8.2,"disk_size":"42.5M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":8.2,"disk_size":"42.5M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.12,"mem_mb":8.2,"disk_size":"43M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":8.2,"disk_size":"43M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.28,"mem_mb":8.2,"disk_size":"44.4M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.38,"mem_mb":8.2,"disk_size":"44.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.3,"import_time_s":0.25,"mem_mb":8.2,"disk_size":"45M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.31,"mem_mb":8.2,"disk_size":"45M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.23,"mem_mb":8,"disk_size":"36.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":8,"disk_size":"36.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.23,"mem_mb":8,"disk_size":"37M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.3,"mem_mb":8,"disk_size":"37M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.22,"mem_mb":8.3,"disk_size":"36.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":8.3,"disk_size":"36.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.22,"mem_mb":8.3,"disk_size":"37M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":8.3,"disk_size":"36M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.17,"mem_mb":8.1,"disk_size":"42.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.29,"mem_mb":8.1,"disk_size":"42.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.14,"mem_mb":8.2,"disk_size":"42M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"python3-saml","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.2,"disk_size":"42M"}]}}