Authentication
Authentication can be tricky. Information is a hot commodity.
Let's save ourselves a headache and use a third part service handle it.
Google's a good choice. They've already got all of our data anyway, so if they get hacked we're all screwed!
Why Authenticate?
- Restrict access
- Save user data
- Track site use
- Provide a customized experience
Barriers to Entry
- How hard is it to get into your site?
- How hard should it be?
- What parts of the site are accessible to which users?
Authentication with Firebase
Firebase makes authentication very easy. They have a variety of different methods availiable for logging in, and provide integration for other services' authorization methods as well.
Not only that, but their documentation is extremely thorough.
Email/Password Login
Enable 'Email and Password' in the Sign-in Method tab under Authentication in your Firebase app.
- Get the user's email and password from your front end (probably through a form)
- Pass the email and password to Firebase's login method:
firebase.auth().createUserWithEmailAndPassword(email, password)
This method will return a promise that will eventually resolve to the full user object
Logging in with Google
- Enable in Firebase
-
Set up the google auth provider where you initialized your firebase app
- >
const googleProvider = new firebase.auth.GoogleAuthProvider();
- >
-
Use the
.signInWithPopup
method on your firebase auth object passing the provider as an argument- >
firebaseApp.auth().signWithPopup(googleProvider)
- >
This should probably be done as the response to some event (e.g. a button being clicked)
Lab: Setting up a Login Page
- Go back to the app we set up in the "Configuring your App to work with Firebase" lab
-
Build a front end that allows you to:
- login with email and password
- login with Google
and then redirect to a personalized user dashboard
celebrate
Logging in with Other Providers
Logging in with other providers is trickier since you are reaching outside the Google ecosystem. In most cases you need to set up an OAuth application with the auth provider as well (e.g. GitHub, Facebook, Yahoo, etc.) and link that to both your web application and firebase.
Firebase Roles
Firebase has several ways to handle users with different roles.
Regardless of which method you use to assign user roles you will need to set up some rules for accessing (or restricting access to) your database.
Real Time Database Rules
You can set up rules for who can read from, or write to different sections of the database under the "rules" tab of your database.
- Rules are setup in a JSON like format mimicing the structure of your database
- Keys appended with a
$
represent variables - if
.read
is set to true the user has view access to that section of the database - if
.write
is set to true the user has edit access to that section -
You can access other sections of the database throught the
root
keyword which brings you to the top level of the database- and using the
.child('someSection')
to referencesomeSection
of your database
- and using the
-
All values in rules must be either booleans, or strings
- but you can write JS expressions as strings, and Firebase will interpret them.
User Access
{
"rules": {
"users": {
"$user": {
".read": "$user === auth.uid",
".write": "$user === auth.uid"
}
}
}
}
This ruleset allows a user to read and write to a custom section of the database (the key is their user ID) and restricts them from accessing any other sections of the database.
Database Methods
-
All database methods are chained off the database object
- You can initialize the database object with
firebasApp.database()
- You can initialize the database object with
-
Once you connect to the database you will need to setup a reference to the section of the database you're interacting with
-
database.ref('/users/' + userID)
would reference a specific user's section given the database structure from the previous slide.
-
.set(...)
passing a JavaScript object as the argument to adds entries to your database.update(...)
passing a JavaScript object as the argument updates fields-
use the
.on(...)
event listener to read from the database- the first argument to
.on
should always be the string 'value' - the second argument is a callback function that determines what to do with that value
- the first argument to
Lab: Set up an Admin User
- Going back to the Firebase app we've been building up let's assign one user as an administrator
-
When the administrator signs in they should see a list of all the users in the app
- and be able to delete them from the app
When a non-admin user signs in they should still only see their own information
The User Object
Features:
- enforces one user per email
- tracks user data
- stored seperately from the database
Anti-Features:
- unalterable; create, read, and delete only
- super big and hard to parse
User Tokens
Firebase can be set up to generate authentication tokens when a user signs up.
If you want to generate tokens you will need to use the Firebase Admin SDK instead of the standard Firebase SDK
Unlike the user object this token can be manipulated by your JavaScript application, and is a good place to store metadata for user accounts. The setup can be a bit tricky, so for only one or two levels of authentication it may be easier to hard code those rules into your database
Storing User Data
Setting up a section of the database to store user information is a good way to allow your end users to control their settings providing a customizable experience.
It's also a good way to track user data for use by adminstrators/moderators on your site.
Lab: Extending the Dashboard
Let's extend our front end app some more!
-
When a user logs in
- if they haven't already chosen a favorite color display a form asking them to choose a color
-
Once a color has been chosen the next time that user logs in the background of their dashboard should be that color
- and they should no longer be asked to enter their favorite color
- but there should be a button which opens a form allowing them to change the color
- Authentication
- Why Authenticate?
- Barriers to Entry
- Authentication with Firebase
- Email/Password Login
- Logging in with Google
- Lab: Setting up a Login Page
- Logging in with Other Providers
- Firebase Roles
- Real Time Database Rules
- User Access
- Database Methods
- Lab: Set up an Admin User
- The User Object
- User Tokens
- Storing User Data
- Lab: Extending the Dashboard
- Labs