2017-03-02 11:30:08 +00:00
package io.invertase.firebase.auth ;
import android.util.Log ;
2017-03-15 20:05:09 +00:00
import android.net.Uri ;
import android.support.annotation.NonNull ;
2017-03-02 11:30:08 +00:00
2017-05-12 17:21:24 +01:00
import java.util.List ;
2017-03-13 17:23:41 +00:00
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
2017-03-02 11:30:08 +00:00
import com.facebook.react.bridge.Arguments ;
2017-03-13 17:23:41 +00:00
import com.facebook.react.bridge.Promise ;
2017-03-02 11:30:08 +00:00
import com.facebook.react.bridge.ReactApplicationContext ;
import com.facebook.react.bridge.ReactContextBaseJavaModule ;
import com.facebook.react.bridge.ReactMethod ;
2017-05-12 17:21:24 +01:00
import com.facebook.react.bridge.WritableArray ;
2017-03-02 11:30:08 +00:00
import com.facebook.react.bridge.WritableMap ;
import com.facebook.react.bridge.ReadableMap ;
import com.facebook.react.bridge.ReactContext ;
import com.google.android.gms.tasks.OnCompleteListener ;
2017-03-13 17:23:41 +00:00
import com.google.android.gms.tasks.OnFailureListener ;
import com.google.android.gms.tasks.OnSuccessListener ;
2017-03-02 11:30:08 +00:00
import com.google.android.gms.tasks.Task ;
import com.google.firebase.auth.AuthCredential ;
import com.google.firebase.auth.AuthResult ;
2017-05-25 14:45:03 +01:00
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException ;
2017-03-17 23:33:55 +00:00
import com.google.firebase.auth.GithubAuthProvider ;
2017-05-25 14:45:03 +01:00
import com.google.firebase.auth.ProviderQueryResult ;
2017-03-17 23:33:55 +00:00
import com.google.firebase.auth.TwitterAuthProvider ;
2017-05-12 17:21:24 +01:00
import com.google.firebase.auth.UserInfo ;
2017-03-02 11:30:08 +00:00
import com.google.firebase.auth.UserProfileChangeRequest ;
import com.google.firebase.auth.FacebookAuthProvider ;
import com.google.firebase.auth.FirebaseAuth ;
import com.google.firebase.auth.FirebaseAuthException ;
import com.google.firebase.auth.FirebaseUser ;
import com.google.firebase.auth.GetTokenResult ;
import com.google.firebase.auth.GoogleAuthProvider ;
import com.google.firebase.auth.EmailAuthProvider ;
import io.invertase.firebase.Utils ;
@SuppressWarnings ( "ThrowableResultOfMethodCallIgnored" )
public class RNFirebaseAuth extends ReactContextBaseJavaModule {
private static final String TAG = "RNFirebaseAuth" ;
private ReactContext mReactContext ;
private FirebaseAuth mAuth ;
private FirebaseAuth . AuthStateListener mAuthListener ;
public RNFirebaseAuth ( ReactApplicationContext reactContext ) {
super ( reactContext );
mReactContext = reactContext ;
mAuth = FirebaseAuth . getInstance ();
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "RNFirebaseAuth:initialized" );
2017-03-02 11:30:08 +00:00
}
@Override
public String getName () {
return TAG ;
}
2017-03-14 19:04:16 +00:00
/**
* Add a new auth state listener - if one doesn't exist already
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-13 20:02:44 +00:00
public void addAuthStateListener () {
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "addAuthStateListener" );
2017-03-02 11:30:08 +00:00
if ( mAuthListener == null ) {
mAuthListener = new FirebaseAuth . AuthStateListener () {
@Override
public void onAuthStateChanged ( @NonNull FirebaseAuth firebaseAuth ) {
FirebaseUser user = firebaseAuth . getCurrentUser ();
WritableMap msgMap = Arguments . createMap ();
if ( user != null ) {
msgMap . putBoolean ( "authenticated" , true );
2017-03-15 20:05:09 +00:00
msgMap . putMap ( "user" , firebaseUserToMap ( user ));
2017-03-13 17:23:41 +00:00
Utils . sendEvent ( mReactContext , "onAuthStateChanged" , msgMap );
2017-03-02 11:30:08 +00:00
} else {
msgMap . putBoolean ( "authenticated" , false );
2017-03-13 17:23:41 +00:00
Utils . sendEvent ( mReactContext , "onAuthStateChanged" , msgMap );
2017-03-02 11:30:08 +00:00
}
}
};
mAuth . addAuthStateListener ( mAuthListener );
}
}
2017-03-13 20:02:44 +00:00
/**
* Removes the current auth state listener
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-15 20:05:09 +00:00
public void removeAuthStateListener () {
Log . d ( TAG , "removeAuthStateListener" );
2017-03-02 11:30:08 +00:00
if ( mAuthListener != null ) {
mAuth . removeAuthStateListener ( mAuthListener );
}
}
2017-03-13 20:02:44 +00:00
/**
* signOut
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-13 20:02:44 +00:00
public void signOut ( final Promise promise ) {
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "signOut" );
2017-03-13 20:02:44 +00:00
if ( mAuth == null || mAuth . getCurrentUser () == null ) {
promiseNoUser ( promise , true );
} else {
mAuth . signOut ();
promiseNoUser ( promise , false );
}
}
/**
* signInAnonymously
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
*/
@ReactMethod
public void signInAnonymously ( final Promise promise ) {
Log . d ( TAG , "signInAnonymously" );
mAuth . signInAnonymously ()
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
2017-03-02 11:38:43 +00:00
@Override
2017-03-13 20:02:44 +00:00
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInAnonymously:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInAnonymously:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
}
2017-03-13 20:02:44 +00:00
/**
* createUserWithEmailAndPassword
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param email
* @param password
* @param promise
*/
@ReactMethod
public void createUserWithEmailAndPassword ( final String email , final String password , final Promise promise ) {
Log . d ( TAG , "createUserWithEmailAndPassword" );
mAuth . createUserWithEmailAndPassword ( email , password )
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
@Override
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "createUserWithEmailAndPassword:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "createUserWithEmailAndPassword:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-13 20:02:44 +00:00
}
});
}
2017-03-14 19:04:16 +00:00
/**
* signInWithEmailAndPassword
*
* @param email
* @param password
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-14 19:04:16 +00:00
public void signInWithEmailAndPassword ( final String email , final String password , final Promise promise ) {
Log . d ( TAG , "signInWithEmailAndPassword" );
2017-03-02 11:30:08 +00:00
mAuth . signInWithEmailAndPassword ( email , password )
2017-03-14 19:04:16 +00:00
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
2017-03-02 11:38:43 +00:00
@Override
2017-03-14 19:04:16 +00:00
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInWithEmailAndPassword:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInWithEmailAndPassword:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-14 19:04:16 +00:00
}
});
}
/**
* signInWithCustomToken
*
* @param token
* @param promise
*/
@ReactMethod
public void signInWithCustomToken ( final String token , final Promise promise ) {
Log . d ( TAG , "signInWithCustomToken" );
mAuth . signInWithCustomToken ( token )
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
@Override
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInWithCustomToken:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInWithCustomToken:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
}
2017-03-15 20:05:09 +00:00
/**
* sendPasswordResetEmail
*
* @param email
* @param promise
*/
@ReactMethod
public void sendPasswordResetEmail ( final String email , final Promise promise ) {
Log . d ( TAG , "sendPasswordResetEmail" );
mAuth . sendPasswordResetEmail ( email )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "sendPasswordResetEmail:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "sendPasswordResetEmail:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-15 20:05:09 +00:00
}
}
});
}
/**
* getCurrentUser - returns the current user, probably no need for this due to
* js side already listening for user auth changes
*
* @param promise
*/
@ReactMethod
public void getCurrentUser ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "getCurrentUser" );
if ( user == null ) {
promiseNoUser ( promise , false );
} else {
promiseWithUser ( user , promise );
}
}
2017-03-15 20:17:04 +00:00
/* ----------------------
* .currentUser methods
* ---------------------- */
2017-03-15 12:57:36 +00:00
/**
* delete
*
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-14 19:04:16 +00:00
public void delete ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "delete" );
if ( user != null ) {
user . delete ()
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "delete:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "delete:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-14 19:04:16 +00:00
}
}
});
} else {
2017-03-15 20:17:04 +00:00
Log . e ( TAG , "delete:failure:noCurrentUser" );
2017-03-14 19:04:16 +00:00
promiseNoUser ( promise , true );
}
}
2017-03-15 20:17:04 +00:00
/**
* reload
*
* @param promise
*/
@ReactMethod
public void reload ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
2017-03-18 00:30:26 +00:00
Log . d ( TAG , "reload" );
2017-03-15 20:17:04 +00:00
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "reload:failure:noCurrentUser" );
} else {
user . reload ()
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "reload:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "reload:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-15 20:17:04 +00:00
}
}
});
}
}
2017-03-18 00:30:26 +00:00
/**
* sendEmailVerification
*
* @param promise
*/
@ReactMethod
public void sendEmailVerification ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "sendEmailVerification" );
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "sendEmailVerification:failure:noCurrentUser" );
} else {
user . sendEmailVerification ()
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "sendEmailVerification:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "sendEmailVerification:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
}
}
/**
* updateEmail
*
2017-03-18 00:40:55 +00:00
* @param email
2017-03-18 00:30:26 +00:00
* @param promise
*/
@ReactMethod
public void updateEmail ( final String email , final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "updateEmail" );
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "updateEmail:failure:noCurrentUser" );
} else {
user . updateEmail ( email )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "updateEmail:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "updateEmail:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
}
}
2017-03-14 19:04:16 +00:00
2017-03-18 00:40:55 +00:00
/**
* updatePassword
*
* @param password
* @param promise
*/
@ReactMethod
public void updatePassword ( final String password , final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "updatePassword" );
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "updatePassword:failure:noCurrentUser" );
} else {
user . updatePassword ( password )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "updatePassword:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "updatePassword:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
}
}
2017-03-18 01:09:37 +00:00
/**
* updateProfile
*
* @param props
* @param promise
*/
@ReactMethod
public void updateProfile ( ReadableMap props , final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "updateProfile" );
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "updateProfile:failure:noCurrentUser" );
} else {
UserProfileChangeRequest . Builder profileBuilder = new UserProfileChangeRequest . Builder ();
if ( props . hasKey ( "displayName" )) {
String displayName = props . getString ( "displayName" );
profileBuilder . setDisplayName ( displayName );
}
2017-04-05 09:09:45 +01:00
if ( props . hasKey ( "photoURL" )) {
String photoURLStr = props . getString ( "photoURL" );
Uri uri = Uri . parse ( photoURLStr );
2017-03-18 01:09:37 +00:00
profileBuilder . setPhotoUri ( uri );
}
UserProfileChangeRequest profileUpdates = profileBuilder . build ();
user . updateProfile ( profileUpdates )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "updateProfile:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "updateProfile:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
}
}
2017-03-14 19:04:16 +00:00
/**
* signInWithCredential
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
@ReactMethod
public void signInWithCredential ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
2017-03-17 23:33:55 +00:00
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
Log . d ( TAG , "signInWithCredential" );
mAuth . signInWithCredential ( credential )
. addOnCompleteListener ( new OnCompleteListener < AuthResult > () {
@Override
public void onComplete ( @NonNull Task < AuthResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "signInWithCredential:onComplete:success" );
2017-03-18 00:04:17 +00:00
promiseWithUser ( task . getResult (). getUser (), promise );
2017-03-17 23:33:55 +00:00
} else {
Exception exception = task . getException ();
Log . e ( TAG , "signInWithCredential:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
2017-03-14 19:04:16 +00:00
}
2017-03-02 11:30:08 +00:00
}
2017-07-04 18:22:18 +01:00
/**
2017-07-05 14:16:35 +01:00
* confirmPasswordReset
*
2017-07-04 18:22:18 +01:00
* @param code
* @param newPassword
* @param promise
*/
@ReactMethod
2017-07-05 14:16:35 +01:00
public void confirmPasswordReset ( String code , String newPassword , final Promise promise ) {
Log . d ( TAG , "confirmPasswordReset" );
mAuth . confirmPasswordReset ( code , newPassword )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "confirmPasswordReset:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "confirmPasswordReset:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
2017-07-04 18:22:18 +01:00
}
2017-07-05 14:16:35 +01:00
}
});
}
/**
* applyActionCode
*
* @param code
* @param promise
*/
@ReactMethod
public void applyActionCode ( String code , final Promise promise ) {
Log . d ( TAG , "applyActionCode" );
mAuth . applyActionCode ( code ). addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "applyActionCode:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "applyActionCode:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
2017-07-04 18:22:18 +01:00
}
2017-03-16 12:19:34 +00:00
/**
* link
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-16 12:19:34 +00:00
public void link ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
2017-03-17 23:33:55 +00:00
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "link" );
if ( user != null ) {
user . linkWithCredential ( credential )
. addOnCompleteListener ( new OnCompleteListener < AuthResult > () {
@Override
public void onComplete ( @NonNull Task < AuthResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "link:onComplete:success" );
2017-03-18 00:04:17 +00:00
promiseWithUser ( task . getResult (). getUser (), promise );
2017-03-17 23:33:55 +00:00
} else {
Exception exception = task . getException ();
Log . e ( TAG , "link:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
2017-03-16 12:19:34 +00:00
}
2017-03-18 00:04:17 +00:00
/**
* reauthenticate
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
@ReactMethod
public void reauthenticate ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "reauthenticate" );
if ( user != null ) {
user . reauthenticate ( credential )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "reauthenticate:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "reauthenticate:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
}
2017-03-16 12:19:34 +00:00
/**
2017-03-17 23:33:55 +00:00
* Returns an instance of AuthCredential for the specified provider
2017-03-16 12:19:34 +00:00
*
2017-03-17 23:33:55 +00:00
* @param provider
* @param authToken
* @param authSecret
* @return
2017-03-16 12:19:34 +00:00
*/
2017-03-17 23:33:55 +00:00
public AuthCredential getCredentialForProvider ( String provider , String authToken , String authSecret ) {
switch ( provider ) {
case "facebook" :
return FacebookAuthProvider . getCredential ( authToken );
case "google" :
2017-03-17 23:51:26 +00:00
return GoogleAuthProvider . getCredential ( authToken , authSecret );
2017-03-17 23:33:55 +00:00
case "twitter" :
return TwitterAuthProvider . getCredential ( authToken , authSecret );
case "github" :
return GithubAuthProvider . getCredential ( authToken );
case "password" :
return EmailAuthProvider . getCredential ( authToken , authSecret );
default :
return null ;
2017-03-02 11:30:08 +00:00
}
}
2017-03-16 12:35:03 +00:00
/**
* getToken
*
* @param promise
*/
@ReactMethod
2017-03-30 10:55:16 +01:00
public void getToken ( final Boolean forceRefresh , final Promise promise ) {
2017-03-16 12:35:03 +00:00
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "getToken" );
if ( user != null ) {
2017-03-30 10:55:16 +01:00
user . getToken ( forceRefresh )
2017-03-16 12:35:03 +00:00
. addOnCompleteListener ( new OnCompleteListener < GetTokenResult > () {
@Override
public void onComplete ( @NonNull Task < GetTokenResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "getToken:onComplete:success" );
promise . resolve ( task . getResult (). getToken ());
} else {
Exception exception = task . getException ();
Log . e ( TAG , "getToken:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-16 12:35:03 +00:00
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
2017-05-25 14:45:03 +01:00
/**
* fetchProvidersForEmail
*
* @param promise
*/
@ReactMethod
public void fetchProvidersForEmail ( final String email , final Promise promise ) {
Log . d ( TAG , "fetchProvidersForEmail" );
mAuth . fetchProvidersForEmail ( email )
2017-07-05 14:16:35 +01:00
. addOnCompleteListener ( new OnCompleteListener < ProviderQueryResult > () {
@Override
public void onComplete ( @NonNull Task < ProviderQueryResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "fetchProvidersForEmail:onComplete:success" );
List < String > providers = task . getResult (). getProviders ();
WritableArray array = Arguments . createArray ();
2017-05-25 14:45:03 +01:00
2017-07-05 14:16:35 +01:00
if ( providers != null ) {
for ( String provider : providers ) {
array . pushString ( provider );
2017-05-25 14:45:03 +01:00
}
}
2017-07-05 14:16:35 +01:00
promise . resolve ( array );
} else {
Exception exception = task . getException ();
Log . d ( TAG , "fetchProvidersForEmail:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
2017-05-25 14:45:03 +01:00
}
2017-07-05 14:16:35 +01:00
}
});
2017-05-25 14:45:03 +01:00
}
2017-03-13 17:23:41 +00:00
/* ------------------
* INTERNAL HELPERS
* ---------------- */
/**
2017-03-13 20:02:44 +00:00
* Resolves or rejects an auth method promise without a user (user was missing)
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
* @param isError
*/
private void promiseNoUser ( Promise promise , Boolean isError ) {
if ( isError ) {
2017-05-25 14:45:03 +01:00
promise . reject ( "auth/no-current-user" , "No user currently signed in." );
2017-03-13 20:02:44 +00:00
} else {
promise . resolve ( null );
}
}
/**
2017-03-13 20:14:17 +00:00
* promiseWithUser
*
2017-03-13 20:02:44 +00:00
* @param user
* @param promise
*/
private void promiseWithUser ( final FirebaseUser user , final Promise promise ) {
if ( user != null ) {
2017-03-13 20:14:17 +00:00
WritableMap userMap = firebaseUserToMap ( user );
promise . resolve ( userMap );
2017-03-13 20:02:44 +00:00
} else {
promiseNoUser ( promise , true );
}
}
/**
2017-03-17 22:00:13 +00:00
* promiseRejectAuthException
2017-03-15 20:17:04 +00:00
*
2017-03-17 22:00:13 +00:00
* @param promise
* @param exception
2017-03-13 20:02:44 +00:00
*/
2017-03-17 22:00:13 +00:00
private void promiseRejectAuthException ( Promise promise , Exception exception ) {
2017-03-13 17:23:41 +00:00
String code = "UNKNOWN" ;
String message = exception . getMessage ();
2017-05-25 14:45:03 +01:00
String invalidEmail = "The email address is badly formatted." ;
2017-03-13 17:23:41 +00:00
2017-03-15 18:09:14 +00:00
try {
FirebaseAuthException authException = ( FirebaseAuthException ) exception ;
code = authException . getErrorCode ();
message = authException . getMessage ();
} catch ( Exception e ) {
2017-06-15 12:47:40 +01:00
Matcher matcher = Pattern . compile ( "\\[(.*):.*\\]" ). matcher ( message );
2017-03-15 18:09:14 +00:00
if ( matcher . find ()) {
2017-06-15 12:47:40 +01:00
code = matcher . group ( 1 ). trim ();
2017-03-15 18:09:14 +00:00
switch ( code ) {
case "INVALID_CUSTOM_TOKEN" :
message = "The custom token format is incorrect. Please check the documentation." ;
break ;
case "CUSTOM_TOKEN_MISMATCH" :
message = "The custom token corresponds to a different audience." ;
break ;
case "INVALID_CREDENTIAL" :
message = "The supplied auth credential is malformed or has expired." ;
break ;
case "INVALID_EMAIL" :
2017-05-25 14:45:03 +01:00
message = invalidEmail ;
2017-03-15 18:09:14 +00:00
break ;
case "WRONG_PASSWORD" :
message = "The password is invalid or the user does not have a password." ;
break ;
case "USER_MISMATCH" :
message = "The supplied credentials do not correspond to the previously signed in user." ;
break ;
case "REQUIRES_RECENT_LOGIN" :
message = "This operation is sensitive and requires recent authentication. Log in again before retrying this request." ;
break ;
case "ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" :
message = "An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address." ;
break ;
case "EMAIL_ALREADY_IN_USE" :
message = "The email address is already in use by another account." ;
break ;
case "CREDENTIAL_ALREADY_IN_USE" :
message = "This credential is already associated with a different user account." ;
break ;
2017-03-15 18:17:57 +00:00
case "USER_DISABLED" :
2017-03-15 18:09:14 +00:00
message = "The user account has been disabled by an administrator." ;
break ;
case "USER_TOKEN_EXPIRED" :
message = "The user\'s credential is no longer valid. The user must sign in again." ;
break ;
case "USER_NOT_FOUND" :
message = "There is no user record corresponding to this identifier. The user may have been deleted." ;
break ;
case "INVALID_USER_TOKEN" :
message = "The user\'s credential is no longer valid. The user must sign in again." ;
break ;
case "WEAK_PASSWORD" :
message = "The given password is invalid." ;
break ;
case "OPERATION_NOT_ALLOWED" :
message = "This operation is not allowed. You must enable this service in the console." ;
break ;
}
2017-03-13 17:23:41 +00:00
}
}
2017-05-25 14:45:03 +01:00
if ( code . equals ( "UNKNOWN" ) && exception instanceof FirebaseAuthInvalidCredentialsException ) {
code = "INVALID_EMAIL" ;
message = invalidEmail ;
}
2017-03-17 22:00:13 +00:00
code = "auth/" + code . toLowerCase (). replace ( "error_" , "" ). replace ( '_' , '-' );
promise . reject ( code , message , exception );
2017-03-13 17:23:41 +00:00
}
2017-03-15 20:05:09 +00:00
2017-05-12 17:21:24 +01:00
/**
* Converts a List of UserInfo instances into the correct format to match the web sdk
2017-07-05 14:16:35 +01:00
*
2017-05-12 17:21:24 +01:00
* @param providerData List<UserInfo> user.getProviderData()
* @return WritableArray array
*/
private WritableArray convertProviderData ( List <? extends UserInfo > providerData ) {
WritableArray output = Arguments . createArray ();
for ( UserInfo userInfo : providerData ) {
WritableMap userInfoMap = Arguments . createMap ();
userInfoMap . putString ( "providerId" , userInfo . getProviderId ());
userInfoMap . putString ( "uid" , userInfo . getUid ());
userInfoMap . putString ( "displayName" , userInfo . getDisplayName ());
final Uri photoUrl = userInfo . getPhotoUrl ();
if ( photoUrl != null ) {
userInfoMap . putString ( "photoURL" , photoUrl . toString ());
} else {
userInfoMap . putNull ( "photoURL" );
}
userInfoMap . putString ( "email" , userInfo . getEmail ());
output . pushMap ( userInfoMap );
}
return output ;
}
2017-03-17 22:00:13 +00:00
/**
* firebaseUserToMap
*
* @param user
* @return
*/
private WritableMap firebaseUserToMap ( FirebaseUser user ) {
WritableMap userMap = Arguments . createMap ();
final String email = user . getEmail ();
final String uid = user . getUid ();
final String provider = user . getProviderId ();
final String name = user . getDisplayName ();
final Boolean verified = user . isEmailVerified ();
final Uri photoUrl = user . getPhotoUrl ();
userMap . putString ( "uid" , uid );
userMap . putString ( "providerId" , provider );
userMap . putBoolean ( "emailVerified" , verified );
userMap . putBoolean ( "isAnonymous" , user . isAnonymous ());
if ( email != null ) {
userMap . putString ( "email" , email );
} else {
userMap . putNull ( "email" );
}
if ( name != null ) {
userMap . putString ( "displayName" , name );
} else {
userMap . putNull ( "displayName" );
}
if ( photoUrl != null ) {
userMap . putString ( "photoURL" , photoUrl . toString ());
} else {
userMap . putNull ( "photoURL" );
}
2017-05-12 17:21:24 +01:00
userMap . putArray ( "providerData" , convertProviderData ( user . getProviderData ()));
2017-03-18 01:09:37 +00:00
2017-03-17 22:00:13 +00:00
return userMap ;
}
2017-03-02 11:30:08 +00:00
}