@@ -590,6 +590,8 @@ def initiate_auth_code_flow(
590
590
self ._client_capabilities , claims_challenge ),
591
591
)
592
592
flow ["claims_challenge" ] = claims_challenge
593
+ if login_hint :
594
+ flow ["login_hint" ] = login_hint # To be relayed to token endpoint
593
595
return flow
594
596
595
597
def get_authorization_request_url (
@@ -726,11 +728,15 @@ def authorize(): # A controller in a web app
726
728
self ._validate_ssh_cert_input_data (kwargs .get ("data" , {}))
727
729
telemetry_context = self ._build_telemetry_context (
728
730
self .ACQUIRE_TOKEN_BY_AUTHORIZATION_CODE_ID )
731
+ headers = telemetry_context .generate_headers ()
732
+ if "login_hint" in auth_code_flow : # Then use it as the CCS Routing info
733
+ headers ["X-AnchorMailbox" ] = "UPN:{}" .format (
734
+ auth_code_flow .pop ("login_hint" ))
729
735
response = _clean_up (self .client .obtain_token_by_auth_code_flow (
730
736
auth_code_flow ,
731
737
auth_response ,
732
738
scope = self ._decorate_scope (scopes ) if scopes else None ,
733
- headers = telemetry_context . generate_headers () ,
739
+ headers = headers ,
734
740
data = dict (
735
741
kwargs .pop ("data" , {}),
736
742
claims = _merge_claims_challenge_and_capabilities (
@@ -1178,6 +1184,10 @@ def _acquire_token_silent_by_finding_specific_refresh_token(
1178
1184
key = lambda e : int (e .get ("last_modification_time" , "0" )),
1179
1185
reverse = True ):
1180
1186
logger .debug ("Cache attempts an RT" )
1187
+ headers = telemetry_context .generate_headers ()
1188
+ if "home_account_id" in query : # Then use it as CCS Routing info
1189
+ headers ["X-AnchorMailbox" ] = "Oid:{}" .format (
1190
+ query ["home_account_id" ].replace ("." , "@" ))
1181
1191
response = client .obtain_token_by_refresh_token (
1182
1192
entry , rt_getter = lambda token_item : token_item ["secret" ],
1183
1193
on_removing_rt = lambda rt_item : None , # Disable RT removal,
@@ -1189,7 +1199,7 @@ def _acquire_token_silent_by_finding_specific_refresh_token(
1189
1199
skip_account_creation = True , # To honor a concurrent remove_account()
1190
1200
)),
1191
1201
scope = scopes ,
1192
- headers = telemetry_context . generate_headers () ,
1202
+ headers = headers ,
1193
1203
data = dict (
1194
1204
kwargs .pop ("data" , {}),
1195
1205
claims = _merge_claims_challenge_and_capabilities (
@@ -1284,6 +1294,8 @@ def acquire_token_by_username_password(
1284
1294
telemetry_context = self ._build_telemetry_context (
1285
1295
self .ACQUIRE_TOKEN_BY_USERNAME_PASSWORD_ID )
1286
1296
headers = telemetry_context .generate_headers ()
1297
+ # No need to add CCS Routing info,
1298
+ # because username param will be recognized as CCS Routing info.
1287
1299
data = dict (
1288
1300
kwargs .pop ("data" , {}),
1289
1301
claims = _merge_claims_challenge_and_capabilities (
@@ -1425,6 +1437,9 @@ def acquire_token_interactive(
1425
1437
self ._client_capabilities , claims_challenge )
1426
1438
telemetry_context = self ._build_telemetry_context (
1427
1439
self .ACQUIRE_TOKEN_INTERACTIVE )
1440
+ headers = telemetry_context .generate_headers ()
1441
+ if login_hint : # Then use it as the CCS Routing info
1442
+ headers ["X-AnchorMailbox" ] = "UPN:{}" .format (login_hint )
1428
1443
response = _clean_up (self .client .obtain_token_by_browser (
1429
1444
scope = self ._decorate_scope (scopes ) if scopes else None ,
1430
1445
extra_scope_to_consent = extra_scopes_to_consent ,
@@ -1439,7 +1454,7 @@ def acquire_token_interactive(
1439
1454
"domain_hint" : domain_hint ,
1440
1455
},
1441
1456
data = dict (kwargs .pop ("data" , {}), claims = claims ),
1442
- headers = telemetry_context . generate_headers () ,
1457
+ headers = headers ,
1443
1458
browser_name = _preferred_browser (),
1444
1459
** kwargs ))
1445
1460
telemetry_context .update_telemetry (response )
0 commit comments