# Firebase
Because I used it free, so it deserved free PR here
Firebase helps mobile and web app teams succeed
All of things, I'm concerned about Firebase, are relevant to web.
# Install
Full doc here (opens new window)
# 1. SDK JS
npm install --save firebase
# 2. Choose Products
To include only specific Firebase products (like Authentication and Database Realtime),
// Firebase App (the core Firebase SDK) 
// is always required and must be listed first
import * as firebase from "firebase/app";
// Add the Firebase products that you want to use
import "firebase/auth";
import "firebase/database";
# 3. Initilize App
Assume we need to set up Database Realtime
See here (opens new window) for more detail
// Set the configuration for your app
// TODO: Replace with your project's config object
var config = {
    apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com",
    storageBucket: "bucket.appspot.com",
    appId: "app-id",
};
firebase.initializeApp(config);
# authentication
Let's choose Google for example
# 1. Create Provider
var authProvider = new firebase.auth.GoogleAuthProvider();
# 2. Request Sign In
var result = await firebase.auth().signInWithPopup(authProvider);
// after user authenicated, you will have some info below
var token = result.credential.accessToken;
// The signed-in user info.
var user = result.user;
Or you can receive the result through the hook
 firebase.auth().onAuthStateChanged(function(user) {
    if (user) {
         // User is signed in.
        var displayName = user.displayName;
        var email = user.email;
        var emailVerified = user.emailVerified;
        var photoURL = user.photoURL;
        var isAnonymous = user.isAnonymous;
        var uid = user.uid;
        var providerData = user.providerData;
    } else {
        // User is signed out.
    }
});
# Database Realtime
# 1. Add Config
The same with Step 3 in Install . Then,
// Get a reference to the database service
var database = firebase.database();
# 2. Read
Assume we have data structure like this:
{
    "categories": {
        "cat_id1": {
            // cat data
        },
        "cat_id2": {
            // cat data
        },
    },
    "users": {
        "user_id1": {
            // data
        }
    }
}
Then our code looks like this:
# 3. Write
# 4. Sercurity Rule
- categories: can be only read from the outside and manage in Firebase Console
- users: user can only read & write on his own data
{
  "rules": {
    "categories": {
      ".read": true,
    },
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}