Skip to content

Commit b1e33fb

Browse files
authored
[SIWG] Pass Sign In With Google credential to broker, Fixes AB#3100603 (#2573)
Fixes [AB#3100603](https://identitydivision.visualstudio.com/fac9d424-53d2-45c0-91b5-ef6ba7a6bf26/_workitems/edit/3100603) The PR adds to allow passing google id token credential from app side (in OneAuth) to Android Broker via Android Common. OneAuth can get the id token by using Sign In With Google component added earlier and pass it to Android Broker via BrokerRequest object. Changes include: 1. Make SignInWithGoogleCredential object serializable to allow passing the object from app side to broker as part of BrokerRequest. 2. Locally the reference to object can be maintained in Android AndroidInteractiveTokenCommandParameters which is renamed from AndroidActivityInteractiveTokenCommandParameters to be more flexible to accommodate more fields. 3. On Broker received, BrokerRequest is deserialized. If it has google credentials, it will be attached in BrokerInteractiveTokenCommandParameters as headers (x-ms-fidp-token: <itoken calue>) and extra query parameters (id_provder=google.com). Refer Broker PR. 4. Updated latest broker version to 17. OneAuth should call broker for sign in with google flow only if the broker version supports this version. OneAuth does broker version check early in deciding if support broker is present or not. 5. Added Unit tests. Related PRs: Broker: AzureAD/ad-accounts-for-android#3038 MSAL: AzureAD/microsoft-authentication-library-for-android#2247
1 parent 99a061e commit b1e33fb

25 files changed

+251
-60
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
vNext
22
----------
3+
- [MAJOR] Pass google id token to broker for enabling Sign in with Google (#2573)
34
- [MINOR] Organize browser selection classes and change signature for get AuthorizationStrategy (#2564)
45
- [MINOR] Add support for OneBox Environment (#2559)
56
- [MINOR] Add support for claims requests for native authentication (#2572)

common/src/main/java/com/microsoft/identity/common/adal/internal/AuthenticationConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ public static final class Broker {
605605
*
606606
* @see <a href="https://identitydivision.visualstudio.com/DevEx/_git/AuthLibrariesApiReview?path=/%5BAndroid%5D%20Broker%20API/broker_protocol_versions.md">Android Auth Broker Protocol Versions</a>
607607
*/
608-
public static final String LATEST_MSAL_TO_BROKER_PROTOCOL_VERSION_CODE = "16.0";
608+
public static final String LATEST_MSAL_TO_BROKER_PROTOCOL_VERSION_CODE = "17.0";
609609

610610
/**
611611
* The maximum msal-to-broker protocol version known by clients such as MSAL Android.

common/src/main/java/com/microsoft/identity/common/internal/broker/BrokerRequest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import androidx.annotation.Nullable;
2727

2828
import com.google.gson.annotations.SerializedName;
29+
import com.microsoft.identity.common.internal.msafederation.google.SignInWithGoogleCredential;
2930
import com.microsoft.identity.common.java.authscheme.AbstractAuthenticationScheme;
3031
import com.microsoft.identity.common.java.opentelemetry.SerializableSpanContext;
3132
import com.microsoft.identity.common.java.providers.oauth2.OpenIdConnectPromptParameter;
@@ -79,6 +80,7 @@ private static final class SerializedNames {
7980
final static String PREFERRED_AUTH_METHOD = "preferred_auth_method";
8081
final static String ACCOUNT_TRANSFER_TOKEN = "account_transfer_token";
8182
final static String SUPPRESS_ACCOUNT_PICKER = "suppress_account_picker";
83+
final static String SIGN_IN_WITH_GOOGLE_CREDENTIAL = "sign_in_with_google_credential";
8284
}
8385

8486
/**
@@ -266,4 +268,8 @@ private static final class SerializedNames {
266268
*/
267269
@SerializedName(SerializedNames.SUPPRESS_ACCOUNT_PICKER)
268270
private boolean mSuppressAccountPicker;
271+
272+
@Nullable
273+
@SerializedName(SerializedNames.SIGN_IN_WITH_GOOGLE_CREDENTIAL)
274+
private SignInWithGoogleCredential mSignInWithGoogleCredential;
269275
}

common/src/main/java/com/microsoft/identity/common/internal/commands/parameters/AndroidActivityInteractiveTokenCommandParameters.java renamed to common/src/main/java/com/microsoft/identity/common/internal/commands/parameters/AndroidInteractiveTokenCommandParameters.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.app.Activity;
2626

2727
import com.microsoft.identity.common.internal.controllers.BrokerMsalController;
28+
import com.microsoft.identity.common.internal.msafederation.google.SignInWithGoogleCredential;
2829
import com.microsoft.identity.common.java.commands.parameters.InteractiveTokenCommandParameters;
2930

3031
import lombok.EqualsAndHashCode;
@@ -39,6 +40,8 @@
3940
@Getter
4041
@SuperBuilder(toBuilder = true)
4142
@EqualsAndHashCode(callSuper = true)
42-
public class AndroidActivityInteractiveTokenCommandParameters extends InteractiveTokenCommandParameters {
43+
public class AndroidInteractiveTokenCommandParameters extends InteractiveTokenCommandParameters {
4344
private transient final Activity activity;
45+
46+
private final SignInWithGoogleCredential signInWithGoogleCredential;
4447
}

common/src/main/java/com/microsoft/identity/common/internal/controllers/BrokerMsalController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
import com.microsoft.identity.common.internal.cache.ClientActiveBrokerCache;
6868
import com.microsoft.identity.common.internal.cache.HelloCache;
6969
import com.microsoft.identity.common.internal.cache.HelloCacheResult;
70-
import com.microsoft.identity.common.internal.commands.parameters.AndroidActivityInteractiveTokenCommandParameters;
70+
import com.microsoft.identity.common.internal.commands.parameters.AndroidInteractiveTokenCommandParameters;
7171
import com.microsoft.identity.common.internal.request.MsalBrokerRequestAdapter;
7272
import com.microsoft.identity.common.internal.result.MsalBrokerResultAdapter;
7373
import com.microsoft.identity.common.internal.telemetry.Telemetry;
@@ -358,8 +358,8 @@ public AcquireTokenResult acquireToken(final @NonNull InteractiveTokenCommandPar
358358
final Intent interactiveRequestIntent = getBrokerAuthorizationIntent(parameters);
359359

360360
Activity activity = null;
361-
if (parameters instanceof AndroidActivityInteractiveTokenCommandParameters) {
362-
activity = ((AndroidActivityInteractiveTokenCommandParameters) parameters).getActivity();
361+
if (parameters instanceof AndroidInteractiveTokenCommandParameters) {
362+
activity = ((AndroidInteractiveTokenCommandParameters) parameters).getActivity();
363363
}
364364

365365
//Pass this intent to the BrokerActivity which will be used to start this activity

common/src/main/java/com/microsoft/identity/common/internal/msafederation/IFederatedCredentialCallback.kt renamed to common/src/main/java/com/microsoft/identity/common/internal/msafederation/IMsaFederatedCredentialCallback.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ package com.microsoft.identity.common.internal.msafederation
2626
* Interface for Federated Credential Callback. Helps calling sign methods
2727
* async from java.
2828
*/
29-
interface IFederatedCredentialCallback<R : FederatedCredential> {
29+
interface IMsaFederatedCredentialCallback<R : MsaFederatedCredential> {
3030
/**
3131
* Called when the sign in is successful.
3232
*/

common/src/main/java/com/microsoft/identity/common/internal/msafederation/IFederatedSignInProvider.kt renamed to common/src/main/java/com/microsoft/identity/common/internal/msafederation/IMsaFederatedSignInProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ package com.microsoft.identity.common.internal.msafederation
2525
/**
2626
* Internal interface for Federated Sign In Providers.
2727
*/
28-
internal interface IFederatedSignInProvider {
29-
suspend fun signIn(): Result<FederatedCredential>
28+
internal interface IMsaFederatedSignInProvider {
29+
suspend fun signIn(): Result<MsaFederatedCredential>
3030
suspend fun signOut()
3131
}

common/src/main/java/com/microsoft/identity/common/internal/msafederation/FederatedCredential.kt renamed to common/src/main/java/com/microsoft/identity/common/internal/msafederation/MsaFederatedCredential.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
// THE SOFTWARE.
2323
package com.microsoft.identity.common.internal.msafederation
2424

25+
import com.google.gson.annotations.SerializedName
26+
import java.util.AbstractMap
27+
2528
/**
2629
* Represents credential artifact as result of successful sign in into a federated sign in provider
2730
* (Google/Apple). It can contain id token and/or auth code. See implementations for more details.
2831
*/
29-
abstract class FederatedCredential(val federatedSignInProviderName: FederatedSignInProviderName)
32+
abstract class MsaFederatedCredential(@SerializedName("signInProviderName") val signInProviderName: MsaFederatedSignInProviderName)

common/src/main/java/com/microsoft/identity/common/internal/msafederation/FederatedSignInParameters.kt renamed to common/src/main/java/com/microsoft/identity/common/internal/msafederation/MsaFederatedSignInParameters.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ package com.microsoft.identity.common.internal.msafederation
2525
/**
2626
* Parameters for Federated Sign In. e.g. SignInWithGoogleParameters for Google.
2727
*/
28-
abstract class FederatedSignInParameters {
29-
abstract val providerName: FederatedSignInProviderName
28+
abstract class MsaFederatedSignInParameters {
29+
abstract val providerName: MsaFederatedSignInProviderName
3030
}

common/src/main/java/com/microsoft/identity/common/internal/msafederation/FederatedSignInProviderFactory.kt renamed to common/src/main/java/com/microsoft/identity/common/internal/msafederation/MsaFederatedSignInProviderFactory.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ import com.microsoft.identity.common.internal.msafederation.google.SignInWithGoo
2929
* Factory class to get the Federated Sign In Provider based on provider type in parameters
3030
* Currently only Google is supported.
3131
*/
32-
internal object FederatedSignInProviderFactory {
32+
internal object MsaFederatedSignInProviderFactory {
3333

3434
/**
3535
* Get the Federated Sign In Provider based on provider type in parameters.
3636
*/
37-
fun getProvider(parameters: FederatedSignInParameters): IFederatedSignInProvider {
37+
fun getProvider(parameters: MsaFederatedSignInParameters): IMsaFederatedSignInProvider {
3838
return when (parameters.providerName) {
39-
FederatedSignInProviderName.GOOGLE -> GoogleSignInProvider.create(parameters as SignInWithGoogleParameters, MsaFederationConstants.GOOGLE_MSA_WEB_CLIENT_ID)
39+
MsaFederatedSignInProviderName.GOOGLE -> GoogleSignInProvider.create(parameters as SignInWithGoogleParameters, MsaFederationConstants.GOOGLE_MSA_WEB_CLIENT_ID)
4040

4141
else -> {
4242
throw IllegalArgumentException("Unsupported provider type")

0 commit comments

Comments
 (0)