Skip to content

Commit b1911c7

Browse files
committed
Support multiple scopes through middleware options
1 parent e66c10d commit b1911c7

5 files changed

Lines changed: 40 additions & 16 deletions

File tree

src/core/http_client_factory.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,6 @@ def delete(self, url, **kwargs):
5050
def _get_url(self, url):
5151
return self._base_url+url if (url[0] == '/') else url
5252

53-
def _prepare_and_send_request(self, method='', url='', **kwargs):
54-
request_url = self._get_url(url)
55-
56-
request = Request(method, request_url, kwargs)
57-
prepared_request = self.prepare_request(request)
58-
59-
return self.send(prepared_request, **kwargs)
60-
6153
def _register(self, middlewares):
6254
if middlewares:
6355
middleware_adapter = MiddlewarePipeline()
@@ -66,3 +58,22 @@ def _register(self, middlewares):
6658
middleware_adapter.add_middleware(middleware)
6759

6860
self.mount('https://', middleware_adapter)
61+
62+
def _prepare_and_send_request(self, method='', url='', **kwargs):
63+
# Retrieve middleware options
64+
list_of_scopes = kwargs.pop('scopes')
65+
66+
# Prepare request
67+
request_url = self._get_url(url)
68+
request = Request(method, request_url, kwargs)
69+
prepared_request = self.prepare_request(request)
70+
71+
# prepare scopes middleware option
72+
graph_scopes = BASE_URL + '?scopes='
73+
for scope in list_of_scopes:
74+
graph_scopes += scope + '%20'
75+
76+
# Append middleware options to the request object, will be used by MiddlewareController
77+
prepared_request.scopes = graph_scopes
78+
79+
return self.send(prepared_request, **kwargs)

src/middleware/_middleware.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def _attach_middleware_control(self, request, **kwargs):
3232
request.middleware_control = MiddlewareControl()
3333

3434
try:
35-
scopes = kwargs.pop('scopes')
35+
scopes = request.scopes
3636
auth_middleware_options = AuthMiddlewareOptions(scopes)
3737
request.middleware_control.set(AUTH_MIDDLEWARE_OPTIONS, auth_middleware_options)
3838
except KeyError:

src/middleware/authorization_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ def send(self, request, **kwargs):
2626
return response
2727

2828
def _get_middleware_options(self, request):
29-
return request.middleware_control.get(AUTH_MIDDLEWARE_OPTIONS) or self.auth_provider_options
29+
return request.middleware_control.get(AUTH_MIDDLEWARE_OPTIONS)

src/middleware/options/auth_middleware_options.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
class AuthMiddlewareOptions:
5-
def __init__(self, scopes=''):
5+
def __init__(self, scopes=[]):
66
self.scopes = scopes
77

88
@property
@@ -11,10 +11,12 @@ def scopes(self):
1111

1212
@scopes.setter
1313
def scopes(self, list_of_scopes):
14-
graph_scopes = BASE_URL + '?scopes='
14+
if type(list_of_scopes) == list:
15+
graph_scopes = BASE_URL + '?scopes='
1516

16-
for scope in list_of_scopes:
17-
graph_scopes += scope + '%20'
18-
19-
self._scopes = graph_scopes
17+
for scope in list_of_scopes:
18+
graph_scopes += scope + '%20'
2019

20+
self._scopes = graph_scopes
21+
elif type(list_of_scopes) == str:
22+
self._scopes = list_of_scopes
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from unittest import TestCase
2+
3+
from src.middleware.options.auth_middleware_options import AuthMiddlewareOptions
4+
5+
6+
class TestMiddlewareOptions(TestCase):
7+
def test_multiple_scopes(self):
8+
graph_scopes = 'https://graph.microsoft.com/v1.0?scopes=mail.read%20user.read%20'
9+
auth_options = AuthMiddlewareOptions(scopes=['mail.read', 'user.read'])
10+
self.assertEqual(auth_options.scopes, graph_scopes)
11+

0 commit comments

Comments
 (0)