-
-
Save codediodeio/5e02b605f2ab015f2fb1e60497bd46bf to your computer and use it in GitHub Desktop.
import { Injectable } from '@angular/core'; | |
import { AngularFireDatabaseModule, AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; | |
import { AngularFireAuth } from 'angularfire2/auth'; | |
import { Router } from "@angular/router"; | |
import * as firebase from 'firebase'; | |
@Injectable() | |
export class AuthService { | |
authState: any = null; | |
constructor(private afAuth: AngularFireAuth, | |
private db: AngularFireDatabase, | |
private router:Router) { | |
this.afAuth.authState.subscribe((auth) => { | |
this.authState = auth | |
}); | |
} | |
// Returns true if user is logged in | |
get authenticated(): boolean { | |
return this.authState !== null; | |
} | |
// Returns current user data | |
get currentUser(): any { | |
return this.authenticated ? this.authState : null; | |
} | |
// Returns | |
get currentUserObservable(): any { | |
return this.afAuth.authState | |
} | |
// Returns current user UID | |
get currentUserId(): string { | |
return this.authenticated ? this.authState.uid : ''; | |
} | |
// Anonymous User | |
get currentUserAnonymous(): boolean { | |
return this.authenticated ? this.authState.isAnonymous : false | |
} | |
// Returns current user display name or Guest | |
get currentUserDisplayName(): string { | |
if (!this.authState) { return 'Guest' } | |
else if (this.currentUserAnonymous) { return 'Anonymous' } | |
else { return this.authState['displayName'] || 'User without a Name' } | |
} | |
//// Social Auth //// | |
githubLogin() { | |
const provider = new firebase.auth.GithubAuthProvider() | |
return this.socialSignIn(provider); | |
} | |
googleLogin() { | |
const provider = new firebase.auth.GoogleAuthProvider() | |
return this.socialSignIn(provider); | |
} | |
facebookLogin() { | |
const provider = new firebase.auth.FacebookAuthProvider() | |
return this.socialSignIn(provider); | |
} | |
twitterLogin(){ | |
const provider = new firebase.auth.TwitterAuthProvider() | |
return this.socialSignIn(provider); | |
} | |
private socialSignIn(provider) { | |
return this.afAuth.auth.signInWithPopup(provider) | |
.then((credential) => { | |
this.authState = credential.user | |
this.updateUserData() | |
}) | |
.catch(error => console.log(error)); | |
} | |
//// Anonymous Auth //// | |
anonymousLogin() { | |
return this.afAuth.auth.signInAnonymously() | |
.then((user) => { | |
this.authState = user | |
this.updateUserData() | |
}) | |
.catch(error => console.log(error)); | |
} | |
//// Email/Password Auth //// | |
emailSignUp(email:string, password:string) { | |
return this.afAuth.auth.createUserWithEmailAndPassword(email, password) | |
.then((user) => { | |
this.authState = user | |
this.updateUserData() | |
}) | |
.catch(error => console.log(error)); | |
} | |
emailLogin(email:string, password:string) { | |
return this.afAuth.auth.signInWithEmailAndPassword(email, password) | |
.then((user) => { | |
this.authState = user | |
this.updateUserData() | |
}) | |
.catch(error => console.log(error)); | |
} | |
// Sends email allowing user to reset password | |
resetPassword(email: string) { | |
var auth = firebase.auth(); | |
return auth.sendPasswordResetEmail(email) | |
.then(() => console.log("email sent")) | |
.catch((error) => console.log(error)) | |
} | |
//// Sign Out //// | |
signOut(): void { | |
this.afAuth.auth.signOut(); | |
this.router.navigate(['/']) | |
} | |
//// Helpers //// | |
private updateUserData(): void { | |
// Writes user name and email to realtime db | |
// useful if your app displays information about users or for admin features | |
let path = `users/${this.currentUserId}`; // Endpoint on firebase | |
let data = { | |
email: this.authState.email, | |
name: this.authState.displayName | |
} | |
this.db.object(path).update(data) | |
.catch(error => console.log(error)); | |
} | |
} |
Just saw your comment. It is defined as a typescript getter at line 24. You should not be getting an error...
get authenticated(): boolean {
return this.authState !== null;
}
Hi @codediodeio,
Please help me knowing how recover Location/Home Location from 19 LOC. (this.authState = auth). I can find all the details like
- Display Name
- Email ID
- UID number
- Phone number
Is there something I need to set in the social account ( facebook, google) for this or any specific key I need to look at in the this.authState object ?
How I can bind errors to my dom?
pls, how do I store a users display name when using createUserWithEmailAndPassword? thanks in advance
Do we get a token after authentication?
currentUserToken(): any { return firebase.auth().currentUser.getIdToken(false).then(idToken => { return localStorage.setItem('userToken', idToken); }).catch(error => { return error; }) }
Hi -- Please note that 'FirebaseListObservable' throws the following error: Module "module" has no exported member 'FirebaseListObservable'
Can you make the code work beyond [email protected]? Importing the full package from the 'firebase' gets a runtime warning, but all my attempts to import from 'firebase/app' and 'firebase/auth' failed.
Hi - I'm trying to adapt this code but it doesn't completely make sense - you keep referencing 'this.authenticated' but 'authenticated' is never actually declared within auth.service.ts. Using the same code in my project brings up an error:
Property 'authenticated' does not exist on type 'AuthService'.
Is there a reason for this? Is it something that has been omitted on purpose, or by design?