ทำให้ใช้งานได้ในเว็บไซต์โดยใช้ Hosting REST API

Firebase Hosting REST API จะเปิดใช้ การติดตั้งใช้งานแบบเป็นโปรแกรมและปรับแต่งได้กับเว็บไซต์ที่โฮสต์ด้วย Firebase ใช้ REST API นี้เพื่อทำให้เนื้อหาโฮสติ้งใหม่หรือที่อัปเดตใช้งานได้ และ การกำหนดค่า

เป็นทางเลือกในการใช้ Firebase CLI สำหรับ คุณสามารถใช้ Firebase Hosting REST API เพื่อเขียนโปรแกรม สร้าง version ใหม่ เนื้อหาสำหรับเว็บไซต์ อัปโหลดไฟล์ไปยังเวอร์ชัน แล้วทำให้เวอร์ชันใช้งานได้ เว็บไซต์ของคุณ

ตัวอย่างเช่น เมื่อใช้ Firebase Hosting REST API คุณจะทำสิ่งต่อไปนี้ได้

  • กำหนดเวลาการทำให้ใช้งานได้ เมื่อใช้ REST API ร่วมกับงาน cron คุณจะเปลี่ยนเนื้อหาที่โฮสต์กับ Firebase ได้ตามกำหนดการอย่างสม่ำเสมอ (เช่น นำเนื้อหาของคุณในเวอร์ชันสำหรับวันหยุดหรือกิจกรรมพิเศษไปใช้)

  • ผสานรวมกับเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ คุณสามารถสร้างตัวเลือกในเครื่องมือเพื่อ ทำให้โปรเจ็กต์เว็บแอปของคุณใช้งานได้ในโฮสติ้งของ Firebase ด้วยการคลิกเพียงครั้งเดียว (สำหรับ เช่น คลิกที่ปุ่มติดตั้งใช้งานภายใน IDE)

  • ทำให้ใช้งานได้โดยอัตโนมัติเมื่อมีการสร้างเนื้อหาแบบคงที่ เมื่อกระบวนการ สร้างเนื้อหาแบบคงที่แบบเป็นโปรแกรม (เช่น เนื้อหาที่ผู้ใช้สร้างขึ้น เช่น Wiki หรือบทความข่าว) คุณสามารถปรับใช้เนื้อหาที่สร้างขึ้นในรูปแบบ ไฟล์แบบคงที่ แทนที่จะแสดงแบบไดนามิก วิธีนี้ช่วยให้คุณประหยั��ค่าใช้จ่าย ใน��������ระ��ว����������ะให้บริการไฟล์ในรูปแบบที่รองรับการปรับขนาดมากขึ้น

คู่มือนี้จะอธิบายวิธีเปิดใช้ ตรวจสอบสิทธิ์ และให้สิทธิ์ API ก่อน จากนั้น คู่มือนี้จะอธิบายตัวอย่างในการสร้างโฮสติ้งของ Firebase ให้อัปโหลดไฟล์ที่จำเป็นไปยังเวอร์ชัน จากนั้นสุดท้ายคือปรับใช้ เวอร์ชัน

นอกจากนี้คุณยังสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ REST API ใน เอกสารอ้างอิง Hosting REST API ฉบับเต็ม

ก่อนเริ่มต้น: เปิดใช้ REST API

คุณต้องเปิดใช้ REST API ของ Firebase Hosting ในคอนโซล Google API โดยทำดังนี้

  1. เปิด หน้า Firebase Hosting API ในคอนโซล Google APIs

  2. เมื่อมีข้อความแจ้ง ให้เลือกโปรเจ็กต์ Firebase ของคุณ

  3. คลิกเปิดใช้ในหน้า Firebase Hosting API

ขั้นตอนที่ 1: รับโทเค็นเพื่อการเข้าถึงเพื่อตรวจสอบสิทธิ์และให้สิทธิ์คำขอ API

โปรเจ็กต์ Firebase รองรับ Google บัญชีบริการ ซึ่งใช้เพื่อเรียกใช้ Firebase ได้ API ของเซิร์ฟเวอร์จากเซิร์ฟเวอร์ของแอปหรือสภาพแวดล้อมที่เชื่อถือได้ หากคุณกำลังพัฒนา โค้ดภายในเครื่อง หรือการทำให้แอปพลิเคชันใช้งานได้ภายในองค์กร คุณสามารถใช้ข้อมูลเข้าสู่ระบบที่ได้รับ ผ่านบัญชีบริการนี้เพื่อให้สิทธิ์คำขอของเซิร์ฟเวอร์

