Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit ebb7724

Browse files
Merged Custom Auth & Firebase Auth
1 parent ff45125 commit ebb7724

File tree

6 files changed

+182
-19
lines changed

6 files changed

+182
-19
lines changed

firebase-common.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ declare module "nativescript-plugin-firebase" {
1717
* or the tokenProviderFn function that returns a promise to provide the token.
1818
* See: https://firebase.google.com/docs/auth/server
1919
*/
20-
CUSTOM
20+
CUSTOM,
21+
/**
22+
* This requires you to setup Facebook Auth in the Firebase console.
23+
*/
24+
FACEBOOK
2125
}
2226

2327
/**

firebase-common.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ var firebase = {};
33
firebase.LoginType = {
44
ANONYMOUS: "anonymous",
55
PASSWORD: "password",
6-
CUSTOM: "custom"
6+
CUSTOM: "custom",
7+
FACEBOOK: "facebook"
78
};
89

910
firebase.QueryOrderByType = {
@@ -46,7 +47,7 @@ firebase.removeAuthStateListener = function(listener) {
4647

4748
firebase.hasAuthStateListener = function(listener) {
4849
return firebase.authStateListeners.indexOf(listener) >= 0;
49-
}
50+
};
5051

5152
firebase.notifyAuthStateListeners = function(data) {
5253
firebase.authStateListeners.forEach(function (listener) {
@@ -60,6 +61,6 @@ firebase.notifyAuthStateListeners = function(data) {
6061
console.error("Firebase AuthStateListener failed to trigger", listener, ex);
6162
}
6263
});
63-
}
64+
};
6465

6566
module.exports = firebase;

firebase.android.js

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,49 @@ firebase.init = function (arg) {
120120
});
121121
};
122122

123+
firebase.getCurrentUser = function (arg) {
124+
return new Promise(function (resolve, reject) {
125+
try {
126+
if (instance === null) {
127+
reject("Run init() first!");
128+
return;
129+
}
130+
131+
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
132+
var user = firebaseAuth.getCurrentUser();
133+
console.log("getCurrentUser: " + user);
134+
if (user !== null) {
135+
resolve({
136+
uid: user.getUid(),
137+
name: user.getDisplayName(),
138+
email: user.getEmail(),
139+
// TODO add these properties, see https://firebase.google.com/docs/auth/android/manage-users#get_a_users_profile
140+
// provider: authData.getProvider(),
141+
// expiresAtUnixEpochSeconds: authData.getExpires(),
142+
profileImageURL: user.getPhotoUrl()
143+
// token: user.getToken() // can be used to auth with a backend server
144+
/*
145+
TODO sync with these iOS properties:
146+
uid: user.uid,
147+
anonymous: user.anonymous,
148+
provider: user.providerID,
149+
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null,
150+
email: user.email,
151+
emailVerified: user.emailVerified,
152+
name: user.displayName,
153+
refreshToken: user.refreshToken,
154+
*/
155+
});
156+
} else {
157+
reject();
158+
}
159+
} catch (ex) {
160+
console.log("Error in firebase.getCurrentUser: " + ex);
161+
reject(ex);
162+
}
163+
});
164+
};
165+
123166
firebase.logout = function (arg) {
124167
return new Promise(function (resolve, reject) {
125168
try {
@@ -141,24 +184,36 @@ function toLoginResult(user) {
141184
// provider: authData.getProvider(),
142185
// expiresAtUnixEpochSeconds: authData.getExpires(),
143186
profileImageURL: user.getPhotoUrl()
144-
};
187+
// token: user.getToken() // can be used to auth with a backend server
188+
};
145189
}
146190

191+
firebase.authStateListener = null;
192+
147193
firebase.login = function (arg) {
148194
return new Promise(function (resolve, reject) {
149195
try {
150196
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
151-
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
152-
onComplete: function (task) {
153-
if (!task.isSuccessful()) {
154-
reject("Logging in the user failed");
155-
} else {
156-
var user = task.getResult().getUser();
197+
198+
if (firebase.authStateListener !== null) {
199+
firebaseAuth.removeAuthStateListener(firebase.authStateListener);
200+
}
201+
202+
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
203+
onAuthStateChanged: function (fbAuth) {
204+
console.log("--- auth state changed: " + fbAuth);
205+
var user = fbAuth.getCurrentUser();
206+
console.log("--- user: " + user);
207+
if (user !== null) {
157208
resolve(toLoginResult(user));
209+
} else {
210+
// reject("Logging in the user failed");
158211
}
159212
}
160213
});
161214

215+
firebaseAuth.addAuthStateListener(firebase.authStateListener);
216+
162217
if (arg.type === firebase.LoginType.ANONYMOUS) {
163218
var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({
164219
onFailure: function (throwable) {
@@ -170,6 +225,15 @@ firebase.login = function (arg) {
170225
if (!arg.email || !arg.password) {
171226
reject("Auth type emailandpassword requires an email and password argument");
172227
} else {
228+
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
229+
onComplete: function (task) {
230+
if (!task.isSuccessful()) {
231+
reject("Logging in the user failed");
232+
} else {
233+
// the AuthStateListener.onAuthStateChanged callback will resolve the promise
234+
}
235+
}
236+
});
173237
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
174238
}
175239
} else if (arg.type === firebase.LoginType.CUSTOM) {
@@ -188,6 +252,10 @@ firebase.login = function (arg) {
188252
}
189253
)
190254
}
255+
256+
} else if (arg.type === firebase.LoginType.FACEBOOK) {
257+
// TODO see https://firebase.google.com/docs/auth/android/facebook-login#authenticate_with_firebase
258+
191259
} else {
192260
reject ("Unsupported auth type: " + arg.type);
193261
}

firebase.ios.js

Lines changed: 86 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var firebase = require("./firebase-common");
22
var types = require("utils/types");
3+
var frame = require("ui/frame");
34

45
firebase.toJsObject = function(objCObj) {
56
if (objCObj === null || typeof objCObj != "object") {
@@ -78,6 +79,9 @@ firebase.init = function (arg) {
7879
FIRAuth.auth().addAuthStateDidChangeListener(firebase.authStateListener);
7980
}
8081

82+
// TODO only if Facebook is available.. perhaps check for the class to exist?
83+
FBSDKAppEvents.activateApp();
84+
8185
resolve(instance);
8286
} catch (ex) {
8387
console.log("Error in firebase.init: " + ex);
@@ -86,6 +90,38 @@ firebase.init = function (arg) {
8690
});
8791
};
8892

93+
firebase.getCurrentUser = function (arg) {
94+
return new Promise(function (resolve, reject) {
95+
try {
96+
var fAuth = FIRAuth.auth();
97+
if (fAuth === null) {
98+
reject("Run init() first!");
99+
return;
100+
}
101+
102+
var user = fAuth.currentUser;
103+
console.log("getCurrentUser: " + user);
104+
if (user) {
105+
resolve({
106+
uid: user.uid,
107+
anonymous: user.anonymous,
108+
provider: user.providerID,
109+
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null,
110+
email: user.email,
111+
emailVerified: user.emailVerified,
112+
name: user.displayName,
113+
refreshToken: user.refreshToken,
114+
});
115+
} else {
116+
reject();
117+
}
118+
} catch (ex) {
119+
console.log("Error in firebase.getCurrentUser: " + ex);
120+
reject(ex);
121+
}
122+
});
123+
};
124+
89125
firebase.logout = function (arg) {
90126
return new Promise(function (resolve, reject) {
91127
try {
@@ -101,10 +137,13 @@ firebase.logout = function (arg) {
101137
function toLoginResult(user) {
102138
return user && {
103139
uid: user.uid,
140+
anonymous: user.anonymous,
104141
provider: user.providerID,
105-
profileImageURL: user.photoURL,
142+
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null,
106143
email: user.email,
107-
name: user.displayName
144+
emailVerified: user.emailVerified,
145+
name: user.displayName,
146+
refreshToken: user.refreshToken,
108147
};
109148
}
110149

@@ -115,10 +154,6 @@ firebase.login = function (arg) {
115154
if (error) {
116155
reject(error.localizedDescription);
117156
} else {
118-
console.log(user);
119-
console.log(JSON.stringify(user));
120-
console.log(firebase.toJsObject(user));
121-
122157
resolve(toLoginResult(user));
123158

124159
firebase.notifyAuthStateListeners({
@@ -158,6 +193,51 @@ firebase.login = function (arg) {
158193
}
159194
)
160195
}
196+
197+
} else if (arg.type === firebase.LoginType.FACEBOOK) {
198+
var onFacebookCompletion = function(fbSDKLoginManagerLoginResult, error) {
199+
if (error) {
200+
console.log("FB login error " + error);
201+
reject(error.localizedDescription);
202+
} else if (fbSDKLoginManagerLoginResult.isCancelled) {
203+
reject("login cancelled");
204+
} else {
205+
console.log("fAuth.currentUser 2: " + fAuth.currentUser);
206+
207+
// headless facebook auth
208+
// var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(fbSDKLoginManagerLoginResult.token.tokenString);
209+
var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString);
210+
console.log("fIRAuthCredential: " + fIRAuthCredential);
211+
212+
console.log("fAuth.currentUser 3: " + fAuth.currentUser);
213+
if (fAuth.currentUser) {
214+
// link credential, note that you only want to do this if this user doesn't already use fb as an auth provider
215+
var onCompletionLink = function (user, error) {
216+
if (error) {
217+
// ignore, as this one was probably already linked, so just return the user
218+
log("--- linking error: " + error.localizedDescription);
219+
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion);
220+
} else {
221+
onCompletion(user);
222+
}
223+
};
224+
fAuth.currentUser.linkWithCredentialCompletion(fIRAuthCredential, onCompletionLink);
225+
226+
} else {
227+
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion);
228+
}
229+
}
230+
};
231+
232+
// this requires you to set the appid and customurlscheme in app_resources/.plist
233+
var fbSDKLoginManager = FBSDKLoginManager.new();
234+
//fbSDKLoginManager.loginBehavior = FBSDKLoginBehavior.Web;
235+
236+
fbSDKLoginManager.logInWithReadPermissionsFromViewControllerHandler(
237+
["public_profile", "email"],
238+
null, // the viewcontroller param can be null since by default topmost is taken
239+
onFacebookCompletion);
240+
161241
} else {
162242
reject ("Unsupported auth type: " + arg.type);
163243
}

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
"keywords": [
1717
"NativeScript",
1818
"Firebase",
19-
"Database"
19+
"Database",
20+
"Authentication",
21+
"Facebook",
22+
"Google"
2023
],
2124
"author": "Telerik / Eddy Verbruggen <[email protected]>",
2225
"license": {

platforms/ios/Podfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
pod 'Firebase/Database', '~> 3.2.0'
2-
pod 'Firebase/Auth', '~> 3.2.0'
2+
pod 'Firebase/Auth', '~> 3.2.0'
3+
4+
# required for Facebook Auth
5+
pod 'FBSDKCoreKit'
6+
pod 'FBSDKLoginKit'
7+
8+
# required for Google Auth
9+
#pod 'GoogleSignIn'

0 commit comments

Comments
 (0)