Skip to content

Commit 7b42f99

Browse files
committed
Validate client ID in DID Token.
1 parent 5a8b424 commit 7b42f99

File tree

6 files changed

+68
-9
lines changed

6 files changed

+68
-9
lines changed

magic_admin/magic.py

+8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import magic_admin
44
from magic_admin.config import api_secret_api_key_missing_message
5+
from magic_admin.config import base_url
56
from magic_admin.error import AuthenticationError
7+
from magic_admin.http_client import RequestsClient
68
from magic_admin.resources.base import ResourceComponent
79

810

@@ -13,6 +15,8 @@
1315

1416
class Magic:
1517

18+
v1_client_info = base_url + '/v1/admin/client/get'
19+
1620
def __getattr__(self, attribute_name):
1721
try:
1822
return getattr(self._resource, attribute_name)
@@ -24,6 +28,7 @@ def __getattr__(self, attribute_name):
2428
def __init__(
2529
self,
2630
api_secret_key=None,
31+
client_id=None,
2732
retries=RETRIES,
2833
timeout=TIMEOUT,
2934
backoff_factor=BACKOFF_FACTOR,
@@ -32,6 +37,9 @@ def __init__(
3237

3338
self._resource.setup_request_client(retries, timeout, backoff_factor)
3439
self._set_api_secret_key(api_secret_key)
40+
init_requests_client = RequestsClient(retries, timeout, backoff_factor)
41+
magic_admin.client_id = client_id or \
42+
init_requests_client.request('get', self.v1_client_info).data['client_id']
3543

3644
def _set_api_secret_key(self, api_secret_key):
3745
magic_admin.api_secret_key = api_secret_key or os.environ.get(

magic_admin/resources/token.py

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from eth_account.messages import defunct_hash_message
55
from web3.auto import w3
66

7+
import magic_admin
78
from magic_admin.error import DIDTokenExpired
89
from magic_admin.error import DIDTokenInvalid
910
from magic_admin.error import DIDTokenMalformed
@@ -172,3 +173,8 @@ def validate(cls, did_token):
172173
'check the "nbf" field and regenerate a new token with a suitable '
173174
'value.',
174175
)
176+
177+
if claim['aud'] != magic_admin.client_id:
178+
raise DIDTokenInvalid(
179+
message='"aud" field does not match your client. Please check your secret key.',
180+
)

tests/integration/magic_test.py

+17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest import mock
2+
13
import pytest
24

35
import magic_admin
@@ -10,6 +12,21 @@ class TestMagic:
1012

1113
api_secret_key = 'troll_goat'
1214

15+
@pytest.fixture(autouse=True)
16+
def setup(self):
17+
self.mocked_rc = mock.Mock(
18+
request=mock.Mock(
19+
return_value=mock.Mock(
20+
data={
21+
'client_id': '1234',
22+
},
23+
),
24+
),
25+
)
26+
# self.mocked_rc.request=
27+
with mock.patch('magic_admin.magic.RequestsClient', return_value=self.mocked_rc):
28+
yield
29+
1330
def test_init_with_secret_key(self):
1431
Magic(api_secret_key=self.api_secret_key)
1532

tests/integration/resources/token_test.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from unittest import mock
2+
3+
from pretend import stub
4+
15
from magic_admin.resources.token import Token
26
from testing.data.did_token import claim
37
from testing.data.did_token import future_did_token
@@ -21,4 +25,8 @@ def test_get_public_address(self):
2125
assert Token.get_public_address(future_did_token) == public_address
2226

2327
def test_validate(self):
24-
Token.validate(future_did_token)
28+
with mock.patch(
29+
'magic_admin.resources.token.magic_admin',
30+
new=stub(client_id='did:magic:731848cc-084e-41ff-bbdf-7f103817ea6b'),
31+
):
32+
Token.validate(future_did_token)

tests/unit/magic_test.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,39 @@ class TestMagic:
1414

1515
api_secret_key = 'troll_goat'
1616

17+
@pytest.fixture(autouse=True)
18+
def setup(self):
19+
self.mocked_resource_component = mock.Mock()
20+
self.mocked_request_client = mock.Mock(
21+
request=mock.Mock(
22+
return_value=mock.Mock(
23+
data={
24+
'client_id': '1234',
25+
},
26+
),
27+
),
28+
)
29+
with mock.patch(
30+
'magic_admin.magic.ResourceComponent',
31+
return_value=self.mocked_resource_component,
32+
), mock.patch(
33+
'magic_admin.magic.RequestsClient',
34+
return_value=self.mocked_request_client,
35+
):
36+
yield
37+
1738
@pytest.fixture(autouse=True)
1839
def teardown(self):
1940
yield
2041
magic_admin.api_secret_key = None
2142

2243
def test_init(self):
23-
mocked_rc = mock.Mock()
24-
2544
with mock.patch(
26-
'magic_admin.magic.ResourceComponent',
27-
return_value=mocked_rc,
28-
) as mock_resource_component, mock.patch(
2945
'magic_admin.magic.Magic._set_api_secret_key',
3046
) as mock_set_api_secret_key:
3147
Magic(api_secret_key=self.api_secret_key)
3248

33-
mock_resource_component.assert_called_once_with()
34-
mocked_rc.setup_request_client.setup_request_client(
49+
self.mocked_resource_component.setup_request_client.assert_called_once_with(
3550
RETRIES,
3651
TIMEOUT,
3752
BACKOFF_FACTOR,

tests/unit/resources/token_test.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from unittest import mock
44

55
import pytest
6+
from pretend import stub
67

78
from magic_admin.error import DIDTokenExpired
89
from magic_admin.error import DIDTokenInvalid
@@ -164,6 +165,7 @@ def setup_mocks(self):
164165
claim = {
165166
'ext': 8084,
166167
'nbf': 6666,
168+
'aud': '1234',
167169
}
168170

169171
with mock.patch.object(
@@ -185,7 +187,10 @@ def setup_mocks(self):
185187
) as epoch_time_now, mock.patch(
186188
'magic_admin.resources.token.apply_did_token_nbf_grace_period',
187189
return_value=claim['nbf'],
188-
) as apply_did_token_nbf_grace_period:
190+
) as apply_did_token_nbf_grace_period, mock.patch(
191+
'magic_admin.resources.token.magic_admin',
192+
new=stub(client_id='1234'),
193+
):
189194
yield self.mock_funcs(
190195
proof,
191196
claim,

0 commit comments

Comments
 (0)