ย้ายข้อมูลจาก FCM API เดิมไปยัง HTTP v1

แอปที่ใช้ API เดิมของ FCM ที่เลิกใช้งานแล้วสำหรับ HTTP และ XMPP ควรย้ายข้อมูลไปยัง HTTP v1 API ได้เร็วที่สุด กำลังส่งข้อความ (รวมถึงข้อความอัปสตรีม) ที่มี API เหล่านั้น เลิกใช้งานแล้วเมื่อ วันที่ 20 มิถุนายน 2023 และการปิดให้บริการจะเริ่มในวันที่ 22 กรกฎาคม 2024

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ที่ได้รับผลกระทบ

นอกจากการสนับสนุนอย่างต่อเนื่องและฟีเจอร์ใหม่แล้ว HTTP v1 API ยังมี ข้อได้เปรียบเหนือ API เดิมดังต่อไปนี้

  • การรักษาความปลอดภัยที่ดียิ่งขึ้นผ่านโทเค็นเพื่อการเข้าถึง HTTP v1 API ใช้การเข้าถึงเป็นระยะเวลาสั้นๆ ตามโมเดลการรักษาความปลอดภัย OAuth2 ในกรณีที่ โทเค็นเพื่อการเข้าถึงจะกลายเป็นโทเค็นสาธารณะ สามารถใช้ได้เฉพาะที่เป็นอันตรายเท่านั้น ประมาณ 1 ชั่วโมงก่อน หมดอายุ ระบบจะไม่ส่งโทเค็นการรีเฟรชบ่อยเท่ากับที่ใช้คีย์ความปลอดภัย ใน API เดิม จึงมีแนวโน้ม ที่จะมีการตรวจจับน้อย

  • ปรับแต่งข้อความในแพลตฟอร์มต่างๆ ได้อย่างมีประสิทธิภาพมากขึ้น สำหรับข้อความ เนื้อหา HTTP v1 API มีคีย์ทั่วไปที่ใช้กับอินสแตนซ์ที่กำหนดเป้าหมายทั้งหมด รวมถึงคีย์เฉพาะแพลตฟอร์ม ที่ให้คุณปรับแต่งข้อความในแพลตฟอร์มต่างๆ วิธีนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้ สร้าง "การลบล้าง" ที่ส่งเพย์โหลดที่ต่างกันเล็กน้อยไปยัง แพลตฟอร์มไคลเอ็นต์ไว้ในข้อความเดียว

  • ขยายได้มากขึ้นและรองรับอนาคตสำหรับแพลตฟอร์มลูกค้าเวอร์ชันใหม่ HTTP v1 API รองรับตัวเลือกการรับส่งข้อความที่มีในแพลตฟอร์ม Apple, Android และ เว็บ เนื่องจากแต่ละแพลตฟอร์มจะมีบล็อก ที่กำหนดไว้ของตัวเองในเพย์โหลด JSON FCM จะขยาย API ไปยังเวอร์ชันและแพลตฟอร์มใหม่ๆ ได้ ตามความจำเป็น

อัปเดตปลายทางเซิร์ฟเวอร์

URL ปลายทางสำหรับ HTTP v1 API แตกต่างจากปลายทางเดิมใน ด้วยวิธีต่อไปนี้

  • เวอร์ชันนี้มีเวอร์ชัน โดยมี /v1 อยู่ในเส้นทาง
  • เส้นทางมีรหัสโปรเจ็กต์ของโปรเจ็กต์ Firebase สำหรับ แอปของคุณในรูปแบบ /projects/myproject-ID/ รหัสนี้มีอยู่ใน แท็บการตั้งค่าโปรเจ็กต์ทั่วไปของ คอนโซล Firebase
  • โดยจะระบุเมธอด send อย่างชัดแจ้งเป็น :send

หากต้องการอัปเดตปลายทางเซิร์ฟเวอร์สำหรับ HTTP v1 ให้เพิ่มองค์ประกอบเหล่านี้ไปยังปลายทาง ในส่วนหัวของคำขอส่ง

คำขอ HTTP ก่อน

POST https://fcm.googleapis.com/fcm/send

คำขอ XMPP ก่อน

ข้อความ XMPP เดิมจะส่งผ่านการเชื่อมต่อไปยังปลายทางต่อไปนี้

fcm-xmpp.googleapis.com:5235

หลัง

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

อัปเดตการให้สิทธิ์คำขอส่ง

