public async Task <MsalTokenResponse> AcquireTokenUsingBrokerAsync(Dictionary <string, string> brokerPayload) { s_androidBrokerTokenResponse = null; s_correlationId = AndroidBrokerHelper.GetValueFromBrokerPayload(brokerPayload, BrokerParameter.CorrelationId); try { // This task will kick off the broker and will block on the _readyForResponse semaphore // When the broker activity ends, SetBrokerResult is called, which releases the semaphore. await AcquireTokenInternalAsync(brokerPayload).ConfigureAwait(false); } catch (Exception ex) { _logger.Error("Android broker authentication failed."); HandleBrokerOperationError(ex); throw; } return(s_androidBrokerTokenResponse); }
private async Task AcquireTokenInternalAsync(IDictionary <string, string> brokerPayload) { try { if (brokerPayload.ContainsKey(BrokerParameter.BrokerInstallUrl)) { _logger.Info("Android Broker - broker payload contains install url"); var appLink = AndroidBrokerHelper.GetValueFromBrokerPayload(brokerPayload, BrokerParameter.BrokerInstallUrl); _logger.Info("Android Broker - Starting ActionView activity to " + appLink); _activity.StartActivity(new Intent(Intent.ActionView, AndroidNative.Net.Uri.Parse(appLink))); throw new MsalClientException( MsalError.BrokerApplicationRequired, MsalErrorMessage.BrokerApplicationRequired); } await _brokerHelper.InitiateBrokerHandshakeAsync(_activity).ConfigureAwait(false); brokerPayload[BrokerParameter.BrokerAccountName] = AndroidBrokerHelper.GetValueFromBrokerPayload(brokerPayload, BrokerParameter.Username); // Don't send silent background request if account information is not provided if (brokerPayload.ContainsKey(BrokerParameter.IsSilentBrokerRequest)) { _logger.Verbose("User is specified for silent token request. Starting silent broker request."); string silentResult = await _brokerHelper.GetBrokerAuthTokenSilentlyAsync(brokerPayload, _activity).ConfigureAwait(false); if (!string.IsNullOrEmpty(silentResult)) { s_androidBrokerTokenResponse = MsalTokenResponse.CreateFromAndroidBrokerResponse(silentResult, s_correlationId); } else { s_androidBrokerTokenResponse = new MsalTokenResponse { Error = MsalError.BrokerResponseReturnedError, ErrorDescription = "Failed to acquire token silently from the broker." + MsalErrorMessage.AndroidBrokerCannotBeInvoked, }; } return; } else { _logger.Verbose("User is not specified for silent token request"); } _logger.Verbose("Starting Android Broker interactive authentication"); // onActivityResult will receive the response for this activity. // Lauching this activity will switch to the broker app. Intent brokerIntent = await _brokerHelper .GetIntentForInteractiveBrokerRequestAsync(brokerPayload, _activity) .ConfigureAwait(false); if (brokerIntent != null) { try { _logger.Info( "Calling activity pid:" + AndroidNative.OS.Process.MyPid() + " tid:" + AndroidNative.OS.Process.MyTid() + "uid:" + AndroidNative.OS.Process.MyUid()); _activity.StartActivityForResult(brokerIntent, 1001); } catch (ActivityNotFoundException e) { _logger.ErrorPiiWithPrefix(e, "Unable to get android activity during interactive broker request"); throw; } } } catch (Exception ex) { _logger.ErrorPiiWithPrefix(ex, "Broker invocation failed."); throw; } await s_readyForResponse.WaitAsync().ConfigureAwait(false); }