Skip to content

Commit 9bf3024

Browse files
authored
Add MagicLink support through passwordless module (#41)
* Add MagicLink support through passwordless module * Update test_passwordless.py spacing * Update test_passwordless.py spacing * Update session type key * Update string interoplation for send session post request * Return True instead of a dict when sending a session * Update send_session return comment * Grammar fix * Fix comment spacing
1 parent b91fa4c commit 9bf3024

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

tests/test_passwordless.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import json
2+
from requests import Response
3+
4+
import pytest
5+
6+
import workos
7+
from workos.passwordless import Passwordless
8+
9+
10+
class TestPasswordless(object):
11+
@pytest.fixture(autouse=True)
12+
def setup(self, set_api_key_and_project_id):
13+
self.passwordless = Passwordless()
14+
15+
@pytest.fixture
16+
def mock_passwordless_session(self):
17+
return {
18+
"id": "passwordless_session_01EHDAK2BFGWCSZXP9HGZ3VK8C",
19+
"email": "[email protected]",
20+
"expires_at": "2020-08-13T05:50:00.000Z",
21+
"link": "https://auth.workos.com/passwordless/4TeRexuejWCKs9rrFOIuLRYEr/confirm",
22+
"object": "passwordless_session",
23+
}
24+
25+
def test_create_session_succeeds(
26+
self, mock_passwordless_session, mock_request_method
27+
):
28+
mock_response = Response()
29+
mock_response.status_code = 201
30+
mock_response.response_dict = mock_passwordless_session
31+
mock_request_method("post", mock_response, 201)
32+
33+
session_options = {
34+
"email": "[email protected]",
35+
"type": "MagicLink",
36+
}
37+
response = self.passwordless.create_session(session_options)
38+
39+
assert response.status_code == 201
40+
assert response.response_dict == mock_passwordless_session
41+
42+
def test_get_send_session_succeeds(self, mock_request_method):
43+
response = {
44+
"success": True,
45+
}
46+
mock_request_method("post", response, 200)
47+
48+
response = self.passwordless.send_session(
49+
"passwordless_session_01EHDAK2BFGWCSZXP9HGZ3VK8C"
50+
)
51+
assert response == True

workos/passwordless.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import workos
2+
from workos.utils.request import RequestHelper, REQUEST_METHOD_POST
3+
from workos.utils.validation import PASSWORDLESS_MODULE, validate_settings
4+
5+
6+
class Passwordless(object):
7+
"""Offers methods through the WorkOS Passwordless service."""
8+
9+
@validate_settings(PASSWORDLESS_MODULE)
10+
def __init__(self):
11+
pass
12+
13+
@property
14+
def request_helper(self):
15+
if not getattr(self, "_request_helper", None):
16+
self._request_helper = RequestHelper()
17+
return self._request_helper
18+
19+
def create_session(self, session_options):
20+
"""Create a Passwordless Session.
21+
22+
Args:
23+
session_options (dict) - An session options object
24+
session_options[email] (str): The email of the user to authenticate.
25+
session_options[state] (str): Optional parameter that the redirect
26+
URI received from WorkOS will contain. The state parameter
27+
can be used to encode arbitrary information to help
28+
restore application state between redirects.
29+
session_options[type] (str): The type of Passwordless Session to
30+
create. Currently, the only supported value is 'MagicLink'.
31+
32+
Returns:
33+
dict: Passwordless Session
34+
"""
35+
36+
return self.request_helper.request(
37+
"passwordless/sessions",
38+
method=REQUEST_METHOD_POST,
39+
params=session_options,
40+
token=workos.api_key,
41+
)
42+
43+
def send_session(self, session_id):
44+
"""Send a Passwordless Session via email.
45+
46+
Args:
47+
session_id (str): The unique identifier of the Passwordless
48+
Session to send an email for.
49+
50+
Returns:
51+
boolean: Returns True
52+
"""
53+
self.request_helper.request(
54+
"passwordless/sessions/{session_id}/send".format(session_id=session_id),
55+
method=REQUEST_METHOD_POST,
56+
token=workos.api_key,
57+
)
58+
59+
return True

workos/utils/validation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
AUDIT_TRAIL_MODULE = "AuditTrail"
77
DIRECTORY_SYNC_MODULE = "DirectorySync"
8+
PASSWORDLESS_MODULE = "Passwordless"
89
PORTAL_MODULE = "Portal"
910
SSO_MODULE = "SSO"
1011

1112
REQUIRED_SETTINGS_FOR_MODULE = {
1213
AUDIT_TRAIL_MODULE: ["api_key",],
1314
DIRECTORY_SYNC_MODULE: ["api_key",],
15+
PASSWORDLESS_MODULE: ["api_key",],
1416
PORTAL_MODULE: ["api_key",],
1517
SSO_MODULE: ["api_key", "project_id",],
1618
}

0 commit comments

Comments
 (0)