supertokens_python API documentation
Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.
This software is licensed under the Apache License, Version 2.0 (the
"License") as published by the Apache Software Foundation.
You may not use this file except in compliance with the License. You may
obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
from typing import List, Optional from typing_extensions import Literal from supertokens_python.recipe_module import RecipeModule from supertokens_python.types import RecipeUserId from .plugins import LoadPluginsResponse from .supertokens import ( AppInfo, InputAppInfo, RecipeInit, Supertokens, SupertokensConfig, SupertokensExperimentalConfig, SupertokensInputConfig, SupertokensPublicConfig, get_request_from_user_context, is_recipe_initialized, )
Some Pydantic models need a rebuild to resolve ForwardRefs
Referencing imports here to prevent lint errors.
Caveat: These will be available for import from this module directly.
RecipeModule # type: ignore
LoadPluginsResponse -> SupertokensPublicConfig
LoadPluginsResponse.model_rebuild()
SupertokensInputConfig -> RecipeModule
SupertokensInputConfig.model_rebuild()
def init( app_info: InputAppInfo, framework: Literal["fastapi", "flask", "django"], supertokens_config: SupertokensConfig, recipe_list: List[RecipeInit], mode: Optional[Literal["asgi", "wsgi"]] = None, telemetry: Optional[bool] = None, debug: Optional[bool] = None, experimental: Optional[SupertokensExperimentalConfig] = None, ): return Supertokens.init( app_info, framework, supertokens_config, recipe_list, mode, telemetry, debug, experimental=experimental, )
def get_all_cors_headers() -> List[str]: return Supertokens.get_instance().get_all_cors_headers()
def convert_to_recipe_user_id(user_id: str) -> RecipeUserId: return RecipeUserId(user_id)
all = [ "AppInfo", "InputAppInfo", "RecipeInit", "RecipeUserId", "Supertokens", "SupertokensConfig", "SupertokensExperimentalConfig", "SupertokensPublicConfig", "convert_to_recipe_user_id", "get_all_cors_headers", "get_request_from_user_context", "init", "is_recipe_initialized", ]
class AppInfo: def init(self, app_name: str, api_domain: str, website_domain: Optional[str], framework: Literal["fastapi", "flask", "django"], api_gateway_path: str, api_base_path: str, website_base_path: str, mode: Union[Literal["asgi", "wsgi"], None], origin: Optional[Union[str, Callable[[Optional[BaseRequest], Dict[str, Any]], str]]], ): self.app_name = app_name self.api_gateway_path = NormalisedURLPath(api_gateway_path) self.api_domain = NormalisedURLDomain(api_domain) self.top_level_api_domain = get_top_level_domain_for_same_site_resolution( self.api_domain.get_as_string_dangerous() ) if website_domain is None and origin is None: raise_general_exception( "Please provide at least one of website_domain or origin" ) self.__origin = origin self.__website_domain = website_domain self.api_base_path = self.api_gateway_path.append( NormalisedURLPath(api_base_path) ) self.website_base_path = NormalisedURLPath(website_base_path) if mode is not None: self.mode = mode elif framework == "fastapi": mode = "asgi" else: mode = "wsgi" self.framework = framework self.mode = mode
def get_top_level_website_domain( self, request: Optional[BaseRequest], user_context: UserContext ) -> str: return get_top_level_domain_for_same_site_resolution( self.get_origin(request, user_context).get_as_string_dangerous() )
def get_origin(self, request: Optional[BaseRequest], user_context: UserContext): origin = self.__origin if origin is None: origin = self.__website_domain
This should not be possible because we check for either origin or websiteDomain above
if origin is None:
raise_general_exception("should never come here")
if callable(origin): origin = origin(request, user_context)
return NormalisedURLDomain(origin)
def toJSON(self): def defaultImpl(o: Any): if isinstance(o, (NormalisedURLDomain, NormalisedURLPath)): return o.get_as_string_dangerous() return o.dict
return json.dumps(self, default=defaultImpl, sort_keys=True, indent=4)
class InputAppInfo: def init(self, app_name: str, api_domain: str, api_gateway_path: str = "", api_base_path: str = "/auth", website_base_path: str = "/auth", website_domain: Optional[str] = None, origin: Optional[Union[str, Callable[[Optional[BaseRequest], Dict[str, Any]], str]]] = None, ): self.app_name = app_name self.api_gateway_path = api_gateway_path self.api_domain = api_domain self.website_domain = website_domain self.origin = origin self.api_base_path = api_base_path self.website_base_path = website_base_path
class RecipeInit(Protocol): def call(self, app_info: AppInfo, plugins: List[OverrideMap]) -> RecipeModule: ...
class RecipeUserId: def init(self, recipe_user_id: str): self.recipe_user_id = recipe_user_id
def get_as_string(self) -> str: return self.recipe_user_id
def eq(self, other: Any) -> bool: if isinstance(other, RecipeUserId): return self.recipe_user_id == other.recipe_user_id return False
class Supertokens: __instance: Optional[Supertokens] = None
recipe_modules: List[RecipeModule]
app_info: AppInfo
supertokens_config: SupertokensConfig
_telemetry_status: str
telemetry: bool
def init( self, app_info: InputAppInfo, framework: Literal["fastapi", "flask", "django"], supertokens_config: SupertokensConfig, recipe_list: List[RecipeInit], mode: Optional[Literal["asgi", "wsgi"]], telemetry: Optional[bool], debug: Optional[bool], experimental: Optional[SupertokensExperimentalConfig] = None, ): if not isinstance(app_info, InputAppInfo): # type: ignore raise ValueError("app_info must be an instance of InputAppInfo")
self.app_info = AppInfo( app_info.app_name, app_info.api_domain, app_info.website_domain, framework, app_info.api_gateway_path, app_info.api_base_path, app_info.website_base_path, mode, app_info.origin, )
input_config = SupertokensInputConfig( app_info=app_info, framework=framework, supertokens_config=supertokens_config, recipe_list=recipe_list, mode=mode, telemetry=telemetry, debug=debug, experimental=experimental, )
self.recipe_modules: List[RecipeModule] = list(map(make_recipe, recipe_list))
if not account_linking_found: from supertokens_python.recipe.accountlinking.recipe import ( AccountLinkingRecipe, )
self.recipe_modules.append( AccountLinkingRecipe.init()(self.app_info, override_maps) )
if not jwt_found: from supertokens_python.recipe.jwt.recipe import JWTRecipe
self.recipe_modules.append(JWTRecipe.init()(self.app_info, override_maps))
if not openid_found: from supertokens_python.recipe.openid.recipe import OpenIdRecipe
self.recipe_modules.append( OpenIdRecipe.init()(self.app_info, override_maps) )
if not multitenancy_found: from supertokens_python.recipe.multitenancy.recipe import MultitenancyRecipe
self.recipe_modules.append( MultitenancyRecipe.init()(self.app_info, override_maps) )
if not user_metadata_found: from supertokens_python.recipe.usermetadata.recipe import UserMetadataRecipe
self.recipe_modules.append( UserMetadataRecipe.init()(self.app_info, override_maps) )
if not oauth2_found: from supertokens_python.recipe.oauth2provider.recipe import ( OAuth2ProviderRecipe, )
self.recipe_modules.append( OAuth2ProviderRecipe.init()(self.app_info, override_maps) )
class SupertokensConfig:
def init(self,
connection_uri: str,
api_key: Union[str, None] = None,
network_interceptor: Optional[
Callable[
[
str,
str,
Dict[str, Any],
Optional[Dict[str, Any]],
Optional[Dict[str, Any]],
Optional[Dict[str, Any]],
],
Tuple[
str,
str,
Dict[str, Any],
Optional[Dict[str, Any]],
],
]
] = None,
disable_core_call_cache: bool = False,
):
self.connection_uri = connection_uri
self.api_key = api_key
self.network_interceptor = network_interceptor
self.disable_core_call_cache = disable_core_call_cache
class SupertokensExperimentalConfig(CamelCaseBaseModel): plugins: Optional[List["SuperTokensPlugin"]] = None
class SupertokensPublicConfig(_BaseSupertokensPublicConfig):
"""
Public properties received as input to the Supertokens.init function.
"""
pass