J'utilise firebase de google et j'ai quelques problèmes avec l'authentification de l'utilisateur. Après la connexion à Facebook, j'obtiens FirebaseUser dans AuthStateListener, mais comment puis-je détecter si cet utilisateur est connecté via Facebook ou autrement?
UPDATE Comme @Frank van Puffelen a déclaré FirebaseAuth.getInstance (). GetCurrentUser (). GetProviderId () Devrait renvoyer "facebook", mais dans mon cas, il renvoie "firebase". Maintenant, je ne peux pas comprendre quelle est la raison de ce comportement. Quand j'ai FacebookToken, je fais quelque chose comme ça:
AuthCredential credential = FacebookAuthProvider.getCredential(facebookToken.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
}
}
});
Et après que la méthode onComplete () ait été appelée, mon AuthStateListener obtient de l’utilisateur dont l’identifiant de fournisseur n’est pas «facebook» comme il se doit. Est-ce que je fais quelque chose de mal? J'ai suivi google officiel documentation
Dans les versions 3.x et supérieures, un seul utilisateur peut être connecté à plusieurs fournisseurs. Il n’existe donc plus le concept d’un ID fournisseur unique. En fait, lorsque vous appelez:
FirebaseAuth.getInstance().getCurrentUser().getProviderId()
Il retournera toujours firebase
.
Pour détecter si l'utilisateur était connecté à Facebook, vous devrez inspecter les données du fournisseur:
for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {
if (user.getProviderId().equals("facebook.com")) {
System.out.println("User is signed in with Facebook");
}
}
Dans mon application, j'utilise des comptes Anonymous Firebase. Lorsque je connecte l'authentification Firebase à un compte Facebook ou à un compte Google, je vérifie comme suit:
for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {
if (user.getProviderId().equals("facebook.com")) {
//For linked facebook account
Log.d("xx_xx_provider_info", "User is signed in with Facebook");
} else if (user.getProviderId().equals("google.com")) {
//For linked Google account
Log.d("xx_xx_provider_info", "User is signed in with Google");
}
}
Il existe des informations dans l’intention de réponse.
Reportez-vous à l'extrait suivant:
Le code de réponse est "phone", "google.com", "facebook.com" ou "Twitter.com" .
`import com.firebase.ui.auth.AuthUI; importer com.firebase.ui.auth.IdpResponse; ..... @Passer outre protected void onActivityResult (final int requestCode, int resultCode, Intent data) { super.onActivityResult (requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { progressBar.setVisibility (View.VISIBLE); IdpResponse response = IdpResponse.fromResultIntent (data); if (resultCode == RESULT_OK) { String providerCode = response.getProviderType (); ... } }
La solution la plus récente est:
Comme noté ici
var uiConfig = {
callbacks: {
signInSuccessWithAuthResult: function(authResult, redirectUrl) {
var providerId = authResult.additionalUserInfo.providerId;
//...
},
//..
}
et pour l'affichage en page
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
user.getIdToken().then(function (idToken) {
$('#user').text(welcomeName + "(" + localStorage.getItem("firebaseProviderId")+ ")");
$('#logged-in').show();
}
}
});