HTTP v1 จะส่งคำขอแทนสตริงคีย์เซิร์ฟเวอร์ที่ใช้ในคำขอเดิม ต้องใช้โทเค็นเพื่อการเข้าถึง OAuth 2.0 หากคุณใช้ Admin SDK ในการส่งข้อความ ไลบรารีจะจัดการโทเค็นให้คุณ หากคุณกำลังใช้งาน โปรโตคอลไฟล์ข้อมูล RAW ให้รับโทเค็นตามที่อธิบายไว้ในส่วนนี้และเพิ่มลงใน ส่วนหัวเป็น Authorization: Bearer <valid Oauth 2.0 token>

ก่อน

Authorization: key=AIzaSyZ-1u...0GBYzPu7Udno5aA

หลัง

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

ขึ้นอยู่กับรายละเอียดของ สภาพแวดล้อมของเซิร์ฟเวอร์ ใช้กลยุทธ์เหล่านี้ร่วมกันเพื่อให้สิทธิ์เซิร์ฟเวอร์ คำขอไปยังบริการ Firebase:

  • ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Google (ADC)
  • ไฟล์ JSON ของบัญชีบริการ
  • โทเค็นเพื่อการเข้าถึง OAuth 2.0 ที่มีอายุสั้น ซึ่งได้มาจากบัญชีบริการ

หากแอปพลิเคชันของคุณทำงานอยู่บน Compute Engine Google Kubernetes Engine, App Engine หรือ Cloud Functions (รวมถึง Cloud Functions for Firebase) ใช้ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน (ADC) ADC ใช้บริการเริ่มต้นที่มีอยู่ของคุณ เพื่อรับข้อมูลรับรองเพื่อให้สิทธิ์คำขอ และ ADC จะเปิดใช้ การทดสอบภายในที่ยืดหยุ่นผ่านตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS เพื่อระบบอัตโนมัติเต็มรูปแบบ ขั้นตอนการให้สิทธิ์ ให้ใช้ ADC ร่วมกับไลบรารีเซิร์ฟเวอร์ Admin SDK

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

ระบุข้อมูลเข้าสู่ระบบโดยใช้ ADC

ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Google (ADC) จะตรวจสอบข้อมูลเข้าสู่ระบบของคุณ ตามลำดับต่อไปนี้

  1. ADC จะตรวจสอบว่าตัวแปรสภาพแวดล้อม ตั้งค่า GOOGLE_APPLICATION_CREDENTIALS แล้ว หากมีการตั้งค่าตัวแปรแล้ว โดย ADC จะใช้ไฟล์บัญชีบริการที่ตัวแปรชี้ไป

  2. หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม ADC จะใช้บัญชีบริการเริ่มต้น Compute Engine, Google Kubernetes Engine, App Engine และ Cloud Functions จะมีให้บริการแก่แอปพลิเคชันที่ทำงานบนบริการเหล่านั้น

  3. หาก ADC ใช้ข้อมูลเข้าสู่ระบบรายการใดรายการหนึ่งข้างต้นไม่ได้ ระบบจะแสดงข้อผิดพลาด

ตัวอย่างโค้ด Admin SDK ต่อไปนี้แสดงให้เห็นถึงกลยุทธ์นี้ ตัวอย่าง ไม่ได้ระบุข้อมูลเข้าสู่ระบบของแอปพลิเคชันอย่างชัดเจน อย่างไรก็ตาม ADC สามารถ ค้นหาข้อมูลเข้าสู่ระบบโดยปริยายตราบใดที่มีการตั้งค่าตัวแปรสภาพแวดล้อม หรือ ตราบใดที่แอปพลิเคชันยังทำงานอยู่ใน Compute Engine Google Kubernetes Engine, App Engine หรือ Cloud Functions

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

ระบุข้อมูลเข้าสู่ระบบด้วยตนเอง

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

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

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

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

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

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

เมื่อให้สิทธิ์ผ่านบัญชีบริการ คุณมี 2 ตัวเลือกในการระบุ ลงในแอปพลิเคชันของคุณ คุณสามารถตั้ง GOOGLE_APPLICATION_CREDENTIALS ตัวแปรสภาพแวดล้อม หรือคุณอาจ ส่งผ่านเส้นทางไปยังคีย์บัญชีบริการในโค้ดอย่างชัดแจ้ง ตัวเลือกแรกมีความปลอดภัยกว่าและขอแนะนำอย่างยิ่ง

วิธีตั้งค่าตัวแปรสภาพแวดล้อม

ตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS ไปยังเส้นทางไฟล์ของไฟล์ JSON ที่มีคีย์บัญชีบริการ ตัวแปรนี้ใช้ได้กับเซสชัน Shell ปัจจุบันเท่านั้น ดังนั้นหากคุณเปิด ให้กำหนดตัวแปรอีกครั้ง

Linux หรือ macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

ด้วย PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

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

ใช้ข้อมูลเข้าสู่ระบบเพื่อสร้างโทเค็นเพื่อการเข้าถึง

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

