scalekit-sdk-python 2.15.0__tar.gz → 2.17.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/PKG-INFO +91 -2
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/README.md +82 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/_version.py +1 -1
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/auth.py +2 -3
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/client.py +2 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/core.py +1 -1
- scalekit_sdk_python-2.17.0/scalekit/events.py +58 -0
- scalekit_sdk_python-2.17.0/scalekit/frameworks/django.py +369 -0
- scalekit_sdk_python-2.17.0/scalekit/frameworks/fastapi.py +386 -0
- scalekit_sdk_python-2.17.0/scalekit/frameworks/flask.py +368 -0
- scalekit_sdk_python-2.17.0/scalekit/middleware/csrf_state.py +57 -0
- scalekit_sdk_python-2.17.0/scalekit/middleware/protocol.py +56 -0
- scalekit_sdk_python-2.17.0/scalekit/middleware/session_crypto.py +126 -0
- scalekit_sdk_python-2.17.0/scalekit/middleware/session_manager.py +242 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/auth_pb2.py +26 -18
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/auth_pb2.pyi +10 -2
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/auth_pb2_grpc.py +3 -3
- scalekit_sdk_python-2.17.0/scalekit/v1/webhooks/__init__.py +0 -0
- scalekit_sdk_python-2.17.0/scalekit/v1/workspaces/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit_sdk_python.egg-info/PKG-INFO +91 -2
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit_sdk_python.egg-info/SOURCES.txt +18 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit_sdk_python.egg-info/requires.txt +10 -1
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/setup.py +9 -1
- scalekit_sdk_python-2.17.0/tests/test_events.py +21 -0
- scalekit_sdk_python-2.17.0/tests/test_login.py +14 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_csrf_state.py +47 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_django.py +428 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_fastapi.py +434 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_flask.py +557 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_session_crypto.py +86 -0
- scalekit_sdk_python-2.17.0/tests/test_middleware_session_manager.py +303 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/LICENSE +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/buf/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/buf/validate/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/buf/validate/validate_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/buf/validate/validate_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/buf/validate/validate_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/pyproject.toml +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/actions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/google_adk.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/langchain.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/types/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/frameworks/util.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/custom_provider.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/mcp_config.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/mcp_connection_auth_state.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/mcp_instance.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/create_connected_account_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/create_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/delete_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/list_providers_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/mcp_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/tool_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/requests/update_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/create_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/create_mcp_session_token_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/delete_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/list_mcp_connected_accounts_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/list_providers_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/magic_link_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/update_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/responses/verify_connected_account_user_response.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/tool_input_output.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/models/tool_mapping.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/modifier.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/actions/types.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/common/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/common/exceptions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/common/scalekit.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/common/user.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/connected_accounts.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/connection.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/constants/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/constants/user.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/directory.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/domain.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/utils → scalekit_sdk_python-2.17.0/scalekit/frameworks}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/m2m_client.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/mcp.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1 → scalekit_sdk_python-2.17.0/scalekit/middleware}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/organization.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/passwordless.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/permissions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/providers.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/role.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/sessions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/token.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/tools.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/users.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/agentkit_logs → scalekit_sdk_python-2.17.0/scalekit/utils}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/utils/directory.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/auditlogs → scalekit_sdk_python-2.17.0/scalekit/v1}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/auth → scalekit_sdk_python-2.17.0/scalekit/v1/agentkit_logs}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/clients → scalekit_sdk_python-2.17.0/scalekit/v1/auditlogs}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/commons → scalekit_sdk_python-2.17.0/scalekit/v1/auth}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/passwordless_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/totp_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/totp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/webauthn_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/connected_accounts → scalekit_sdk_python-2.17.0/scalekit/v1/clients}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/clients/clients_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/clients/clients_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/connections → scalekit_sdk_python-2.17.0/scalekit/v1/commons}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/commons/commons_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/commons/commons_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/directories → scalekit_sdk_python-2.17.0/scalekit/v1/connected_accounts}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/domains → scalekit_sdk_python-2.17.0/scalekit/v1/connections}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connections/connections_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connections/connections_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/emails → scalekit_sdk_python-2.17.0/scalekit/v1/directories}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/directories/directories_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/directories/directories_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/environments → scalekit_sdk_python-2.17.0/scalekit/v1/domains}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/domains/domains_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/domains/domains_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/errdetails → scalekit_sdk_python-2.17.0/scalekit/v1/emails}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/emails/emails_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/emails/emails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/events → scalekit_sdk_python-2.17.0/scalekit/v1/environments}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/environments/environments_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/environments/environments_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/gateway → scalekit_sdk_python-2.17.0/scalekit/v1/errdetails}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/interceptors → scalekit_sdk_python-2.17.0/scalekit/v1/events}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/events/events_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/events/events_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/events/events_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/keys → scalekit_sdk_python-2.17.0/scalekit/v1/gateway}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/gateway/gateway_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/gateway/gateway_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/gateway/gateway_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/mcp → scalekit_sdk_python-2.17.0/scalekit/v1/interceptors}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/members → scalekit_sdk_python-2.17.0/scalekit/v1/keys}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/keys/keys_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/keys/keys_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/keys/keys_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/migrations → scalekit_sdk_python-2.17.0/scalekit/v1/mcp}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/mcp/mcp_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/options → scalekit_sdk_python-2.17.0/scalekit/v1/members}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/members/members_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/members/members_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/members/members_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/organizations → scalekit_sdk_python-2.17.0/scalekit/v1/migrations}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/migrations/migrations_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/migrations/migrations_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/migrations/migrations_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/providers → scalekit_sdk_python-2.17.0/scalekit/v1/options}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/options/options_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/options/options_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/options/options_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/roles → scalekit_sdk_python-2.17.0/scalekit/v1/organizations}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/organizations/organizations_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/secrets → scalekit_sdk_python-2.17.0/scalekit/v1/providers}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/providers/providers_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/providers/providers_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/sessions → scalekit_sdk_python-2.17.0/scalekit/v1/roles}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/roles/roles_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/roles/roles_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/tokens → scalekit_sdk_python-2.17.0/scalekit/v1/secrets}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/secrets/secrets_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/tools → scalekit_sdk_python-2.17.0/scalekit/v1/sessions}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/sessions/sessions_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/user_attributes → scalekit_sdk_python-2.17.0/scalekit/v1/tokens}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tokens/tokens_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/users → scalekit_sdk_python-2.17.0/scalekit/v1/tools}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tools/tools_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tools/tools_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/tools/tools_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/webhooks → scalekit_sdk_python-2.17.0/scalekit/v1/user_attributes}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0/scalekit/v1/workspaces → scalekit_sdk_python-2.17.0/scalekit/v1/users}/__init__.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/users/users_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/users/users_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/users/users_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/workspaces/workspaces_pb2.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/workspaces/workspaces_pb2.pyi +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit/webauthn.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/setup.cfg +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_actions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_connected_accounts.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_connection.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_directory.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_domain.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_m2m_client.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_mcp.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_org_roles.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_organization.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_organization_session_policy.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_organization_slug_logo.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_passwordless.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_permissions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_providers.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_role_defaults_dependent.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_roles.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_sessions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_sk819_retry_behavior.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_tokens.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_tools.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_user_roles_permissions.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_users.py +0 -0
- {scalekit_sdk_python-2.15.0 → scalekit_sdk_python-2.17.0}/tests/test_webauthn_credentials.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scalekit-sdk-python
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.17.0
|
|
4
4
|
Summary: Scalekit official Python SDK
|
|
5
5
|
Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
|
|
6
6
|
Author: Team Scalekit
|
|
@@ -17,7 +17,7 @@ Requires-Dist: google>=3.0
|
|
|
17
17
|
Requires-Dist: requests>=2.34.0
|
|
18
18
|
Requires-Dist: PyJWT>=2.13.0
|
|
19
19
|
Requires-Dist: cffi>=1.15.1
|
|
20
|
-
Requires-Dist: cryptography
|
|
20
|
+
Requires-Dist: cryptography>=50.0.0
|
|
21
21
|
Requires-Dist: setuptools<83.0,>=82.0.1
|
|
22
22
|
Requires-Dist: grpcio-status<2.0,>=1.81.0
|
|
23
23
|
Requires-Dist: protoc-gen-openapiv2>=0.0.1
|
|
@@ -27,6 +27,12 @@ Requires-Dist: python-dotenv<2.0,>=1.2.2
|
|
|
27
27
|
Requires-Dist: Faker<41.0,>=33.0.0
|
|
28
28
|
Requires-Dist: pydantic>=2.13.4
|
|
29
29
|
Requires-Dist: mcp>=1.27.2
|
|
30
|
+
Provides-Extra: flask
|
|
31
|
+
Requires-Dist: flask>=2.0; extra == "flask"
|
|
32
|
+
Provides-Extra: fastapi
|
|
33
|
+
Requires-Dist: fastapi>=0.100; extra == "fastapi"
|
|
34
|
+
Provides-Extra: django
|
|
35
|
+
Requires-Dist: django>=4.2; extra == "django"
|
|
30
36
|
Dynamic: author
|
|
31
37
|
Dynamic: author-email
|
|
32
38
|
Dynamic: classifier
|
|
@@ -35,6 +41,7 @@ Dynamic: description-content-type
|
|
|
35
41
|
Dynamic: home-page
|
|
36
42
|
Dynamic: license
|
|
37
43
|
Dynamic: license-file
|
|
44
|
+
Dynamic: provides-extra
|
|
38
45
|
Dynamic: requires-dist
|
|
39
46
|
Dynamic: summary
|
|
40
47
|
|
|
@@ -178,6 +185,88 @@ Explore fully functional sample applications built with popular Python framework
|
|
|
178
185
|
|-----------|------------|-------------|
|
|
179
186
|
| **FastAPI** | [scalekit-fastapi-example](https://github.com/scalekit-developers/scalekit-fastapi-example) | Modern async Python API framework |
|
|
180
187
|
|
|
188
|
+
### Full Stack Auth — encrypted-session middleware for Flask, FastAPI, and Django
|
|
189
|
+
|
|
190
|
+
The example above is for **Modular SSO**: Scalekit brokers the OAuth exchange with your customer's own IdP via a `connection_id`, and your app owns its own session however it likes.
|
|
191
|
+
|
|
192
|
+
If instead Scalekit hosts your login UI and you want it to also manage the session lifecycle for you (**Full Stack Auth**), `scalekit-sdk-python` ships optional Flask, FastAPI, and Django extras that handle the encrypted session cookie, transparent token refresh, CSRF-safe login/callback, and full logout for you — no hand-rolled cookies, no manual refresh timing.
|
|
193
|
+
|
|
194
|
+
Register these under **Dashboard → Authentication → Redirects** before testing:
|
|
195
|
+
- **Redirect URI** — your `redirect_uri` (the `/callback` path). Scalekit rejects the exchange if this doesn't match exactly.
|
|
196
|
+
- **Post Logout Redirect URI** — where users land after full logout. A relative path gets auto-absolutized against the request host, but the resulting absolute URL must still be registered.
|
|
197
|
+
- **Initiate Login URL** — your `/login` path. Scalekit redirects here (not `/callback`) for a bookmarked login page, an IdP portal tile, or an invite/magic link — the login view already handles this correctly, including the `idp_initiated_login` case, with no extra code required.
|
|
198
|
+
|
|
199
|
+
pip install "scalekit-sdk-python[flask]" # or "scalekit-sdk-python[fastapi]" or "scalekit-sdk-python[django]"
|
|
200
|
+
|
|
201
|
+
```python
|
|
202
|
+
# Flask
|
|
203
|
+
import os
|
|
204
|
+
from flask import Flask
|
|
205
|
+
from scalekit.frameworks.flask import ScalekitAuth
|
|
206
|
+
|
|
207
|
+
app = Flask(__name__)
|
|
208
|
+
auth = ScalekitAuth(
|
|
209
|
+
app,
|
|
210
|
+
env_url=os.environ["SCALEKIT_ENV_URL"],
|
|
211
|
+
client_id=os.environ["SCALEKIT_CLIENT_ID"],
|
|
212
|
+
client_secret=os.environ["SCALEKIT_CLIENT_SECRET"],
|
|
213
|
+
redirect_uri="https://myapp.com/callback",
|
|
214
|
+
cookie_encryption_secret=os.environ["COOKIE_ENCRYPTION_SECRET"], # openssl rand -base64 32
|
|
215
|
+
) # registers /login, /callback, /logout
|
|
216
|
+
|
|
217
|
+
@app.route("/account")
|
|
218
|
+
@auth.requires_auth
|
|
219
|
+
def account():
|
|
220
|
+
return {"email": auth.current_user["email"]}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
# FastAPI -- protect routes with Depends(), FastAPI's idiomatic mechanism
|
|
225
|
+
import os
|
|
226
|
+
from fastapi import Depends, FastAPI
|
|
227
|
+
from scalekit.frameworks.fastapi import ScalekitAuth
|
|
228
|
+
|
|
229
|
+
app = FastAPI()
|
|
230
|
+
auth = ScalekitAuth(
|
|
231
|
+
env_url=os.environ["SCALEKIT_ENV_URL"],
|
|
232
|
+
client_id=os.environ["SCALEKIT_CLIENT_ID"],
|
|
233
|
+
client_secret=os.environ["SCALEKIT_CLIENT_SECRET"],
|
|
234
|
+
redirect_uri="https://myapp.com/callback",
|
|
235
|
+
cookie_encryption_secret=os.environ["COOKIE_ENCRYPTION_SECRET"],
|
|
236
|
+
)
|
|
237
|
+
auth.install(app) # registers /login, /callback, /logout
|
|
238
|
+
|
|
239
|
+
@app.get("/account")
|
|
240
|
+
async def account(user: dict = Depends(auth.requires_auth)):
|
|
241
|
+
return {"email": user["email"]}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
# Django -- settings.py
|
|
246
|
+
import os
|
|
247
|
+
|
|
248
|
+
MIDDLEWARE = [..., "scalekit.frameworks.django.ScalekitAuthMiddleware"]
|
|
249
|
+
SCALEKIT_ENV_URL = os.environ["SCALEKIT_ENV_URL"]
|
|
250
|
+
SCALEKIT_CLIENT_ID = os.environ["SCALEKIT_CLIENT_ID"]
|
|
251
|
+
SCALEKIT_CLIENT_SECRET = os.environ["SCALEKIT_CLIENT_SECRET"]
|
|
252
|
+
SCALEKIT_REDIRECT_URI = "https://myapp.com/callback"
|
|
253
|
+
SCALEKIT_COOKIE_ENCRYPTION_SECRET = os.environ["COOKIE_ENCRYPTION_SECRET"]
|
|
254
|
+
|
|
255
|
+
# urls.py
|
|
256
|
+
from django.urls import include, path
|
|
257
|
+
urlpatterns = [path("", include("scalekit.frameworks.django")), ...] # /login, /callback, /logout
|
|
258
|
+
|
|
259
|
+
# views.py
|
|
260
|
+
from django.http import JsonResponse
|
|
261
|
+
from scalekit.frameworks.django import login_required
|
|
262
|
+
|
|
263
|
+
@login_required
|
|
264
|
+
def account(request):
|
|
265
|
+
return JsonResponse(request.scalekit_user)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
See [`examples/flask`](./examples/flask), [`examples/fastapi`](./examples/fastapi), and [`examples/django`](./examples/django) for complete, runnable versions. For a fuller production-oriented sample app, see the framework repos above.
|
|
269
|
+
|
|
181
270
|
## 🔗 Helpful Links
|
|
182
271
|
|
|
183
272
|
### 📖 Quickstart Guides
|
|
@@ -138,6 +138,88 @@ Explore fully functional sample applications built with popular Python framework
|
|
|
138
138
|
|-----------|------------|-------------|
|
|
139
139
|
| **FastAPI** | [scalekit-fastapi-example](https://github.com/scalekit-developers/scalekit-fastapi-example) | Modern async Python API framework |
|
|
140
140
|
|
|
141
|
+
### Full Stack Auth — encrypted-session middleware for Flask, FastAPI, and Django
|
|
142
|
+
|
|
143
|
+
The example above is for **Modular SSO**: Scalekit brokers the OAuth exchange with your customer's own IdP via a `connection_id`, and your app owns its own session however it likes.
|
|
144
|
+
|
|
145
|
+
If instead Scalekit hosts your login UI and you want it to also manage the session lifecycle for you (**Full Stack Auth**), `scalekit-sdk-python` ships optional Flask, FastAPI, and Django extras that handle the encrypted session cookie, transparent token refresh, CSRF-safe login/callback, and full logout for you — no hand-rolled cookies, no manual refresh timing.
|
|
146
|
+
|
|
147
|
+
Register these under **Dashboard → Authentication → Redirects** before testing:
|
|
148
|
+
- **Redirect URI** — your `redirect_uri` (the `/callback` path). Scalekit rejects the exchange if this doesn't match exactly.
|
|
149
|
+
- **Post Logout Redirect URI** — where users land after full logout. A relative path gets auto-absolutized against the request host, but the resulting absolute URL must still be registered.
|
|
150
|
+
- **Initiate Login URL** — your `/login` path. Scalekit redirects here (not `/callback`) for a bookmarked login page, an IdP portal tile, or an invite/magic link — the login view already handles this correctly, including the `idp_initiated_login` case, with no extra code required.
|
|
151
|
+
|
|
152
|
+
pip install "scalekit-sdk-python[flask]" # or "scalekit-sdk-python[fastapi]" or "scalekit-sdk-python[django]"
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
# Flask
|
|
156
|
+
import os
|
|
157
|
+
from flask import Flask
|
|
158
|
+
from scalekit.frameworks.flask import ScalekitAuth
|
|
159
|
+
|
|
160
|
+
app = Flask(__name__)
|
|
161
|
+
auth = ScalekitAuth(
|
|
162
|
+
app,
|
|
163
|
+
env_url=os.environ["SCALEKIT_ENV_URL"],
|
|
164
|
+
client_id=os.environ["SCALEKIT_CLIENT_ID"],
|
|
165
|
+
client_secret=os.environ["SCALEKIT_CLIENT_SECRET"],
|
|
166
|
+
redirect_uri="https://myapp.com/callback",
|
|
167
|
+
cookie_encryption_secret=os.environ["COOKIE_ENCRYPTION_SECRET"], # openssl rand -base64 32
|
|
168
|
+
) # registers /login, /callback, /logout
|
|
169
|
+
|
|
170
|
+
@app.route("/account")
|
|
171
|
+
@auth.requires_auth
|
|
172
|
+
def account():
|
|
173
|
+
return {"email": auth.current_user["email"]}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
# FastAPI -- protect routes with Depends(), FastAPI's idiomatic mechanism
|
|
178
|
+
import os
|
|
179
|
+
from fastapi import Depends, FastAPI
|
|
180
|
+
from scalekit.frameworks.fastapi import ScalekitAuth
|
|
181
|
+
|
|
182
|
+
app = FastAPI()
|
|
183
|
+
auth = ScalekitAuth(
|
|
184
|
+
env_url=os.environ["SCALEKIT_ENV_URL"],
|
|
185
|
+
client_id=os.environ["SCALEKIT_CLIENT_ID"],
|
|
186
|
+
client_secret=os.environ["SCALEKIT_CLIENT_SECRET"],
|
|
187
|
+
redirect_uri="https://myapp.com/callback",
|
|
188
|
+
cookie_encryption_secret=os.environ["COOKIE_ENCRYPTION_SECRET"],
|
|
189
|
+
)
|
|
190
|
+
auth.install(app) # registers /login, /callback, /logout
|
|
191
|
+
|
|
192
|
+
@app.get("/account")
|
|
193
|
+
async def account(user: dict = Depends(auth.requires_auth)):
|
|
194
|
+
return {"email": user["email"]}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
# Django -- settings.py
|
|
199
|
+
import os
|
|
200
|
+
|
|
201
|
+
MIDDLEWARE = [..., "scalekit.frameworks.django.ScalekitAuthMiddleware"]
|
|
202
|
+
SCALEKIT_ENV_URL = os.environ["SCALEKIT_ENV_URL"]
|
|
203
|
+
SCALEKIT_CLIENT_ID = os.environ["SCALEKIT_CLIENT_ID"]
|
|
204
|
+
SCALEKIT_CLIENT_SECRET = os.environ["SCALEKIT_CLIENT_SECRET"]
|
|
205
|
+
SCALEKIT_REDIRECT_URI = "https://myapp.com/callback"
|
|
206
|
+
SCALEKIT_COOKIE_ENCRYPTION_SECRET = os.environ["COOKIE_ENCRYPTION_SECRET"]
|
|
207
|
+
|
|
208
|
+
# urls.py
|
|
209
|
+
from django.urls import include, path
|
|
210
|
+
urlpatterns = [path("", include("scalekit.frameworks.django")), ...] # /login, /callback, /logout
|
|
211
|
+
|
|
212
|
+
# views.py
|
|
213
|
+
from django.http import JsonResponse
|
|
214
|
+
from scalekit.frameworks.django import login_required
|
|
215
|
+
|
|
216
|
+
@login_required
|
|
217
|
+
def account(request):
|
|
218
|
+
return JsonResponse(request.scalekit_user)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
See [`examples/flask`](./examples/flask), [`examples/fastapi`](./examples/fastapi), and [`examples/django`](./examples/django) for complete, runnable versions. For a fuller production-oriented sample app, see the framework repos above.
|
|
222
|
+
|
|
141
223
|
## 🔗 Helpful Links
|
|
142
224
|
|
|
143
225
|
### 📖 Quickstart Guides
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from typing import Optional, Dict, Any, Mapping
|
|
2
2
|
from google.protobuf.json_format import ParseDict
|
|
3
|
-
from google.protobuf.empty_pb2 import Empty
|
|
4
3
|
|
|
5
4
|
from scalekit.core import CoreClient
|
|
6
5
|
from scalekit.v1.auth import auth_pb2
|
|
@@ -29,7 +28,7 @@ class AuthClient:
|
|
|
29
28
|
connection_id: str,
|
|
30
29
|
login_request_id: str,
|
|
31
30
|
user: Optional[Mapping[str, Any]] = None,
|
|
32
|
-
) ->
|
|
31
|
+
) -> auth_pb2.UpdateLoginUserDetailsResponse:
|
|
33
32
|
"""
|
|
34
33
|
Method to update user details for a login request
|
|
35
34
|
|
|
@@ -55,7 +54,7 @@ class AuthClient:
|
|
|
55
54
|
:type : ``` dict ```
|
|
56
55
|
|
|
57
56
|
:returns:
|
|
58
|
-
Tuple of (
|
|
57
|
+
Tuple of (UpdateLoginUserDetailsResponse carrying auth_request_id, grpc.Call metadata)
|
|
59
58
|
"""
|
|
60
59
|
|
|
61
60
|
user_data: Dict[str, Any] = {}
|
|
@@ -26,6 +26,7 @@ from scalekit.passwordless import PasswordlessClient
|
|
|
26
26
|
from scalekit.mcp import McpClient
|
|
27
27
|
from scalekit.sessions import SessionsClient
|
|
28
28
|
from scalekit.auth import AuthClient
|
|
29
|
+
from scalekit.events import EventsClient
|
|
29
30
|
from scalekit.webauthn import WebAuthnClient
|
|
30
31
|
from scalekit.token import TokenClient
|
|
31
32
|
from scalekit.common.scalekit import (
|
|
@@ -83,6 +84,7 @@ class ScalekitClient:
|
|
|
83
84
|
self.passwordless = PasswordlessClient(self.core_client)
|
|
84
85
|
self.sessions = SessionsClient(self.core_client)
|
|
85
86
|
self.auth = AuthClient(self.core_client)
|
|
87
|
+
self.events = EventsClient(self.core_client)
|
|
86
88
|
self.webauthn = WebAuthnClient(self.core_client)
|
|
87
89
|
self.tokens = TokenClient(self.core_client)
|
|
88
90
|
except Exception:
|
|
@@ -29,7 +29,7 @@ class CoreClient:
|
|
|
29
29
|
|
|
30
30
|
sdk_version = f"Scalekit-Python/{_sdk_version}"
|
|
31
31
|
# YYYYMMDD
|
|
32
|
-
api_version = "
|
|
32
|
+
api_version = "20260727"
|
|
33
33
|
user_agent = f"{sdk_version} Python/{platform.python_version()} ({platform.system()}; {platform.architecture()}"
|
|
34
34
|
|
|
35
35
|
def __init__(self, env_url, client_id, client_secret):
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from scalekit.core import CoreClient
|
|
4
|
+
from scalekit.v1.events.events_pb2 import (
|
|
5
|
+
EventFilter,
|
|
6
|
+
ListEventsPaginatedRequest,
|
|
7
|
+
ListEventsPaginatedResponse,
|
|
8
|
+
)
|
|
9
|
+
from scalekit.v1.events.events_pb2_grpc import EventsServiceStub
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class EventsClient:
|
|
13
|
+
"""Class definition for Events Client"""
|
|
14
|
+
|
|
15
|
+
def __init__(self, core_client: CoreClient):
|
|
16
|
+
"""
|
|
17
|
+
Initializer for Events Client
|
|
18
|
+
|
|
19
|
+
:param core_client : CoreClient Object
|
|
20
|
+
:type : ``` obj ```
|
|
21
|
+
:returns
|
|
22
|
+
None
|
|
23
|
+
"""
|
|
24
|
+
self.core_client = core_client
|
|
25
|
+
self.events_service = EventsServiceStub(
|
|
26
|
+
self.core_client.grpc_secure_channel
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def list_events_paginated(
|
|
30
|
+
self,
|
|
31
|
+
page_size: Optional[int] = None,
|
|
32
|
+
page_token: Optional[str] = None,
|
|
33
|
+
filter: Optional[EventFilter] = None, # noqa: A002
|
|
34
|
+
) -> ListEventsPaginatedResponse:
|
|
35
|
+
"""
|
|
36
|
+
Method to list events with pagination
|
|
37
|
+
|
|
38
|
+
:param page_size : page size for events list fetch (optional, uses server default if not provided)
|
|
39
|
+
:type : ``` int ```
|
|
40
|
+
:param page_token : page token for events list fetch
|
|
41
|
+
:type : ``` str ```
|
|
42
|
+
:param filter : EventFilter object to filter events (optional)
|
|
43
|
+
:type : ``` obj ```
|
|
44
|
+
|
|
45
|
+
:returns:
|
|
46
|
+
List Events Paginated Response
|
|
47
|
+
"""
|
|
48
|
+
request = ListEventsPaginatedRequest()
|
|
49
|
+
if page_size is not None:
|
|
50
|
+
request.page_size = page_size
|
|
51
|
+
if page_token is not None:
|
|
52
|
+
request.page_token = page_token
|
|
53
|
+
if filter is not None:
|
|
54
|
+
request.filter.CopyFrom(filter)
|
|
55
|
+
return self.core_client.grpc_exec(
|
|
56
|
+
self.events_service.ListEventsPaginated.with_call,
|
|
57
|
+
request,
|
|
58
|
+
)
|