วิธีตรวจสอบสิทธิ์และให้สิทธิ์บัญชีบริการ ในการเข้าถึงบริการ Firebase คุณต้องสร้างไฟล์คีย์ส่วนตัวใน JSON

วิธีสร้างไฟล์คีย์ส่วนตัวสำหรับบัญชีบริการ

  1. ในคอนโซล Firebase ให้เปิด การตั้งค่า > บัญชีบริการ

  2. คลิกสร้างคีย์ส่วนตัวใหม่ แล้วยืนยันโดยคลิกสร้างคีย์

  3. จัดเก็บไฟล์ JSON ที่มีค��ย์ดังกล่าวอย่างปลอดภัย

ใช้ข้อมูลเข้าสู่ระบบ Firebase ร่วมกับ ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับภาษาที่ต้องการเพื่อเรียกโทเค็นเพื่อการเข้าถึง OAuth 2.0 ที่มีอายุสั้น:

Node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

ในตัวอย่างนี้ ไลบรารีของไคลเอ็นต์ Google API จะตรวจสอบสิทธิ์คำขอด้วย โทเค็นเว็บ JSON หรือ JWT สำหรับข้อมูลเพิ่มเติม โปรดดู โทเค็นเว็บ JSON

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

หลังจากที่โทเค็นเพื่อการเข้าถึงหมดอายุ ระบบจะเรียกวิธีการรีเฟรชโทเค็น โดยอัตโนมัติ���พื่อเรียกโทเค็นเพื่อการเข้าถึงที่อัปเดตแล้ว

ขั้นตอนที่ 2: ตรวจสอบว่าโปรเจ็กต์มีเว็บไซต์โฮสติ้งเริ่มต้น

ก่อนการทำให้ใช้งานได้ครั้งแรกกับโฮสติ้งของ Firebase โปรเจ็กต์ Firebase ของคุณต้อง มีค่าเริ่มต้น โฮสติ้ง SITE

  1. ตรวจสอบว่าโปรเจ็กต์มีเว็บไซต์โฮสติ้งเริ่มต้นหรือไม่โดยเรียกใช้ sites.list ปลายทาง

    เช่น

    คำสั่ง cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    คำขอ HTTPS ดิบ

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    
    • หากเว็บไซต์ใดมี "type": "DEFAULT_SITE" โปรเจ็กต์ของคุณ มีเว็บไซต์โฮสติ้งเริ่มต้นอยู่แล้ว ข้ามส่วนที่เหลือของขั้นตอนนี้ และไปยังขั้นตอนถัดไป สร้างเวอร์ชันใหม่สำหรับเว็บไซต์

    • หากอาร์เรย์ว่างเปล่า แสดงว่าคุณไม่มีโฮสติ้งเริ่มต้น ของคุณ ทำส่วนที่เหลือของขั้นตอนนี้ให้เสร็จสมบูรณ์

  2. เลือก SITE_ID สำหรับเว็บไซต์โฮสติ้งเริ่มต้น เก็บ โปรดคำนึงถึงข้อต่อไปนี้เมื่อตัดสินใจเลือกSITE_IDนี้

    • SITE_ID นี้ใช้เพื่อสร้างโดเมนย่อยของ Firebase เริ่มต้น:
      SITE_ID.web.app และ SITE_ID.firebaseapp.com

    • SITE_ID มีข้อกำหนดต่อไปนี้

      • ต้องเป็นป้ายกำกับชื่อโฮสต์ที่ถูกต้อง หมายความว่าต้องไม่มี ., _ ฯลฯ
      • ต้องมีอักขระไม่เกิน 30 ตัว
      • ต้องไม่ซ้ำกันทั่วโลกภายใน Firebase

    โปรดทราบว่าเรามักจะแนะนำให้ใช้รหัสโปรเจ็กต์เป็น SITE_ID สำหรับ เว็บไซต์โฮสติ้งเริ่มต้น ดูวิธีค้นหารหัสนี้ใน ทำความเข้าใจโปรเจ็กต์ Firebase

  3. สร้างเว็บไซต์โฮสติ้งเริ่มต้นโดยเรียกใช้ sites.create โดยใช้ SITE_ID ที่ต้องการเป็น พารามิเตอร์ siteId

    เช่น

    คำสั่ง cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    คำขอ HTTPS ดิบ

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    

    การเรียก API นี้ไปยัง sites.create แสดงผล JSON ต่อไปนี้

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }
    

