Skip to content

Commit efec39e

Browse files
committed
Add list auth factors method
1 parent 0b0ca39 commit efec39e

File tree

3 files changed

+85
-3
lines changed

3 files changed

+85
-3
lines changed

tests/test_user_management.py

+31-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from tests.utils.fixtures.mock_session import MockSession
44
from tests.utils.fixtures.mock_user import MockUser
5+
from tests.utils.fixtures.mock_auth_factor_totp import MockAuthFactorTotp
56
from workos.user_management import UserManagement
67

78

@@ -126,7 +127,6 @@ def mock_magic_auth_challenge_response(self):
126127

127128
@pytest.fixture
128129
def mock_enroll_auth_factor_response(self):
129-
130130
return {
131131
"authentication_challenge": {
132132
"object": "authentication_challenge",
@@ -150,6 +150,22 @@ def mock_enroll_auth_factor_response(self):
150150
}
151151
}
152152

153+
@pytest.fixture
154+
def mock_auth_factors(self):
155+
auth_factors_list = [MockAuthFactorTotp(id=str(i)).to_dict() for i in range(2)]
156+
157+
dict_response = {
158+
"data": auth_factors_list,
159+
"list_metadata": {"before": None, "after": None},
160+
"metadata": {
161+
"params": {
162+
"user_id": 'user_12345',
163+
},
164+
"method": UserManagement.list_auth_factors,
165+
},
166+
}
167+
return dict_response
168+
153169
def test_create_user(self, mock_user, mock_request_method):
154170
mock_request_method("post", mock_user, 201)
155171

@@ -430,3 +446,17 @@ def test_enroll_auth_factor(self, mock_enroll_auth_factor_response, mock_request
430446
)
431447

432448
assert enroll_auth_factor == mock_enroll_auth_factor_response
449+
450+
def test_auth_factors_returns_metadata(
451+
self,
452+
mock_auth_factors,
453+
mock_request_method,
454+
):
455+
mock_request_method("get", mock_auth_factors, 200)
456+
457+
auth_factors = self.user_management.list_auth_factors(
458+
user="user_12345",
459+
)
460+
461+
dict_auth_factors = auth_factors.to_dict()
462+
assert dict_auth_factors["metadata"]["params"]["user_id"] == "user_12345"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import datetime
2+
from workos.resources.base import WorkOSBaseResource
3+
4+
5+
class MockAuthFactorTotp(WorkOSBaseResource):
6+
def __init__(self, id):
7+
self.object = "authentication_factor"
8+
self.id = id
9+
self.created_at = datetime.datetime.now()
10+
self.updated_at = datetime.datetime.now()
11+
self.type = "totp"
12+
self.totp = {
13+
"qr_code": "data:image/png;base64,{base64EncodedPng}",
14+
"secret": "NAGCCFS3EYRB422HNAKAKY3XDUORMSRF",
15+
"uri": "otpauth://totp/FooCorp:[email protected]?secret=NAGCCFS3EYRB422HNAKAKY3XDUORMSRF&issuer=FooCorp",
16+
}
17+
18+
OBJECT_FIELDS = [
19+
"object",
20+
"id",
21+
"created_at",
22+
"updated_at",
23+
"type",
24+
"totp",
25+
]

workos/user_management.py

+29-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from workos.resources.password_challenge_response import WorkOSPasswordChallengeResponse
44
from workos.resources.list import WorkOSListResource
55
from workos.resources.mfa import WorkOSAuthenticationChallengeAndFactor
6+
from workos.resources.mfa import WorkOSAuthenticationFactorTotp
67
from workos.resources.users import WorkOSUser
78
from workos.utils.pagination_order import Order
89
from workos.utils.request import (
@@ -566,18 +567,44 @@ def enroll_auth_factor(
566567
headers = {}
567568

568569
payload = {
569-
"user_id": user,
570570
"type": type,
571571
"totp_issuer": totp_issuer,
572572
"totp_user": totp_user,
573573
}
574574

575575
response = self.request_helper.request(
576-
USER_AUTH_FACTORS_PATH,
576+
USER_AUTH_FACTORS_PATH.format(user),
577577
method=REQUEST_METHOD_POST,
578578
headers=headers,
579579
params=payload,
580580
token=workos.api_key,
581581
)
582582

583583
return WorkOSAuthenticationChallengeAndFactor.construct_from_response(response).to_dict()
584+
585+
def list_auth_factors(
586+
self,
587+
user,
588+
):
589+
"""Lists the Auth Factors for a user.
590+
591+
Kwargs:
592+
user (str): The unique ID of the User to list the auth factors for.
593+
594+
Returns:
595+
dict: List of Authentication Factors for a User from WorkOS.
596+
"""
597+
response = self.request_helper.request(
598+
USER_AUTH_FACTORS_PATH.format(user),
599+
method=REQUEST_METHOD_GET,
600+
token=workos.api_key,
601+
)
602+
603+
response["metadata"] = {
604+
"params": {
605+
"user_id": user,
606+
},
607+
"method": UserManagement.list_auth_factors,
608+
}
609+
610+
return self.construct_from_response(response)

0 commit comments

Comments
 (0)