Slide 1

Slide 1 text

October 7th, 2018 at Glowfish Sathorn Bringing Firebase Admin SDK to your server Henry Lim @henrylim96

Slide 2

Slide 2 text

#FirebaseDevDay สวัสดี ครับ, ผมชื่อ เฮนรี่ ลิม

Slide 3

Slide 3 text

#FirebaseDevDay

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

#FirebaseDevDay Firebase Admin SDK

Slide 8

Slide 8 text

#FirebaseDevDay 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

#FirebaseDevDay 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

#FirebaseDevDay 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

No content

Slide 13

Slide 13 text

#FirebaseDevDay Introducing Fire Tomyam firetomyam.firebaseapp.com

Slide 14

Slide 14 text

#FirebaseDevDay

Slide 15

Slide 15 text

#FirebaseDevDay

Slide 16

Slide 16 text

#FirebaseDevDay

Slide 17

Slide 17 text

#FirebaseDevDay Add the Firebase Admin SDK

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

#FirebaseDevDay 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' });

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

#FirebaseDevDay

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);

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

#FirebaseDevDay 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", } } }

Slide 27

Slide 27 text

#FirebaseDevDay

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); }) });

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); }) })

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); }) })

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

#FirebaseDevDay

Slide 33

Slide 33 text

#FirebaseDevDay Send Messages to Topics

Slide 34

Slide 34 text

#FirebaseDevDay

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); }); }); };

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); }); }); };

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 FireTomyam', body: `We just added "${data.name}" to our collection. Enjoy!` } } return admin.messaging().send(msg) .then((resp) => { return resp; }) .catch(() => {}) })

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 FireTomyam', body: `We just added "${data.name}" to our collection. Enjoy!` } } return admin.messaging().send(msg) .then((resp) => { return resp; }) .catch(() => {}) })

Slide 39

Slide 39 text

#FirebaseDevDay

Slide 40

Slide 40 text

#FirebaseDevDay What else you can do with Firebase Admin SDK

Slide 41

Slide 41 text

#FirebaseDevDay

Slide 42

Slide 42 text

#FirebaseDevDay

Slide 43

Slide 43 text

Thank You! #FirebaseDevDay Helpful resources fb.com/FirebaseThailand fb.com/groups/FirebaseDevTH medium.com/FirebaseThailand Henry Lim @henrylim96