Slide 1

Slide 1 text

Bringing Firebase Admin SDK to your server Henry Lim @henrylim96

Slide 2

Slide 2 text

Kamusta! Ako diay si Henry #DevFest18

Slide 3

Slide 3 text

#DevFest18

Slide 4

Slide 4 text

#DevFest18

Slide 5

Slide 5 text

#DevFest18 Firebase by Platform ● Android ● iOS ● Web ● Flutter ● And more ...

Slide 6

Slide 6 text

#DevFest18

Slide 7

Slide 7 text

#DevFest18 Firebase Admin SDK

Slide 8

Slide 8 text

#DevFest18 Firebase has got you covered Firebase provides a suite of SDKs, called Admin SDKs, for developing back-end software that interact with Firebase.

Slide 9

Slide 9 text

#DevFest18 Firebase Admin SDKs Access Firebase from … ● Servers owned or managed by app developers ● Cloud IaaS and PaaS environments ● Serverless platforms

Slide 10

Slide 10 text

#DevFest18 What can you do with Firebase Admin SDK

Slide 11

Slide 11 text

Firebase Admin SDK Features Feature Node.js Java Python Go C# Custom Token Minting ✓ ✓ ✓ ✓ ✓ ID Token Verification ✓ ✓ ✓ ✓ ✓ User Management ✓ ✓ ✓ ✓ Control Access With Custom Claims ✓ ✓ ✓ ✓ Refresh Token Revocation ✓ ✓ ✓ ✓ Import Users ✓ ✓ ✓ ✓ Session Cookie Management ✓ ✓ ✓ Realtime Database ✓ ✓ ✓ ✓ Cloud Messaging ✓ ✓ ✓ ✓ Manage Topic Subscriptions ✓ ✓ ✓ ✓ Cloud Storage ✓ ✓ ✓ ✓ Cloud Firestore ✓ ✓ ✓ ✓

Slide 12

Slide 12 text

#DevFest18

Slide 13

Slide 13 text

#DevFest18 Introducing Fire Lechon

Slide 14

Slide 14 text

#DevFest18

Slide 15

Slide 15 text

#DevFest18

Slide 16

Slide 16 text

#DevFest18

Slide 17

Slide 17 text

#DevFest18 Adding the Firebase Admin SDK

Slide 18

Slide 18 text

// Download the SDK (NPM)
 
 npm install firebase-admin --save #DevFest18

Slide 19

Slide 19 text

#DevFest18 Initialize the Firebase Admin SDK

Slide 20

Slide 20 text

// Initialize the SDK
 
 const admin = require('firebase-admin');
 const serviceAccount = require('path/to/ serviceAccountKey.json');
 
 admin.initializeApp({
 credential: admin.credential.cert(serviceAccount),
 databaseURL: 'https://.firebaseio.com'
 }); #DevFest18

Slide 21

Slide 21 text

#DevFest18

Slide 22

Slide 22 text

#DevFest18

Slide 23

Slide 23 text

// Initialize the SDK // Cloud Functions for Firebase
 
 const functions = require('firebase-functions');
 const admin = require('firebase-admin');
 
 admin.initializeApp(functions.config().firebase); #DevFest18

Slide 24

Slide 24 text

#DevFest18 A custom permissions model We want to define two classes of users - admin and regular users.

Slide 25

Slide 25 text

#DevFest18 Control Access with Custom Claims and Security Rules

Slide 26

Slide 26 text

// Firebase Realtime Database Rules
 
 {
 "rules": {
 "items": {
 ".read": true,
 ".write": "auth.token.admin === true",
 }
 }
 } #DevFest18

Slide 27

Slide 27 text

#DevFest18

Slide 28

Slide 28 text

document.querySelector('.form').addEventListener('submit', event => {
 event.preventDefault();
 database.ref('admin').push(document.querySelector('.form #email').value)
 .then(() => {
 alert('Added successfully!');
 window.location.replace('/');
 })
 .catch(error => {
 alert(error);
 })
 }); #DevFest18

Slide 29

Slide 29 text

