Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 172 additions & 8 deletions propelauth_fastapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
fastapi
propelauth-py==4.2.8
propelauth-py==4.2.9
pytest
requests-mock
httpx
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down