diff --git a/propelauth_fastapi/__init__.py b/propelauth_fastapi/__init__.py index f0d8a93..3af3303 100644 --- a/propelauth_fastapi/__init__.py +++ b/propelauth_fastapi/__init__.py @@ -261,12 +261,13 @@ def create_magic_link( self, email: str, redirect_to_url: Optional[str] = None, - expires_in_hours: Optional[str] = None, + expires_in_hours: Optional[int] = None, create_new_user_if_one_doesnt_exist: Optional[bool] = None, user_signup_query_parameters: Optional[Dict[str, Any]] = None, + expire_after_first_use: Optional[bool] = None ): return self.auth.create_magic_link( - email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters + email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters, expire_after_first_use ) def create_access_token(self, user_id: str, duration_in_minutes: int, active_org_id: Optional[str] = None): @@ -413,8 +414,8 @@ def create_api_key( ): return self.auth.create_api_key(org_id, user_id, expires_at_seconds, metadata) - def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None): - return self.auth.update_api_key(api_key_id, expires_at_seconds, metadata) + def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, set_to_never_expire: Optional[bool] = None): + return self.auth.update_api_key(api_key_id, expires_at_seconds, metadata, set_to_never_expire) def delete_api_key(self, api_key_id: str): return self.auth.delete_api_key(api_key_id) @@ -455,6 +456,80 @@ def verify_step_up_totp_challenge( def verify_step_up_grant(self, action_type: str, user_id: str, grant: str) -> bool: return self.auth.verify_step_up_grant(action_type, user_id, grant) + def fetch_user_mfa_methods(self, user_id: str): + return self.auth.fetch_user_mfa_methods(user_id) + + def invite_user_to_org_by_user_id( + self, user_id: str, org_id: str, role: str, additional_roles: List[str] = [] + ): + return self.auth.invite_user_to_org_by_user_id( + user_id, + org_id, + role, + additional_roles, + ) + + def validate_imported_api_key(self, api_key_token: str): + return self.auth.validate_imported_api_key(api_key_token) + + def fetch_api_key_usage( + self, + date: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + api_key_id: Optional[str] = None + ): + return self.auth.fetch_api_key_usage( + date, org_id, user_id, api_key_id + ) + + def import_api_key( + self, + api_key_token: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + expires_at_seconds: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ): + return self.auth.import_api_key( + api_key_token, + org_id, + user_id, + expires_at_seconds, + metadata, + ) + + def send_sms_mfa_code( + self, + action_type: str, + user_id: str, + mfa_phone_id: str, + grant_type: StepUpMfaGrantType, + valid_for_seconds: int, + ): + return self.auth.send_sms_mfa_code( + action_type, + user_id, + mfa_phone_id, + grant_type, + valid_for_seconds + ) + + def verify_sms_challenge( + self, + challenge_id: str, + user_id: str, + code: str, + ): + return self.auth.verify_sms_challenge( + challenge_id, + user_id, + code + ) + + def fetch_employee_by_id(self, employee_id: str): + return self.auth.fetch_employee_by_id(employee_id) + class FastAPIAuthAsync(): def __init__( self, @@ -636,12 +711,13 @@ async def create_magic_link( self, email: str, redirect_to_url: Optional[str] = None, - expires_in_hours: Optional[str] = None, + expires_in_hours: Optional[int] = None, create_new_user_if_one_doesnt_exist: Optional[bool] = None, user_signup_query_parameters: Optional[Dict[str, Any]] = None, + expire_after_first_use: Optional[bool] = None ): return await self.auth.create_magic_link( - email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters + email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters, expire_after_first_use ) async def create_access_token(self, user_id: str, duration_in_minutes: int, active_org_id: Optional[str] = None): @@ -788,8 +864,8 @@ async def create_api_key( ): return await self.auth.create_api_key(org_id, user_id, expires_at_seconds, metadata) - async def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None): - return await self.auth.update_api_key(api_key_id, expires_at_seconds, metadata) + async def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, set_to_never_expire: Optional[bool] = None): + return await self.auth.update_api_key(api_key_id, expires_at_seconds, metadata, set_to_never_expire) async def delete_api_key(self, api_key_id: str): return await self.auth.delete_api_key(api_key_id) @@ -829,6 +905,94 @@ async def verify_step_up_totp_challenge( async def verify_step_up_grant(self, action_type: str, user_id: str, grant: str) -> bool: return await self.auth.verify_step_up_grant(action_type, user_id, grant) + + async def validate_imported_api_key(self, api_key_token: str): + return await self.auth.validate_imported_api_key( + api_key_token=api_key_token + ) + + async def fetch_api_key_usage( + self, + date: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + api_key_id: Optional[str] = None + ): + return await self.auth.fetch_api_key_usage( + date, + org_id, + user_id, + api_key_id + ) + + async def import_api_key( + self, + api_key_token: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + expires_at_seconds: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ): + return await self.auth.import_api_key( + api_key_token, + org_id, + user_id, + expires_at_seconds, + metadata, + ) + + async def invite_user_to_org_by_user_id( + self, + user_id: str, + org_id: str, + role: str, + additional_roles: List[str] = [] + ): + return await self.auth.invite_user_to_org_by_user_id( + user_id, + org_id, + role, + additional_roles, + ) + + async def fetch_user_mfa_methods(self, user_id: str): + return await self.auth.fetch_user_mfa_methods( + user_id, + ) + + async def send_sms_mfa_code( + self, + action_type: str, + user_id: str, + mfa_phone_id: str, + grant_type: StepUpMfaGrantType, + valid_for_seconds: int, + ): + return await self.auth.send_sms_mfa_code( + action_type, + user_id, + mfa_phone_id, + grant_type, + valid_for_seconds + ) + + async def verify_sms_challenge( + self, + challenge_id: str, + user_id: str, + code: str, + ): + return await self.auth.verify_sms_challenge( + challenge_id, + user_id, + code + ) + + async def fetch_employee_by_id(self, employee_id: str): + return await self.auth.fetch_employee_by_id( + employee_id + ) + def init_auth( auth_url: str, diff --git a/requirements.txt b/requirements.txt index 3c067bd..b42512f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ fastapi -propelauth-py==4.2.8 +propelauth-py==4.2.9 pytest requests-mock httpx diff --git a/setup.py b/setup.py index 66137ee..50037be 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name="propelauth-fastapi", - version="4.2.8", + version="4.2.9", description="A FastAPI library for managing authentication, backed by PropelAuth", long_description=README, long_description_content_type="text/markdown", @@ -21,7 +21,7 @@ author="PropelAuth", author_email="support@propelauth.com", license="MIT", - install_requires=["propelauth-py==4.2.8", "requests", "httpx>=0.28.1"], + install_requires=["propelauth-py==4.2.9", "requests", "httpx>=0.28.1"], setup_requires=pytest_runner, tests_require=["pytest==4.4.1"], test_suite="tests",