exports.newAdmin = functions.database.ref(`admin/{email}`)
 .onCreate((snapshot, context) => {
 const email = context.params.email;
 admin.auth().getUserByEmail(email)
 .then(userRecord => {
 return userRecord.uid;
 })
 .then(uid => {
 return admin.auth().setCustomUserClaims(uid, {admin: true});
 })
 .catch(error => {
 console.log(error);
 })
 }) #DevFest18

Slide 30

Slide 30 text

exports.newAdmin = functions.database.ref(`admin/{email}`)
 .onCreate((snapshot, context) => {
 const email = context.params.email;
 admin.auth().getUserByEmail(email)
 .then(userRecord => {
 return userRecord.uid;
 })
 .then(uid => {
 return admin.auth().setCustomUserClaims(uid, {admin: true});
 })
 .catch(error => {
 console.log(error);
 })
 }) #DevFest18

Slide 31

Slide 31 text

// Firebase Realtime Database Rules
 
 {
 "rules": {
 "items": {
 ".read": true,
 ".write": "auth.token.admin === true",
 }
 }
 } #DevFest18

Slide 32

Slide 32 text

#DevFest18

Slide 33

Slide 33 text

#DevFest18 Send Messages to Topics

Slide 34

Slide 34 text

#DevFest18

Slide 35

Slide 35 text

var messaging = firebase.messaging(); var database = firebase.database();
 
 if ('serviceWorker' in navigator) {
 window.addEventListener('load', () => {
 navigator.serviceWorker.register('/firebase-messaging-sw.js')
 .then((registration) => {
 messaging.useServiceWorker(registration);
 })
 .then(() => {
 return messaging.requestPermission();
 })
 .then(() => {
 return messaging.getToken();
 })
 .then((token) => {
 database.ref('notification/' + token).set(true);
 })
 .catch((err) => {
 console.log('ServiceWorker registration failed: ', err);
 });
 });
 #DevFest18

Slide 36

Slide 36 text

var messaging = firebase.messaging(); var database = firebase.database();
 
 if ('serviceWorker' in navigator) {
 window.addEventListener('load', () => {
 navigator.serviceWorker.register('/firebase-messaging-sw.js')
 .then((registration) => {
 messaging.useServiceWorker(registration);
 })
 .then(() => {
 return messaging.requestPermission();
 })
 .then(() => {
 return messaging.getToken();
 })
 .then((token) => {
 database.ref('notification/' + token).set(true);
 })
 .catch((err) => {
 console.log('ServiceWorker registration failed: ', err);
 });
 });
 #DevFest18

Slide 37

Slide 37 text

exports.sendNotification = functions.database.ref(`items/{itemId}`)
 .onCreate((snapshot, context) => {
 const data = snapshot.val();
 const msg = admin.messaging.Message = {
 topic: 'new-restaurant',
 notification: {
 title: 'New Restaurant in FireLechon’,
 body: `We just added "${data.name}" to our collection. Enjoy!`
 }
 }
 return admin.messaging().send(msg)
 .then((resp) => {
 return resp;
 })
 .catch(() => {})
 }) #DevFest18

Slide 38

Slide 38 text

exports.sendNotification = functions.database.ref(`items/{itemId}`)
 .onCreate((snapshot, context) => {
 const data = snapshot.val();
 const msg = admin.messaging.Message = {
 topic: 'new-restaurant',
 notification: {
 title: 'New Restaurant in FireLechon’,
 body: `We just added "${data.name}" to our collection. Enjoy!`
 }
 }
 return admin.messaging().send(msg)
 .then((resp) => {
 return resp;
 })
 .catch(() => {})
 }) #DevFest18

Slide 39

Slide 39 text

#DevFest18

Slide 40

Slide 40 text

#DevFest18 What else you can do with Firebase Admin SDK

Slide 41

Slide 41 text

#DevFest18

Slide 42

Slide 42 text

#DevFest18

Slide 43

Slide 43 text

#DevFest18

Slide 44

Slide 44 text

Thank You Henry Lim @henrylim96