diff --git a/firebase-auth/build.gradle b/firebase-auth/build.gradle index badda96557..d44f9867e3 100644 --- a/firebase-auth/build.gradle +++ b/firebase-auth/build.gradle @@ -28,4 +28,6 @@ android { dependencies { api project(':play-services-basement') + + annotationProcessor project(':safe-parcel-processor') } diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt index ff4113332d..72b599f983 100644 --- a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/FirebaseAuthService.kt @@ -487,13 +487,27 @@ class FirebaseAuthServiceImpl(private val context: Context, override val lifecyc } override fun signInWithCredential(request: SignInWithCredentialAidlRequest, callbacks: IFirebaseAuthCallbacks) { - Log.d(TAG, "Not yet implemented: signInWithCredential") - callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + lifecycleScope.launchWhenStarted { + Log.d(TAG, "signInWithCredential request: ${request.request}") + try { + val tokenResult = client.verifyAssertion(request.request.requestUri, request.request.postBody, request.request.returnSecureToken, request.request.returnIdpCredential) + Log.d(TAG, "signInWithCredential callback: $tokenResult ") + val idToken = tokenResult.getString("idToken") + val refreshToken = tokenResult.getString("refreshToken") + val getTokenResponse = client.getTokenByRefreshToken(refreshToken).toGetTokenResponse() + val accountInfoResult = client.getAccountInfo(idToken = idToken).getJSONArray("users").getJSONObject(0).toGetAccountInfoUser() + Log.d(TAG, "signInWithCredential callback: onGetTokenResponseAndUser") + callbacks.onGetTokenResponseAndUser(getTokenResponse, accountInfoResult) + } catch (e: Exception) { + Log.w(TAG, "signInWithCredential callback: onFailure", e) + callbacks.onFailure(Status(CommonStatusCodes.INTERNAL_ERROR, e.message)) + } + } } override fun signInWithCredentialCompat(verifyAssertionRequest: VerifyAssertionRequest, callbacks: IFirebaseAuthCallbacks) { - Log.d(TAG, "Not yet implemented: signInWithCredentialCompat") - callbacks.onFailure(Status(CommonStatusCodes.CANCELED, "Not supported")) + Log.d(TAG, "signInWithCredentialCompat verifyAssertionRequest: $verifyAssertionRequest") + signInWithCredential(SignInWithCredentialAidlRequest(verifyAssertionRequest), callbacks) } override fun signInWithCustomToken(request: SignInWithCustomTokenAidlRequest, callbacks: IFirebaseAuthCallbacks) { diff --git a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt index ca391a6d20..072d4d9bf2 100644 --- a/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt +++ b/firebase-auth/core/src/main/kotlin/org/microg/gms/firebase/auth/IdentityToolkitClient.kt @@ -109,6 +109,13 @@ class IdentityToolkitClient(context: Context, private val apiKey: String, privat .put("token", token) .put("returnSecureToken", returnSecureToken)) + suspend fun verifyAssertion(requestUri: String? = null, postBody: String? = null, returnSecureToken: Boolean = true, returnIdpCredential: Boolean = true): JSONObject = + request("verifyAssertion", JSONObject() + .put("requestUri", requestUri) + .put("postBody", postBody) + .put("returnSecureToken", returnSecureToken) + .put("returnIdpCredential", returnIdpCredential)) + suspend fun verifyPassword(email: String? = null, password: String? = null, tenantId: String? = null, returnSecureToken: Boolean = true): JSONObject = request("verifyPassword", JSONObject() .put("email", email) diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java index 94190acb77..8e45a2d689 100644 --- a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/SignInWithCredentialAidlRequest.java @@ -5,8 +5,32 @@ package com.google.firebase.auth.api.internal; -import org.microg.safeparcel.AutoSafeParcelable; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class SignInWithCredentialAidlRequest extends AbstractSafeParcelable { + + @Field(1) + public VerifyAssertionRequest request; + + public SignInWithCredentialAidlRequest(VerifyAssertionRequest request) { + this.request = request; + } + + public SignInWithCredentialAidlRequest() { + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SignInWithCredentialAidlRequest.class); -public class SignInWithCredentialAidlRequest extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(SignInWithCredentialAidlRequest.class); } diff --git a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java index 47e3c22027..0a0b130ded 100644 --- a/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java +++ b/firebase-auth/src/main/java/com/google/firebase/auth/api/internal/VerifyAssertionRequest.java @@ -5,8 +5,55 @@ package com.google.firebase.auth.api.internal; -import org.microg.safeparcel.AutoSafeParcelable; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class VerifyAssertionRequest extends AbstractSafeParcelable { + + @Field(2) + public String requestUri; + @Field(3) + public String accessToken; + @Field(4) + public String idToken; + @Field(5) + public String instanceId; + @Field(6) + public String providerId; + @Field(7) + public String pendingIdToken; + @Field(8) + public String postBody; + @Field(9) + public String localId; + @Field(10) + public boolean returnIdpCredential; + @Field(11) + public boolean returnSecureToken; + @Field(12) + public String delegatedProjectNumber; + @Field(13) + public String sessionId; + @Field(14) + public String queryParameter; + @Field(15) + public String tenantId; + @Field(16) + public boolean returnRefreshToken; + @Field(17) + public String tenantProjectNumber; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(VerifyAssertionRequest.class); -public class VerifyAssertionRequest extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(VerifyAssertionRequest.class); }