ขั้นตอนที่ 3: สร้างเวอร์ชันใหม่สำหรับเว็บไซต์

การเรียก API ครั้งแรกของคุณคือการสร้าง Version สำหรับเว็บไซต์ของคุณ ภายหลังในคู่มือนี้ คุณจะอัปโหลดไฟล์มายังเวอร์ชันนี้ แล้วทำให้ใช้งานได้ใน ของคุณ

  1. กำหนด SITE_ID สำหรับเว็บไซต์ที่คุณต้องการทำให้ใช้งานได้

  2. เรียกใช้ versions.create ปลายทางโดยใช้ SITE_ID ในการโทร

    (ไม่บังคับ) นอกจากนี้คุณยังสามารถ ออบเจ็กต์การกำหนดค่าโฮสติ้งของ Firebase ในระหว่างการโทร ซึ่งรวมถึงการตั้งค่าส่วนหัวที่แคชไฟล์ทั้งหมดสำหรับ

    เช่น

    คำสั่ง cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions
    

    คำขอ HTTPS ดิบ

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }
    

การเรียก API นี้ไปยัง versions.create แสดงผล JSON ต่อไปนี้

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

การตอบกลับนี้จะมีตัวระบุที่ไม่ซ้ำกันสำหรับเวอร์ชันใหม่ ในรูปแบบดังนี้ sites/SITE_ID/versions/VERSION_ID. คุณจะ ซึ่งต้องมีตัวระบุที่ไม่ซ้ำนี้ตลอดทั้งคู่มือนี้เพื่ออ้างอิงถึง เวอร์ชัน

ขั้นตอนที่ 4: ระบุรายการไฟล์ที่ต้องการทำให้ใช้งานได้

เมื่อคุณมีตัวระบุเวอร์ชันใหม่แล้ว คุณต้องบอก โฮสติ้งของ Firebase เกี่ยวกับไฟล์ที่คุณต้องการนำไปใช้งานในเวอร์ชันใหม่นี้ เวอร์ชัน

โปรดทราบว่าโฮสติ้งมีขนาดสูงสุดได้ไม่เกิน 2 GB สำหรับ แต่ละไฟล์

API นี้กำหนดให้คุณต้องระบุไฟล์โดยใช้แฮช SHA256 ดังนั้น ก่อนที่คุณจะสามารถ ในการเรียก API ก่อนอื่นคุณต้องคำนวณแฮชสำหรับไฟล์แบบคงที่แต่ละไฟล์โดย บีบอัดไฟล์โดยใช้ gzip แล้วรับแฮช SHA256 ของแต่ละไฟล์ที่บีบอัดใหม่

จากตัวอย่างของเรา สมมติว่าคุณต้องการปรับใช้ไฟล์สามไฟล์ใน เวอร์ชัน: file1, file2 และ file3

  1. Gzip ไฟล์:

    gzip file1 && gzip file2 && gzip file3

    คุณมีไฟล์บีบอัด 3 ไฟล์ ได้แก่ file1.gz, file2.gz และ file3.gz

  2. รับแฮช SHA256 ของไฟล์บีบอัดแต่ละไฟล์ ดังนี้

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    ตอนนี้คุณมีแฮช SHA256 ทั้ง 3 รายการจากไฟล์บีบอัดทั้ง 3 ไฟล์แล้ว

  3. ส่งแฮช 3 รายการเหล่านี้ในคำขอ API ไปยัง versions.populateFiles ปลายทาง ระบุแฮชแต่ละรายการตามเส้นทางที่ต้องการสำหรับไฟล์ที่อัปโหลด (ใน เช่น /file1, /file2 และ /file3)

    เช่น

    คำสั่ง cURL

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer ACCESS_TOKEN" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles
    

    คำขอ HTTPS ดิบ

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }
    

การเรียก API นี้ไปยัง versions.populateFiles แสดงผล JSON ต่อไปนี้

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