Node.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const 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 = service_account.Credentials.from_service_account_file(
    'service-account.json', scopes=SCOPES)
  request = google.auth.transport.requests.Request()
  credentials.refresh(request)
  return credentials.token

Java

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refresh();
  return googleCredentials.getAccessToken().getTokenValue();
}

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

หากต้องการให้สิทธิ์เข้าถึง FCM โปรดส่งคำขอขอบเขต https://www.googleapis.com/auth/firebase.messaging

วิธีเพิ่มโทเค็นเพื่อการเข้าถึงในส่วนหัวของคำขอ HTTP

เพิ่มโทเค็นเป็นค่าของส่วนหัว Authorization ในรูปแบบ Authorization: Bearer <access_token>:

Node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Java

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getServiceAccountAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

อัปเดตเพย์โหลดของการส่งคำขอ

FCM HTTP v1 มีการเปลี่ยนแปลงที่สำคัญในโครงสร้างของข้อความ JSON เพย์โหลด หลักๆ แล้ว การเปลี่ยนแปลงเหล่านี้ช่วยดูแลให้ข้อความได้รับการจัดการอย่างถูกต้อง เมื่อได้รับในแพลตฟอร์มลูกค้าต่างๆ นอกจากนี้ การเปลี่ยนแปลงนี้จะ ความยืดหยุ่นเป็นพิเศษในการปรับแต่ง หรือ "ลบล้าง" ช่องข้อความต่อแพลตฟอร์ม

นอกจากการตรวจสอบตัวอย่างในส่วนนี้ โปรดดู ปรับแต่งข้อความในแพลตฟอร์มต่างๆ และตรวจสอบ เอกสารอ้างอิง API เพื่อรับ ความคุ้นเคยกับ HTTP v1

ตัวอย่าง: ข้อความการแจ้งเตือนแบบง่าย

นี่คือการเปรียบเทียบเพย์โหลดการแจ้งเตือนที่ง่ายมากๆ ซึ่งมี เฉพาะช่อง title, body และ data เท่านั้น ซึ่งแสดงให้เห็นถึงฟังก์ชันพื้นฐาน ความแตกต่างของเพย์โหลดเดิมและเพย์โหลด HTTP v1

ก่อน

{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

หลัง

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

ตัวอย่าง: ข้อมูล JSON ที่ฝังไว้

HTTP v1 API ไม่รองรับค่า JSON ที่ซ้อนกันในช่อง data ซึ่งต่างจาก API การรับส่งข้อความแบบเดิม ต้องมีการแปลงจาก JSON เป็นสตริง

ก่อน

{
  ...
  "data": {
    "keysandvalues": {"key1": "value1", "key2": 123}
  }
}

หลัง

{
  "message": {
   ...
    "data": {
      "keysandvalues": "{\"key1\": \"value1\", \"key2\": 123}"
    }
  }
}

ตัวอย่าง: การกำหนดเป้าหมายหลายแพลตฟอร์ม

หากต้องการเปิดใช้การกําหนดเป้าหมายหลายแพลตฟอร์ม API เดิมได้ทำการลบล้าง ในแบ็กเอนด์ แต่ HTTP v1 จะให้ บล็อกคีย์เฉพาะแพลตฟอร์มที่ทำให้เกิดความแตกต่างระหว่างแพลตฟอร์ม และนักพัฒนาซอฟต์แวร์มองเห็นได้ ซึ่งจะช่วยให้คุณกำหนดเป้าหมาย จะใช้คำขอเดียวเสมอ ดังที่แสดงในตัวอย่างต่อไปนี้

ก่อน

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

หลัง

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

ตัวอย่าง: การปรับแต่งโดยใช้การลบล้างแพลตฟอร์ม

นอกจากจะทำให้การกำหนดเป้าหมายข้อความข้ามแพลตฟอร์มง่ายขึ้นแล้ว HTTP v1 API ให้ความยืดหยุ่นในการปรับแต่งข้อความตามแพลตฟอร์ม

ก่อน

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "Check out the Top Story.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

หลัง

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY",
        "body": "Check out the Top Story"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

ตัวอย่าง: การกำหนดเป้าหมายอุปกรณ์เฉพาะเจาะจง

หากต้องการกำหนดเป้าหมายอุปกรณ์ที่เฉพาะเจาะจงด้วย HTTP v1 API ให้ระบุ โทเค็นการลงทะเบียนปัจจุบันในคีย์ token แทนที่จะเป็น คีย์ to

ก่อน

  { "notification": {
      "body": "This is an FCM notification message!",
      "title": "FCM Message"
    },
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }

หลัง

{
   "message":{
      "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

โปรดดูตัวอย่างและข้อมูลเพิ่มเติมเกี่ยวกับ FCM HTTP v1 API ที่