Skip to content

Commit a2963f4

Browse files
authored
Anonymous users (#494)
* Anonymous users + test related to descope/etc#9497 * CR fixes
1 parent 26dff2a commit a2963f4

File tree

3 files changed

+66
-9
lines changed

3 files changed

+66
-9
lines changed

descope/management/common.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,10 @@ class MgmtV1:
8080
# jwt
8181
update_jwt_path = "/v1/mgmt/jwt/update"
8282
impersonate_path = "/v1/mgmt/impersonate"
83-
mgmt_sign_in = "/v1/mgmt/auth/signin"
84-
mgmt_sign_up = "/v1/mgmt/auth/signup"
85-
mgmt_sign_up_or_in = "/v1/mgmt/auth/signup-in"
83+
mgmt_sign_in_path = "/v1/mgmt/auth/signin"
84+
mgmt_sign_up_path = "/v1/mgmt/auth/signup"
85+
mgmt_sign_up_or_in_path = "/v1/mgmt/auth/signup-in"
86+
anonymous_path = "/v1/mgmt/auth/anonymous"
8687

8788
# permission
8889
permission_create_path = "/v1/mgmt/permission/create"

descope/management/jwt.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def sign_in(
108108
raise AuthException(400, ERROR_TYPE_INVALID_ARGUMENT, "JWT is required")
109109

110110
response = self._auth.do_post(
111-
MgmtV1.mgmt_sign_in,
111+
MgmtV1.mgmt_sign_in_path,
112112
{
113113
"loginId": login_id,
114114
"stepup": login_options.stepup,
@@ -139,7 +139,7 @@ def sign_up(
139139
"""
140140

141141
return self._sign_up_internal(
142-
login_id, MgmtV1.mgmt_sign_up, user, signup_options
142+
login_id, MgmtV1.mgmt_sign_up_path, user, signup_options
143143
)
144144

145145
def sign_up_or_in(
@@ -157,7 +157,7 @@ def sign_up_or_in(
157157
signup_options (MgmtSignUpOptions): signup options.
158158
"""
159159
return self._sign_up_internal(
160-
login_id, MgmtV1.mgmt_sign_up_or_in, user, signup_options
160+
login_id, MgmtV1.mgmt_sign_up_or_in_path, user, signup_options
161161
)
162162

163163
def _sign_up_internal(
@@ -193,3 +193,30 @@ def _sign_up_internal(
193193
resp = response.json()
194194
jwt_response = self._auth.generate_jwt_response(resp, None, None)
195195
return jwt_response
196+
197+
def anonymous(
198+
self,
199+
custom_claims: Optional[dict] = None,
200+
tenant_id: Optional[str] = None,
201+
) -> dict:
202+
"""
203+
Generate a JWT for an anonymous user.
204+
205+
Args:
206+
custom_claims dict: Custom claims to add to JWT
207+
tenant_id (str): tenant id to set on DCT claim.
208+
"""
209+
210+
response = self._auth.do_post(
211+
MgmtV1.anonymous_path,
212+
{
213+
"customClaims": custom_claims,
214+
"selectedTenant": tenant_id,
215+
},
216+
pswd=self._auth.management_key,
217+
)
218+
resp = response.json()
219+
jwt_response = self._auth.generate_jwt_response(resp, None, None)
220+
del jwt_response["firstSeen"]
221+
del jwt_response["user"]
222+
return jwt_response

tests/management/test_jwt.py

+32-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def test_sign_in(self):
165165
network_resp.json.return_value = json.loads("""{"jwt": "response"}""")
166166
mock_post.return_value = network_resp
167167
client.mgmt.jwt.sign_in("loginId")
168-
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_in}"
168+
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_in_path}"
169169
mock_post.assert_called_with(
170170
expected_uri,
171171
headers={
@@ -204,7 +204,7 @@ def test_sign_up(self):
204204
network_resp.json.return_value = json.loads("""{"jwt": "response"}""")
205205
mock_post.return_value = network_resp
206206
client.mgmt.jwt.sign_up("loginId")
207-
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_up}"
207+
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_up_path}"
208208
mock_post.assert_called_with(
209209
expected_uri,
210210
headers={
@@ -253,7 +253,7 @@ def test_sign_up_or_in(self):
253253
network_resp.json.return_value = json.loads("""{"jwt": "response"}""")
254254
mock_post.return_value = network_resp
255255
client.mgmt.jwt.sign_up_or_in("loginId")
256-
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_up_or_in}"
256+
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.mgmt_sign_up_or_in_path}"
257257
mock_post.assert_called_with(
258258
expected_uri,
259259
headers={
@@ -283,3 +283,32 @@ def test_sign_up_or_in(self):
283283
params=None,
284284
timeout=DEFAULT_TIMEOUT_SECONDS,
285285
)
286+
287+
def test_anonymous(self):
288+
client = DescopeClient(
289+
self.dummy_project_id,
290+
self.public_key_dict,
291+
False,
292+
self.dummy_management_key,
293+
)
294+
295+
# Test success flow
296+
with patch("requests.post") as mock_post:
297+
network_resp = mock.Mock()
298+
network_resp.ok = True
299+
network_resp.json.return_value = json.loads("""{"jwt": "response"}""")
300+
mock_post.return_value = network_resp
301+
client.mgmt.jwt.anonymous({"k1": "v1"}, "id")
302+
expected_uri = f"{common.DEFAULT_BASE_URL}{MgmtV1.anonymous_path}"
303+
mock_post.assert_called_with(
304+
expected_uri,
305+
headers={
306+
**common.default_headers,
307+
"Authorization": f"Bearer {self.dummy_project_id}:{self.dummy_management_key}",
308+
},
309+
json={"customClaims": {"k1": "v1"}, "selectedTenant": "id"},
310+
allow_redirects=False,
311+
verify=True,
312+
params=None,
313+
timeout=DEFAULT_TIMEOUT_SECONDS,
314+
)

0 commit comments

Comments
 (0)