Package: fastapi-cognito
FastAPI - CognitoFastAPI package that ease usage of AWS Cognito Auth.
This package provides basic functions/tools which helps developers to use
Cognito JWT.RequirementsPython >=3.8FastAPIAWS Cognito ServiceHow to installPip Commandpip install fastapi-cognitoHow to useThis is the simple example of how to use this package:Create appfromfastapiimportFastAPIapp=FastAPI()All mandatory fields are added in CognitoSettings
BaseSettings object. Settings can be added in different ways.
You can provide all required settings in.yamlor.jsonfiles,
or your global BaseSettings file. Note that userpools field is Dict,FIRSTuser pool in a dict will be set as default automatically if
userpool_name is not provided in CognitoAuth object.
All fields shown in example below, are also required in .json or .yaml file
(with syntax matching those files.)You should also import BaseSettings from pydantic if you are going to use global BaseSettings object.Provide settings that are mandatory for CognitoAuth to work. You can provide
one or more userpools.app_client_idfield for userpool besides string, can contain multiple string values provided within
list, tuple or setfrompydantic_settingsimportBaseSettingsfrompydantic.typesimportAnyclassSettings(BaseSettings):check_expiration:bool=Truejwt_header_prefix:str="Bearer"jwt_header_name:str="Authorization"userpools:dict[str,dict[str,Any]]={"eu":{"region":"USERPOOL_REGION","userpool_id":"USERPOOL_ID","app_client_id":["APP_CLIENT_ID_1","APP_CLIENT_ID_2"]# Example with multiple ids},"us":{"region":"USERPOOL_REGION","userpool_id":"USERPOOL_ID","app_client_id":"APP_CLIENT_ID"},...}settings=Settings()This example below shows how global BaseSettings object can be mapped to
CognitoSettings and passed as param to CognitoAuth.
If we were using .yaml or .json, we should call.from_yaml(filename)or.from_json(filename)methods on CognitoSettings object.Instantiate CognitoAuth and pass previously created settings as settings param.fromfastapi_cognitoimportCognitoAuth,CognitoSettings# default userpool(eu) will be used if there is no userpool_name param provided.cognito_eu=CognitoAuth(settings=CognitoSettings.from_global_settings(settings))cognito_us=CognitoAuth(settings=CognitoSettings.from_global_settings(settings),userpool_name="us")This is a simple endpoint that is protected by Cognito, it uses FastAPI
dependency injection to resolve all required operations and get Cognito JWT.
It can be used later to add more security to endpoints and to get required
data about user which token belongs to.fromfastapi_cognitoimportCognitoTokenfromfastapiimportDepends@app.get("/")defhello_world(auth:CognitoToken=Depends(cognito_eu.auth_required)):return{"message":"Hello world"}Optional authenticationIf authentication should be optional, we can usecognito_eu.auth_optionalExample:fromfastapi_cognitoimportCognitoTokenfromfastapiimportDepends@app.get("/")defhello_world(auth:CognitoToken=Depends(cognito_eu.auth_optional)):return{"message":"Hello world"}Custom Token ModelIn case your token payload contains additional values, you can provide custom
token model instead ofCognitoToken. If there is no custom token model
provided,CognitoTokenwill be set as a default model. Custom model should
be provided toCognitoAuthobject.Example:classCustomTokenModel(CognitoToken):custom_value:Optional[str]=Nonecognito=CognitoAuth(settings=CognitoSettings.from_global_settings(settings),# Here we provide custom token modelcustom_model=CustomTokenModel)@app.get("/")defhello_world(auth:CustomTokenModel=Depends(cognito.auth_required)):return{"message":f"Hello{auth.custom_value}"}