คำตอบนี้รวมถึง

  • แฮชของแต่ละไฟล์ที่ต้องอัปโหลด ตัวอย่างเช่น ใน ตัวอย่าง file1 ถูกอัปโหลดในเวอร์ชันก่อนหน้าแล้ว ดังนั้นแฮชของพารามิเตอร์ ไม่ได้รวมอยู่ในรายการ uploadRequiredHashes

  • uploadUrl สำหรับเวอร์ชันใหม่โดยเฉพาะ

ในขั้นตอนถัดไปเพื่ออัปโหลดไฟล์ใหม่ 2 ไฟล์ คุณจะต้องมีแฮชและ uploadURL จากคำตอบ versions.populateFiles

ขั้นตอนที่ 5: อัปโหลดไฟล์ที่จำเป็น

คุณจะต้องอัปโหลดไฟล์ที่จำเป็นแต่ละไฟล์ (ไฟล์ที่แสดงอยู่ในรายการ ใน uploadRequiredHashes จากคำตอบ versions.populateFiles ใน ขั้นตอนก่อนหน้า) คุณจะต้องมีแฮชของไฟล์และองค์ประกอบ uploadUrl จากขั้นตอนก่อนหน้า

  1. เพิ่มเครื่องหมายทับและแฮชของไฟล์ต่อท้าย uploadUrl เพื่อ สร้าง URL เฉพาะไฟล์ในรูปแบบ https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH

  2. อัปโหลดไฟล์ที่จำเป็นทั้งหมดทีละไฟล์ (ในตัวอย่างนี้มีเพียง file2.gz ไฟล์เท่านั้น และ file3.gz) ไปยัง URL เฉพาะไฟล์โดยใช้ชุดคำขอ

    เช่น หากต้องการอัปโหลดไฟล์ file2.gz ที่บีบอัดไว้ ให้ทำดังนี้

    คำสั่ง cURL

    curl -H "Authorization: Bearer ACCESS_TOKEN" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH
    

    คำขอ HTTPS ดิบ

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz
    

การอัปโหลดที่สำเร็จจะแสดงการตอบกลับ 200 OK HTTPS

ขั้นตอนที่ 6: อัปเดตสถานะของเวอร์ชันเป็น FINALIZED

หลังจากที่คุณอัปโหลดไฟล์ทั้งหมดที่แสดงอยู่ใน การตอบกลับ versions.populateFiles คุณสามารถอัปเดตสถานะเวอร์ชันเป็น FINALIZED.

โทรหา versions.patch ปลายทางที่มีช่อง status ในคำขอ API ของคุณเป็น FINALIZED

เช่น

คำสั่ง cURL

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer ACCESS_TOKEN" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status

คำขอ HTTPS ดิบ

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

การเรียก API นี้ไปยัง versions.patch แสดงผล JSON ต่อไปนี้ โปรดตรวจสอบว่า อัปเดต status เป็น FINALIZED แล้ว

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "USER_EMAIL@DOMAIN.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

ขั้นตอนที่ 7: เผยแพร่เวอร์ชันสำหรับการทำให้ใช้งานได้

เมื่อมีเวอร์ชันที่เสร็จสมบูรณ์แล้ว โปรดเปิดตัวเพื่อทำให้ใช้งานได้ สำหรับขั้นตอนนี้ คุณต้องสร้าง Release ของเวอร์ชันของคุณ ที่มีการกำหนดค่าโฮสติ้งและไฟล์เนื้อหาทั้งหมดสำหรับ เวอร์ชัน

โทรหา releases.create ปลายทางเพื่อสร้างรุ่น

เช่น

คำสั่ง cURL

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

คำขอ HTTPS ดิบ

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

การเรียก API นี้ไปยัง releases.create แสดงผล JSON ต่อไปนี้

{
  "name": "sites/SITE_ID/releases/RELEASE_ID",
  "version": {
    "name": "sites/SITE_ID/versions/VERSION_ID",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

การกำหนดค่าโฮสติ้งและไฟล์ทั้งหมดสำหรับเวอร์ชันใหม่ควรเป็นดังนี้ ที่ปรับใช้ในเว็บไซต์ของคุณ และคุณสามารถเข้าถึงไฟล์โดยใช้ URL:

  • https://SITE_ID.web.app/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

ไฟล์เหล่านี้ยังเข้าถึงได้จาก URL ที่เชื่อมโยงกับ SITE_ID.firebaseapp.com

นอกจากนี้ คุณสามารถดูผลงานใหม่ได้ใน แดชบอร์ดโฮสติ้ง ของคอนโซล Firebase