Skip to content

Commit 2668247

Browse files
roywillyrwiker
authored andcommitted
Re-introduce devicecode login as it can be useful in special situations
1 parent 03d7cf7 commit 2668247

3 files changed

Lines changed: 59 additions & 5 deletions

File tree

src/sumo/wrapper/_auth_provider.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,45 @@ def login(self):
183183
pass
184184

185185

186+
class AuthProviderDeviceCode(AuthProvider):
187+
def __init__(self, client_id, authority, resource_id):
188+
super().__init__(resource_id)
189+
cache = get_token_cache(resource_id)
190+
self._app = msal.PublicClientApplication(
191+
client_id=client_id, authority=authority, token_cache=cache
192+
)
193+
self._resource_id = resource_id
194+
self._scope = scope_for_resource(resource_id)
195+
if self.get_token() is None:
196+
self.login()
197+
pass
198+
return
199+
200+
def login(self):
201+
flow = self._app.initiate_device_flow([self._scope])
202+
203+
if "error" in flow:
204+
raise ValueError(
205+
"Failed to create device flow. Err: %s"
206+
% json.dumps(flow, indent=4)
207+
)
208+
209+
print(flow["message"])
210+
result = self._app.acquire_token_by_device_flow(flow)
211+
212+
if "error" in result:
213+
raise ValueError(
214+
"Failed to acquire token by device flow. Err: %s"
215+
% json.dumps(result, indent=4)
216+
)
217+
218+
protect_token_cache(self._resource_id)
219+
220+
return
221+
222+
pass
223+
224+
186225
class AuthProviderManaged(AuthProvider):
187226
def __init__(self, resource_id):
188227
super().__init__(resource_id)
@@ -203,6 +242,7 @@ def get_auth_provider(
203242
interactive=False,
204243
access_token=None,
205244
refresh_token=None,
245+
devicecode=False,
206246
):
207247
if refresh_token:
208248
return AuthProviderRefreshToken(
@@ -214,7 +254,11 @@ def get_auth_provider(
214254
# ELSE
215255
if interactive:
216256
return AuthProviderInteractive(client_id, authority, resource_id)
217-
257+
# ELSE
258+
if devicecode:
259+
# Potential issues with device-code
260+
# under Equinor compliant device policy
261+
return AuthProviderDeviceCode(client_id, authority, resource_id)
218262
# ELSE
219263
if all(
220264
[
@@ -228,8 +272,5 @@ def get_auth_provider(
228272
]
229273
):
230274
return AuthProviderManaged(resource_id)
231-
232275
# ELSE
233-
# Device code login does not work with Equinor compliant device policy
234-
# return AuthProviderDeviceCode(client_id, authority, resource_id)
235276
return AuthProviderInteractive(client_id, authority, resource_id)

src/sumo/wrapper/login.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ def get_parser() -> ArgumentParser:
3737
help="Login interactively",
3838
)
3939

40+
parser.add_argument(
41+
"-d",
42+
"--devicecode",
43+
dest="devicecode",
44+
action="store_true",
45+
default=False,
46+
help="Login with device-code",
47+
)
48+
4049
parser.add_argument(
4150
"-p",
4251
"--print",
@@ -57,7 +66,9 @@ def main():
5766

5867
print("Login to Sumo environment: " + env)
5968

60-
sumo = SumoClient(args.env, interactive=args.interactive)
69+
sumo = SumoClient(
70+
args.env, interactive=args.interactive, devicecode=args.devicecode
71+
)
6172
token = sumo.authenticate()
6273

6374
if args.print_token:

src/sumo/wrapper/sumo_client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(
2929
env: str,
3030
token: str = None,
3131
interactive: bool = False,
32+
devicecode: bool = False,
3233
verbosity: str = "CRITICAL",
3334
retry_strategy=RetryStrategy(),
3435
):
@@ -81,6 +82,7 @@ def __init__(
8182
interactive=interactive,
8283
refresh_token=refresh_token,
8384
access_token=access_token,
85+
devicecode=devicecode,
8486
)
8587

8688
if env == "localhost":

0 commit comments

Comments
 (0)