nativescript-plugin-firebase
Advanced tools
Comparing version 3.0.1 to 3.1.0
@@ -14,3 +14,16 @@ declare module "nativescript-plugin-firebase" { | ||
*/ | ||
PASSWORD | ||
PASSWORD, | ||
/** | ||
* This requires you to pass either an authentication token generated by your backend server | ||
* or the tokenProviderFn function that returns a promise to provide the token. | ||
* See: https://firebase.google.com/docs/auth/server | ||
*/ | ||
CUSTOM, | ||
/** | ||
* This requires you to setup Facebook Auth in the Firebase console, | ||
* as well as uncommenting the SDK includes in include.gradle (Android) and Podfile (iOS). | ||
* | ||
* Note that this works well on iOS, but Android is work in progress. | ||
*/ | ||
} | ||
@@ -17,0 +30,0 @@ |
@@ -5,3 +5,5 @@ var firebase = {}; | ||
ANONYMOUS: "anonymous", | ||
PASSWORD: "password" | ||
PASSWORD: "password", | ||
CUSTOM: "custom", | ||
FACEBOOK: "facebook" | ||
}; | ||
@@ -29,2 +31,38 @@ | ||
firebase.authStateListeners = []; | ||
firebase.addAuthStateListener = function(listener) { | ||
if (firebase.authStateListeners.indexOf(listener) === -1) { | ||
firebase.authStateListeners.push(listener); | ||
} | ||
return true; | ||
}; | ||
firebase.removeAuthStateListener = function(listener) { | ||
var index = firebase.authStateListeners.indexOf(listener); | ||
if (index >= 0) { | ||
firebase.authStateListeners.splice(index, 1); | ||
} else { | ||
return false; | ||
} | ||
}; | ||
firebase.hasAuthStateListener = function(listener) { | ||
return firebase.authStateListeners.indexOf(listener) >= 0; | ||
}; | ||
firebase.notifyAuthStateListeners = function(data) { | ||
firebase.authStateListeners.forEach(function (listener) { | ||
try { | ||
if (listener.thisArg) { | ||
listener.onAuthStateChanged.apply(thisArg, data); | ||
} else { | ||
listener.onAuthStateChanged(data); | ||
} | ||
} catch (ex) { | ||
console.error("Firebase AuthStateListener failed to trigger", listener, ex); | ||
} | ||
}); | ||
}; | ||
module.exports = firebase; |
@@ -85,2 +85,4 @@ var appModule = require("application"); | ||
firebase.authStateListener = null; | ||
firebase.init = function (arg) { | ||
@@ -90,3 +92,2 @@ return new Promise(function (resolve, reject) { | ||
var fDatabase = com.google.firebase.database.FirebaseDatabase; | ||
// console.log("fDatabase: " + fDatabase); | ||
if (arg.persist) { | ||
@@ -100,2 +101,33 @@ fDatabase.getInstance().setPersistenceEnabled(true); | ||
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance(); | ||
if (arg.onAuthStateChanged) { | ||
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({ | ||
onAuthStateChanged: function (fbAuth) { | ||
console.log("--------- auth change (1), user: " + user); | ||
var user = fbAuth.getCurrentUser(); | ||
arg.onAuthStateChanged({ | ||
loggedIn: user !== null, | ||
user: toLoginResult(user) | ||
}); | ||
} | ||
}); | ||
firebaseAuth.addAuthStateListener(firebase.authStateListener); | ||
} | ||
// Listen to auth state changes | ||
if (!firebase.authStateListener) { | ||
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({ | ||
onAuthStateChanged: function (fbAuth) { | ||
console.log("--------- auth change (2), user: " + user); | ||
var user = fbAuth.getCurrentUser(); | ||
firebase.notifyAuthStateListeners({ | ||
loggedIn: user !== null, | ||
user: toLoginResult(user) | ||
}); | ||
} | ||
}); | ||
firebaseAuth.addAuthStateListener(firebase.authStateListener); | ||
} | ||
resolve(instance); | ||
@@ -109,2 +141,30 @@ } catch (ex) { | ||
firebase.getCurrentUser = function (arg) { | ||
return new Promise(function (resolve, reject) { | ||
try { | ||
if (instance === null) { | ||
reject("Run init() first!"); | ||
return; | ||
} | ||
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance(); | ||
var user = firebaseAuth.getCurrentUser(); | ||
console.log("getCurrentUser: " + user); | ||
if (user !== null) { | ||
resolve({ | ||
uid: user.getUid(), | ||
name: user.getDisplayName(), | ||
email: user.getEmail(), | ||
profileImageURL: user.getPhotoUrl() | ||
}); | ||
} else { | ||
reject(); | ||
} | ||
} catch (ex) { | ||
console.log("Error in firebase.getCurrentUser: " + ex); | ||
reject(ex); | ||
} | ||
}); | ||
}; | ||
firebase.logout = function (arg) { | ||
@@ -122,49 +182,36 @@ return new Promise(function (resolve, reject) { | ||
firebase.authStateListener = null; | ||
function toLoginResult(user) { | ||
if (user === null) { | ||
return false; | ||
} | ||
/* | ||
var providerData = user.getProviderData(); | ||
for (var i = 0; i < providerData.size(); i++) { | ||
var info = providerData.get(i); | ||
console.log("--- userInfo - provider: " + info.getProviderId()); | ||
} | ||
*/ | ||
return { | ||
uid: user.getUid(), | ||
name: user.getDisplayName(), | ||
email: user.getEmail(), | ||
// expiresAtUnixEpochSeconds: authData.getExpires(), | ||
profileImageURL: user.getPhotoUrl() | ||
// token: user.getToken() // can be used to auth with a backend server | ||
}; | ||
} | ||
firebase.login = function (arg) { | ||
return new Promise(function (resolve, reject) { | ||
try { | ||
/* | ||
var authorizer = new com.google.firebase.database.DatabaseReference.AuthResultHandler({ | ||
onAuthenticated: function (authData) { | ||
resolve({ | ||
uid: authData.getUid(), | ||
provider: authData.getProvider(), | ||
expiresAtUnixEpochSeconds: authData.getExpires(), | ||
profileImageURL: authData.getProviderData().get("profileImageURL"), | ||
token: authData.getToken() | ||
}); | ||
}, | ||
onAuthenticationError: function (databaseError) { | ||
reject(databaseError.getMessage()); | ||
} | ||
}); | ||
*/ | ||
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance(); | ||
if (firebase.authStateListener !== null) { | ||
firebaseAuth.removeAuthStateListener(firebase.authStateListener); | ||
} | ||
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({ | ||
onAuthStateChanged: function (fbAuth) { | ||
console.log("--- auth state changed: " + fbAuth); | ||
var user = fbAuth.getCurrentUser(); | ||
console.log("--- user: " + user); | ||
if (user !== null) { | ||
// signed in | ||
resolve({ | ||
uid: user.getUid(), | ||
name: user.getDisplayName(), | ||
email: user.getEmail(), | ||
// TODO add these properties, see https://firebase.google.com/docs/auth/android/manage-users#get_a_users_profile | ||
// provider: authData.getProvider(), | ||
// expiresAtUnixEpochSeconds: authData.getExpires(), | ||
profileImageURL: user.getPhotoUrl() | ||
// token: user.getToken() // can be used to auth with a backend server | ||
}); | ||
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({ | ||
onComplete: function (task) { | ||
// alert("login task: " + task.isSuccessful()); | ||
if (!task.isSuccessful()) { | ||
reject("Logging in the user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException())); | ||
} else { | ||
// reject("Logging in the user failed"); | ||
var user = task.getResult().getUser(); | ||
resolve(toLoginResult(user)); | ||
} | ||
@@ -174,11 +221,10 @@ } | ||
firebaseAuth.addAuthStateListener(firebase.authStateListener); | ||
if (arg.type === firebase.LoginType.ANONYMOUS) { | ||
var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({ | ||
onFailure: function (throwable) { | ||
reject("Anonymous login failed with message: " + throwable.getMessage()); | ||
} | ||
}); | ||
firebaseAuth.signInAnonymously().addOnFailureListener(onFailureListener); | ||
// var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({ | ||
// onFailure: function (throwable) { | ||
// reject("Anonymous login failed with message: " + throwable.getMessage()); | ||
// } | ||
// }); | ||
// firebaseAuth.signInAnonymously().addOnFailureListener(onFailureListener); | ||
firebaseAuth.signInAnonymously().addOnCompleteListener(onCompleteListener); | ||
} else if (arg.type === firebase.LoginType.PASSWORD) { | ||
@@ -188,13 +234,45 @@ if (!arg.email || !arg.password) { | ||
} else { | ||
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({ | ||
onComplete: function (task) { | ||
if (!task.isSuccessful()) { | ||
reject("Logging in the user failed"); | ||
} else { | ||
// the AuthStateListener.onAuthStateChanged callback will resolve the promise | ||
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener); | ||
} | ||
} else if (arg.type === firebase.LoginType.CUSTOM) { | ||
if (!arg.token && !arg.tokenProviderFn) { | ||
reject("Auth type custom requires a token or a tokenProviderFn argument"); | ||
} else if (arg.token) { | ||
firebaseAuth.signInWithCustomToken(arg.token).addOnCompleteListener(onCompleteListener); | ||
} else if (arg.tokenProviderFn) { | ||
arg.tokenProviderFn() | ||
.then( | ||
function (token) { | ||
firebaseAuth.signInWithCustomToken(arg.token).addOnCompleteListener(onCompleteListener); | ||
}, | ||
function (error) { | ||
reject(error); | ||
} | ||
); | ||
} | ||
} else if (arg.type === firebase.LoginType.FACEBOOK) { | ||
if (typeof(com.facebook) === "undefined") { | ||
reject("Facebook SDK not installed - see Podfile"); | ||
return; | ||
} | ||
// TODO see https://firebase.google.com/docs/auth/android/facebook-login#authenticate_with_firebase | ||
var fbLoginManager = com.facebook.login.LoginManager.getInstance(); | ||
var callbackManager = com.facebook.CallbackManager.Factory.create(); | ||
fbLoginManager.registerCallback( | ||
callbackManager, | ||
new com.facebook.FacebookCallback({ | ||
onSuccess: function (loginResult) { | ||
console.log("------------- fb callback"); | ||
console.log("------------- fb loginResult " + loginResult); | ||
} | ||
}); | ||
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener); | ||
} | ||
}) | ||
); | ||
var permissions = ["public_profile", "email"]; | ||
var activity = appModule.android.foregroundActivity; | ||
fbLoginManager.logInWithReadPermissions(foregroundActivity, permissions); | ||
} else { | ||
@@ -259,3 +337,3 @@ reject ("Unsupported auth type: " + arg.type); | ||
if (user === null) { | ||
reject("Please log the user in first"); | ||
reject("no current user"); | ||
} else { | ||
@@ -282,32 +360,44 @@ user.updatePassword(arg.newPassword).addOnCompleteListener(onCompleteListener); | ||
onComplete: function (task) { | ||
// see https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth#public-methods | ||
if (!task.isSuccessful()) { | ||
reject("Creating a user failed"); | ||
reject("Creating a user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException())); | ||
} else { | ||
// the AuthStateListener.onAuthStateChanged callback will resolve the promise | ||
var user = task.getResult().getUser(); | ||
resolve(toLoginResult(user)); | ||
} | ||
} | ||
}); | ||
firebaseAuth.createUserWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener); | ||
} | ||
} catch (ex) { | ||
console.log("Error in firebase.createUser: " + ex); | ||
reject(ex); | ||
} | ||
}); | ||
}; | ||
if (firebase.authStateListener !== null) { | ||
firebaseAuth.removeAuthStateListener(firebase.authStateListener); | ||
} | ||
firebase.deleteUser = function (arg) { | ||
return new Promise(function (resolve, reject) { | ||
try { | ||
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance(); | ||
var user = firebaseAuth.getCurrentUser(); | ||
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({ | ||
onAuthStateChanged: function (fbAuth) { | ||
console.log("--- auth state changed: " + fbAuth); | ||
var user = fbAuth.getCurrentUser(); | ||
if (user !== null) { | ||
// signed in | ||
resolve({ | ||
key: user.getUid() | ||
}); | ||
} | ||
if (user === null) { | ||
reject("no current user"); | ||
return; | ||
} | ||
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({ | ||
onComplete: function (task) { | ||
if (!task.isSuccessful()) { | ||
reject("Deleting a user failed. " + (task.getException() && task.getException().getReason ? task.getException().getReason() : task.getException())); | ||
} else { | ||
resolve(); | ||
} | ||
}); | ||
} | ||
}); | ||
firebaseAuth.addAuthStateListener(firebase.authStateListener); | ||
firebaseAuth.createUserWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener); | ||
} | ||
user.delete().addOnCompleteListener(onCompleteListener); | ||
} catch (ex) { | ||
console.log("Error in firebase.createUser: " + ex); | ||
console.log("Error in firebase.deleteUser: " + ex); | ||
reject(ex); | ||
@@ -314,0 +404,0 @@ } |
@@ -16,2 +16,6 @@ /// <reference path="firebase-common.d.ts"/> | ||
persist?: boolean; | ||
/** | ||
* Get notified when fi the user is logged in. | ||
*/ | ||
onAuthStateChange?: AuthStateChangeListener | ||
} | ||
@@ -66,2 +70,14 @@ | ||
password?: string; | ||
/** | ||
* The JSON Web Token (JWT) to use for authentication. | ||
* Use with LoginType.CUSTOM | ||
* See: https://firebase.google.com/docs/auth/server | ||
*/ | ||
token?: string; | ||
/** | ||
* A function that returns a promise with the JSON Web Token (JWT) to use for authentication. | ||
* Use with LoginType.CUSTOM | ||
* See: https://firebase.google.com/docs/auth/server | ||
*/ | ||
tokenProviderFn?: () => Promise<String>; | ||
} | ||
@@ -128,2 +144,12 @@ | ||
export interface AuthStateData { | ||
loggedIn?: boolean; | ||
user?: LoginResult; | ||
} | ||
export interface AuthStateChangeListener { | ||
onAuthStateChanged: (data: AuthStateData) => void; | ||
thisArg?: any; | ||
} | ||
export function init(options: InitOptions): Promise<any>; | ||
@@ -133,2 +159,3 @@ export function login(options: LoginOptions): Promise<LoginResult>; | ||
export function createUser(options: CreateUserOptions): Promise<CreateUserResult>; | ||
export function deleteUser(): Promise<any>; | ||
export function resetPassword(options: ResetPasswordOptions): Promise<any>; | ||
@@ -143,2 +170,5 @@ export function changePassword(options: ChangePasswordOptions): Promise<any>; | ||
export function addValueEventListener(onValueEvent: (data: FBData) => void, path: string): Promise<any>; | ||
export function addAuthStateListener(listener: AuthStateChangeListener): boolean; | ||
export function removeAuthStateListener(listener: AuthStateChangeListener): boolean; | ||
export function hasAuthStateListener(listener: AuthStateChangeListener): boolean; | ||
} |
var firebase = require("./firebase-common"); | ||
var types = require("utils/types"); | ||
var frame = require("ui/frame"); | ||
@@ -55,2 +56,4 @@ firebase.toJsObject = function(objCObj) { | ||
firebase.authStateListener = null; | ||
firebase.init = function (arg) { | ||
@@ -69,2 +72,30 @@ return new Promise(function (resolve, reject) { | ||
if (arg.onAuthStateChanged) { | ||
firebase.authStateListener = function(auth, user) { | ||
console.log("--------- auth change 1, user: " + user); | ||
arg.onAuthStateChanged({ | ||
loggedIn: user !== null, | ||
user: toLoginResult(user) | ||
}); | ||
}; | ||
FIRAuth.auth().addAuthStateDidChangeListener(firebase.authStateListener); | ||
} | ||
// Listen to auth state changes | ||
if (!firebase.authStateListener) { | ||
firebase.authStateListener = function(auth, user) { | ||
console.log("--------- auth change 2, user: " + user); | ||
firebase.notifyAuthStateListeners({ | ||
loggedIn: user !== null, | ||
user: toLoginResult(user) | ||
}); | ||
}; | ||
FIRAuth.auth().addAuthStateDidChangeListener(firebase.authStateListener); | ||
} | ||
// TODO can we move the stuff from app.js to here? | ||
if (typeof(FBSDKAppEvents) !== "undefined") { | ||
FBSDKAppEvents.activateApp(); | ||
} | ||
resolve(instance); | ||
@@ -78,2 +109,34 @@ } catch (ex) { | ||
firebase.getCurrentUser = function (arg) { | ||
return new Promise(function (resolve, reject) { | ||
try { | ||
var fAuth = FIRAuth.auth(); | ||
if (fAuth === null) { | ||
reject("Run init() first!"); | ||
return; | ||
} | ||
var user = fAuth.currentUser; | ||
console.log("getCurrentUser: " + user); | ||
if (user) { | ||
resolve({ | ||
uid: user.uid, | ||
// anonymous: user.anonymous, | ||
// provider: user.providerID, | ||
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null, | ||
email: user.email, | ||
emailVerified: user.emailVerified, | ||
name: user.displayName, | ||
refreshToken: user.refreshToken | ||
}); | ||
} else { | ||
reject(); | ||
} | ||
} catch (ex) { | ||
console.log("Error in firebase.getCurrentUser: " + ex); | ||
reject(ex); | ||
} | ||
}); | ||
}; | ||
firebase.logout = function (arg) { | ||
@@ -91,2 +154,15 @@ return new Promise(function (resolve, reject) { | ||
function toLoginResult(user) { | ||
return user && { | ||
uid: user.uid, | ||
// anonymous: user.anonymous, | ||
// provider: user.providerID, | ||
profileImageURL: user.photoURL ? user.photoURL.absoluteURL : null, | ||
email: user.email, | ||
emailVerified: user.emailVerified, | ||
name: user.displayName, | ||
refreshToken: user.refreshToken, | ||
}; | ||
} | ||
firebase.login = function (arg) { | ||
@@ -99,14 +175,7 @@ return new Promise(function (resolve, reject) { | ||
} else { | ||
console.log(user); | ||
console.log(JSON.stringify(user)); | ||
console.log(firebase.toJsObject(user)); | ||
resolve(toLoginResult(user)); | ||
resolve({ | ||
uid: user.uid, | ||
provider: user.providerID, | ||
profileImageURL: user.photoURL, | ||
email: user.email, | ||
name: user.displayName | ||
// expiresAtUnixEpochSeconds: user.expires, | ||
// token: user.token | ||
firebase.notifyAuthStateListeners({ | ||
loggedIn: true, | ||
user: user | ||
}); | ||
@@ -130,2 +199,68 @@ } | ||
} | ||
} else if (arg.type === firebase.LoginType.CUSTOM) { | ||
if (!arg.token && !arg.tokenProviderFn) { | ||
reject("Auth type custom requires a token or a tokenProviderFn argument"); | ||
} else if (arg.token) { | ||
fAuth.signInWithCustomToken(arg.token, onCompletion); | ||
} else if (arg.tokenProviderFn) { | ||
arg.tokenProviderFn() | ||
.then( | ||
function (token) { | ||
firebaseAuth.signInWithCustomToken(arg.token, onCompletion); | ||
}, | ||
function (error) { | ||
reject(error); | ||
} | ||
); | ||
} | ||
} else if (arg.type === firebase.LoginType.FACEBOOK) { | ||
if (typeof(FBSDKLoginManager) === "undefined") { | ||
reject("Facebook SDK not installed - see Podfile"); | ||
return; | ||
} | ||
var onFacebookCompletion = function(fbSDKLoginManagerLoginResult, error) { | ||
if (error) { | ||
console.log("FB login error " + error); | ||
reject(error.localizedDescription); | ||
} else if (fbSDKLoginManagerLoginResult.isCancelled) { | ||
reject("login cancelled"); | ||
} else { | ||
console.log("fAuth.currentUser 2: " + fAuth.currentUser); | ||
// headless facebook auth | ||
// var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(fbSDKLoginManagerLoginResult.token.tokenString); | ||
var fIRAuthCredential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString); | ||
console.log("fIRAuthCredential: " + fIRAuthCredential); | ||
console.log("fAuth.currentUser 3: " + fAuth.currentUser); | ||
if (fAuth.currentUser) { | ||
// link credential, note that you only want to do this if this user doesn't already use fb as an auth provider | ||
var onCompletionLink = function (user, error) { | ||
if (error) { | ||
// ignore, as this one was probably already linked, so just return the user | ||
log("--- linking error: " + error.localizedDescription); | ||
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion); | ||
} else { | ||
onCompletion(user); | ||
} | ||
}; | ||
fAuth.currentUser.linkWithCredentialCompletion(fIRAuthCredential, onCompletionLink); | ||
} else { | ||
fAuth.signInWithCredentialCompletion(fIRAuthCredential, onCompletion); | ||
} | ||
} | ||
}; | ||
// this requires you to set the appid and customurlscheme in app_resources/.plist | ||
var fbSDKLoginManager = FBSDKLoginManager.new(); | ||
//fbSDKLoginManager.loginBehavior = FBSDKLoginBehavior.Web; | ||
fbSDKLoginManager.logInWithReadPermissionsFromViewControllerHandler( | ||
["public_profile", "email"], // TODO allow user to pass this in | ||
null, // the viewcontroller param can be null since by default topmost is taken | ||
onFacebookCompletion); | ||
} else { | ||
@@ -180,3 +315,3 @@ reject ("Unsupported auth type: " + arg.type); | ||
if (user === null) { | ||
reject("Please log the user in first"); | ||
reject("no current user"); | ||
} else { | ||
@@ -219,2 +354,27 @@ user.updatePasswordCompletion(arg.newPassword, onCompletion); | ||
firebase.deleteUser = function (arg) { | ||
return new Promise(function (resolve, reject) { | ||
try { | ||
var user = FIRAuth.auth().currentUser; | ||
if (user === null) { | ||
reject("no current user"); | ||
return; | ||
} | ||
var onCompletion = function(user, error) { | ||
if (error) { | ||
reject(error.localizedDescription); | ||
} else { | ||
resolve(); | ||
} | ||
}; | ||
user.deleteWithCompletion(onCompletion); | ||
} catch (ex) { | ||
console.log("Error in firebase.deleteUser: " + ex); | ||
reject(ex); | ||
} | ||
}); | ||
}; | ||
firebase._addObservers = function(to, updateCallback) { | ||
@@ -221,0 +381,0 @@ to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildAdded, function (snapshot) { |
{ | ||
"name": "nativescript-plugin-firebase", | ||
"version": "3.0.1", | ||
"version": "3.1.0", | ||
"description" : "Fire. Base. Firebase!", | ||
@@ -19,3 +19,6 @@ "main" : "firebase.js", | ||
"Firebase", | ||
"Database" | ||
"Database", | ||
"Authentication", | ||
"Facebook", | ||
"Google" | ||
], | ||
@@ -22,0 +25,0 @@ "author": "Telerik / Eddy Verbruggen <eddyverbruggen@gmail.com>", |
140
README.md
@@ -68,3 +68,9 @@ # NativeScript Firebase plugin | ||
firebase.init({ | ||
persist: true // Allow disk persistence. Default false. | ||
persist: true, // Allow disk persistence. Default false. | ||
onAuthStateChanged: function(data) { // optional but useful to immediately re-logon the user when he re-visits your app | ||
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase"); | ||
if (data.loggedIn) { | ||
console.log("user's email address: " + (data.user.email ? data.user.email : "N/A")); | ||
} | ||
} | ||
}).then( | ||
@@ -227,3 +233,9 @@ function (instance) { | ||
### login | ||
v 1.1.0 of this plugin adds the capability to log your users in. Either anonymously or by email and password. | ||
v 1.1.0 of this plugin adds the capability to log your users in, either | ||
- anonymously, | ||
- by email and password, or | ||
- using a custom token, | ||
- using Facebook (experimental) | ||
You need to add support for those features in your Firebase instance at the 'Login & Auth' tab. | ||
@@ -233,2 +245,35 @@ | ||
#### Listening to auth state changes | ||
As stated [here](https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user) | ||
> The recommended way to get the current user is by setting a listener on the Auth object | ||
To listen to auth state changes you can register a listener like this (you may have done this already during `init` (see above): | ||
```js | ||
var listener = { | ||
onAuthStateChanged: function(data) { | ||
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase"); | ||
if (data.loggedIn) { | ||
console.log("User info", data.user); | ||
} | ||
}, | ||
thisArg: this | ||
}; | ||
firebase.addAuthStateListener(listener); | ||
``` | ||
To stop listening to auth state changed: | ||
```js | ||
firebase.removeAuthStateListener(listener); | ||
``` | ||
To check if already listening to auth state changes | ||
```js | ||
hasAuthStateListener(listener); | ||
``` | ||
#### Anonymous login | ||
@@ -268,21 +313,18 @@ ```js | ||
#### Creating a Password account | ||
#### Custom login | ||
Use this login type to authenticate against firebase using a token generated by your own backend server. | ||
See these [instructions on how to generate the authentication token](https://firebase.google.com/docs/auth/server). | ||
```js | ||
firebase.createUser({ | ||
email: 'eddyverbruggen@gmail.com', | ||
password: 'firebase' | ||
firebase.login({ | ||
// note that you need to generate the login token in your existing backend server | ||
type: firebase.LoginType.CUSTOM, | ||
token: token | ||
}).then( | ||
function (result) { | ||
dialogs.alert({ | ||
title: "User created", | ||
message: "userid: " + result.key, | ||
okButtonText: "Nice!" | ||
}) | ||
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token | ||
JSON.stringify(result); | ||
}, | ||
function (errorMessage) { | ||
dialogs.alert({ | ||
title: "No user created", | ||
message: errorMessage, | ||
okButtonText: "OK, got it" | ||
}) | ||
console.log(errorMessage); | ||
} | ||
@@ -292,4 +334,40 @@ ) | ||
#### Resetting a password | ||
#### Custom login | ||
Use this login type to authenticate against firebase using a token generated by your own backend server. | ||
See these [instructions on how to generate the authentication token](https://firebase.google.com/docs/auth/server). | ||
```js | ||
firebase.login({ | ||
// note that you need to generate the login token in your existing backend server | ||
type: firebase.LoginType.CUSTOM, | ||
token: token | ||
}).then( | ||
function (result) { | ||
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token | ||
JSON.stringify(result); | ||
}, | ||
function (errorMessage) { | ||
console.log(errorMessage); | ||
} | ||
) | ||
``` | ||
#### Facebook login | ||
On iOS this is rock solid, but on Android it's work in progress. If you want to use it for iOS open the `Podfile` in the plugin's `platforms/ios` folder and uncomment the Facebook line (you can't miss it). | ||
```js | ||
firebase.login({ | ||
type: firebase.LoginType.FACEBOOK | ||
}).then( | ||
function (result) { | ||
JSON.stringify(result); | ||
}, | ||
function (errorMessage) { | ||
console.log(errorMessage); | ||
} | ||
) | ||
``` | ||
### Resetting a password | ||
```js | ||
firebase.resetPassword({ | ||
@@ -308,3 +386,3 @@ email: 'useraccount@provider.com' | ||
#### Changing a password | ||
### Changing a password | ||
```js | ||
@@ -332,2 +410,26 @@ firebase.changePassword({ | ||
## Known issues | ||
On Android you could run into an error like this: | ||
``` | ||
com.android.dex.DexIndexOverflowException: method ID not in.. | ||
``` | ||
Congrats, you ran into [this issue](https://github.com/NativeScript/android-runtime/issues/344) | ||
which can be solved by adding `multiDexEnabled true` to your `app/App_Resources/Android/app.gradle` | ||
so it becomes something like this: | ||
``` | ||
android { | ||
defaultConfig { | ||
applicationId "my.package.id" | ||
multiDexEnabled true | ||
generatedDensities = [] | ||
} | ||
aaptOptions { | ||
additionalParameters "--no-version-vectors" | ||
} | ||
} | ||
``` | ||
## Pro tips | ||
@@ -350,5 +452,5 @@ | ||
- Possibly add more login mechanisms. | ||
- Add other Firebase 3.x SDK features (there's already a few feature requests in the GitHub issue tracker. | ||
## Credits | ||
The starting point for this plugin was [this great Gist](https://gist.github.com/jbristowe/c89a7bcae7fc9a035ee7) by [John Bristowe](https://github.com/jbristowe). |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
499064
14
1446
449