Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Google Password Policy constraints, on FirebaseUI #2128

Open
smlima opened this issue May 23, 2023 · 1 comment
Open

Support for Google Password Policy constraints, on FirebaseUI #2128

smlima opened this issue May 23, 2023 · 1 comment

Comments

@smlima
Copy link

smlima commented May 23, 2023

Step 3: Describe the problem:

I'm working on an app that uses the Google Identity platform (GIdP), and we're setting the password policy to be way more restricted than the normal 6 chars that firebaseUI has on Android (and also iOS, but will create a separate issue for it).
So it would be interesting to be able to show on the signup screen, instead of a generic error say exactly which policies are failing, because that information does come down from GIdP. Because if the user knows that the password must include an Uppercase, then he will add it, instead of going round and round, or contact support asking why he can't create an account.

I believe It would be a simple change to have a somewhat FirebaseAuthPasswordPolicyException coming down from firebase.auth, with all the required info and then check at RegisterEmailFragment for that exception and then show the failing policy elements on the UI.

We could eventually hack it on FirebaseUI of something like
`public class FirebaseAuthPasswordPolicyException extends Exception {

public static boolean instance(Exception e) {
    return e.getMessage().contains("PASSWORD_DOES_NOT_MEET_REQUIREMENTS");
}

public FirebaseAuthPasswordPolicyException(Exception e) {
    super(e);
}

public String prettyMessage() {
    String mesg = getMessage();
    int index1 = mesg.lastIndexOf("[");
    int index2 = mesg.indexOf("]");

    String errorM = mesg.substring(index1+1, index2);

    return errorM.replace(", ", "\n");
}

}
`
But I believe this should come from above, not created on the FirebaseUI.

and then on the RegisterEmailFragment class ,line 122


            protected void onFailure(@NonNull Exception e) {
                if (e instanceof FirebaseAuthWeakPasswordException) {
                    mPasswordInput.setError(getResources().getQuantityString(
                            R.plurals.fui_error_weak_password,
                            R.integer.fui_min_password_length));
                } else if (e instanceof FirebaseAuthInvalidCredentialsException) {
                    mEmailInput.setError(getString(R.string.fui_invalid_email_address));
                } else if (e instanceof FirebaseAuthAnonymousUpgradeException) {
                    IdpResponse response = ((FirebaseAuthAnonymousUpgradeException) e).getResponse();
                    mListener.onMergeFailure(response);
                } else if (e instanceof FirebaseAuthPasswordPolicyException) {
                    mPasswordInput.setError(((FirebaseAuthPasswordPolicyException) e).prettyMessage());
                } else {
                    // General error message, this branch should not be invoked but
                    // covers future API changes
                    mEmailInput.setError(getString(R.string.fui_email_account_creation_error));
                }
            }

And on the EmailProviderResponseHandler

authOperationManager.createOrLinkUserWithEmailAndPassword(getAuth(),
                getArguments(),
                email,
                password)
                .continueWithTask(new ProfileMerger(response))
                .addOnFailureListener(new TaskFailureLogger(TAG, "Error creating user"))
                .addOnSuccessListener(result -> handleSuccess(response, result))
                .addOnFailureListener(e -> {
                    if (e instanceof FirebaseAuthUserCollisionException) {
                        if (authOperationManager.canUpgradeAnonymous(getAuth(),
                                getArguments())) {
                            AuthCredential credential = EmailAuthProvider.getCredential(email,
                                    password);
                            handleMergeFailure(credential);
                        } else {
                            Log.w(TAG, "Got a collision error during a non-upgrade flow", e);

                            // Collision with existing user email without anonymous upgrade
                            // it should be very hard for the user to even get to this error
                            // due to CheckEmailFragment.
                            ProviderUtils.fetchTopProvider(getAuth(), getArguments(), email)
                                    .addOnSuccessListener(new StartWelcomeBackFlow(email))
                                    .addOnFailureListener(e1 -> setResult(Resource.forFailure(
                                            e1)));
                        }
                    } else if (FirebaseAuthPasswordPolicyException.instance(e)) {
                        setResult(Resource.forFailure(new FirebaseAuthPasswordPolicyException(e)));
                    } else {
                        setResult(Resource.forFailure(e));
                    }
                });

And this should be enough for exposing the password policy failures.

What do you think?

@jrgcubano
Copy link

Any news regarding this @thatfiredev?. I think it makes a lot of sense to implement it. Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants