Created
May 8, 2017 16:41
-
-
Save codediodeio/5e02b605f2ab015f2fb1e60497bd46bf to your computer and use it in GitHub Desktop.
Angular4 Firebase authentication service using OAuth, Anonymous, and Email/Password. Designed specifically for changes introduced in AngularFire2 4.0.0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} |
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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How I can bind errors to my dom?