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

Simplify Java auth and remove possibility of user synchronisation issues #4

Merged
merged 1 commit into from
Nov 20, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 31 additions & 74 deletions android/src/main/java/io/fullstack/firestack/FirestackAuth.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;

import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
Expand All @@ -42,14 +41,12 @@ class FirestackAuthModule extends ReactContextBaseJavaModule {
// private Context context;
private ReactContext mReactContext;
private FirebaseAuth mAuth;
private FirebaseApp app;
private FirebaseUser user;
private FirebaseAuth.AuthStateListener mAuthListener;

public FirestackAuthModule(ReactApplicationContext reactContext) {
super(reactContext);
// this.context = reactContext;
mReactContext = reactContext;
mAuth = FirebaseAuth.getInstance();

Log.d(TAG, "New FirestackAuth instance");
}
Expand Down Expand Up @@ -78,16 +75,17 @@ private void callbackNoUser(Callback callback, Boolean isError) {

@ReactMethod
public void listenForAuth() {
if (mAuthListener == null || mAuth == null) {
if (mAuthListener == null) {
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
WritableMap msgMap = Arguments.createMap();
msgMap.putString("eventName", "listenForAuth");

if (FirestackAuthModule.this.user != null) {
if (user != null) {
// TODO move to helper
WritableMap userMap = getUserMap();
WritableMap userMap = getUserMap(user);
msgMap.putBoolean("authenticated", true);
msgMap.putMap("user", userMap);

Expand All @@ -98,8 +96,6 @@ public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
}
}
};

mAuth = FirebaseAuth.getInstance();
mAuth.addAuthStateListener(mAuthListener);
}
}
Expand All @@ -119,16 +115,13 @@ public void unlistenForAuth(final Callback callback) {

@ReactMethod
public void createUserWithEmail(final String email, final String password, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -141,16 +134,14 @@ public void onComplete(@NonNull Task<AuthResult> task) {

@ReactMethod
public void signInWithEmail(final String email, final String password, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -175,9 +166,6 @@ public void signInWithProvider(final String provider, final String authToken, fi
@ReactMethod
public void signInAnonymously(final Callback callback) {
Log.d(TAG, "signInAnonymously:called:");
mAuth = FirebaseAuth.getInstance();


mAuth.signInAnonymously()
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
Expand All @@ -186,8 +174,7 @@ public void onComplete(@NonNull Task<AuthResult> task) {

try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -200,17 +187,14 @@ public void onComplete(@NonNull Task<AuthResult> task) {

@ReactMethod
public void signInWithCustomToken(final String customToken, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

mAuth.signInWithCustomToken(customToken)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCustomToken:onComplete:" + task.isSuccessful());
try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -231,7 +215,7 @@ public void reauthenticateWithCredentialForProvider(final String provider, final

@ReactMethod
public void updateUserEmail(final String email, final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
user
Expand All @@ -242,8 +226,7 @@ public void onComplete(@NonNull Task<Void> task) {
try {
if (task.isSuccessful()) {
Log.d(TAG, "User email address updated");
FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser();
userCallback(u, callback);
userCallback(mAuth.getCurrentUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -259,7 +242,7 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void updateUserPassword(final String newPassword, final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
user.updatePassword(newPassword)
Expand All @@ -269,9 +252,7 @@ public void onComplete(@NonNull Task<Void> task) {
try {
if (task.isSuccessful()) {
Log.d(TAG, "User password updated");

FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser();
userCallback(u, callback);
userCallback(mAuth.getCurrentUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -287,8 +268,6 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void sendPasswordResetWithEmail(final String email, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

mAuth.sendPasswordResetEmail(email)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
Expand All @@ -310,7 +289,7 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void deleteUser(final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
user.delete()
.addOnCompleteListener(new OnCompleteListener<Void>() {
Expand Down Expand Up @@ -339,7 +318,7 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void sendEmailVerification(final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
user.sendEmailVerification()
Expand Down Expand Up @@ -371,7 +350,7 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void getToken(final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
user.getToken(true)
Expand Down Expand Up @@ -403,7 +382,7 @@ public void onComplete(@NonNull Task<GetTokenResult> task) {

@ReactMethod
public void updateUserProfile(ReadableMap props, final Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
FirebaseUser user = mAuth.getCurrentUser();

if (user != null) {
UserProfileChangeRequest.Builder profileBuilder = new UserProfileChangeRequest.Builder();
Expand All @@ -430,8 +409,7 @@ public void onComplete(@NonNull Task<Void> task) {
try {
if (task.isSuccessful()) {
Log.d(TAG, "User profile updated");
FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser();
userCallback(u, callback);
userCallback(mAuth.getCurrentUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -447,8 +425,7 @@ public void onComplete(@NonNull Task<Void> task) {

@ReactMethod
public void signOut(final Callback callback) {
FirebaseAuth.getInstance().signOut();
this.user = null;
mAuth.signOut();

WritableMap resp = Arguments.createMap();
resp.putString("status", "complete");
Expand All @@ -458,31 +435,26 @@ public void signOut(final Callback callback) {

@ReactMethod
public void getCurrentUser(final Callback callback) {
mAuth = FirebaseAuth.getInstance();

this.user = mAuth.getCurrentUser();
if (this.user == null) {
FirebaseUser user = mAuth.getCurrentUser();
if (user == null) {
callbackNoUser(callback, false);
} else {
Log.d("USRC", this.user.getUid());
userCallback(this.user, callback);
Log.d("USRC", user.getUid());
userCallback(user, callback);
}
}

// TODO: Check these things
@ReactMethod
public void googleLogin(String IdToken, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

AuthCredential credential = GoogleAuthProvider.getCredential(IdToken, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -495,17 +467,14 @@ public void onComplete(@NonNull Task<AuthResult> task) {

@ReactMethod
public void facebookLogin(String Token, final Callback callback) {
mAuth = FirebaseAuth.getInstance();

AuthCredential credential = FacebookAuthProvider.getCredential(Token);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
try {
if (task.isSuccessful()) {
FirestackAuthModule.this.user = task.getResult().getUser();
userCallback(FirestackAuthModule.this.user, callback);
userCallback(task.getResult().getUser(), callback);
} else {
userErrorCallback(task, callback);
}
Expand All @@ -517,24 +486,15 @@ public void onComplete(@NonNull Task<AuthResult> task) {
}

// Internal helpers
private void userCallback(FirebaseUser passedUser, final Callback callback) {

if (passedUser == null) {
mAuth = FirebaseAuth.getInstance();
this.user = mAuth.getCurrentUser();
} else {
this.user = passedUser;
}

if (this.user != null) {
this.user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
private void userCallback(final FirebaseUser user, final Callback callback) {
if (user != null) {
user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
try {
if (task.isSuccessful()) {
WritableMap userMap = getUserMap();
final String token = task.getResult().getToken();
userMap.putString("token", token);
WritableMap userMap = getUserMap(user);
userMap.putString("token", task.getResult().getToken());
callback.invoke(null, userMap);
} else {
userErrorCallback(task, callback);
Expand Down Expand Up @@ -567,11 +527,8 @@ private void userExceptionCallback(Exception ex, final Callback onFail) {
onFail.invoke(error);
}

private WritableMap getUserMap() {
private WritableMap getUserMap(FirebaseUser user) {
WritableMap userMap = Arguments.createMap();

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

if (user != null) {
final String email = user.getEmail();
final String uid = user.getUid();
Expand Down
7 changes: 0 additions & 7 deletions lib/modules/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,6 @@ export default class Auth extends Base {
// but this is ok as we fake it with the getCurrentUser below
FirestackAuthEvt.addListener('listenForAuth', this._onAuthStateChanged.bind(this));
FirestackAuth.listenForAuth();

this.getCurrentUser().then((u: Object) => {
this._onAuthStateChanged({ authenticated: !!u, user: u || null });
}).catch(() => {
// todo check if error contains user disabled message maybe and add a disabled flag?
this._onAuthStateChanged({ authenticated: false, user: null });
});
}

/**
Expand Down