แอปที่ใช้ FCM API เดิมซึ่งเลิกใช้งานแล้วสําหรับ 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 เพื่อส่งข้อความ ไลบรารีจะจัดการโทเค็นให้คุณ หากคุณใช้โปรโตคอลแบบไฟล์บันทึกข้อความ ให้รับโทเค็นตามที่อธิบายไว้ในส่วนนี้ แล้วเพิ่มลงในส่วนหัวเป็น 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) จะตรวจสอบข้อมูลเข้าสู่ระบบของคุณ ตามลำดับต่อไปนี้
ADC จะตรวจสอบว่าตัวแปรสภาพแวดล้อม ตั้งค่า GOOGLE_APPLICATION_CREDENTIALS แล้ว หากตั้งค่าตัวแปรไว้ ADC จะใช้ไฟล์บัญชีบริการที่ตัวแปรชี้ไป
หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม ADC จะใช้บัญชีบริการเริ่มต้นที่ Compute Engine, Google Kubernetes Engine, App Engine และ Cloud Functions มีไว้สําหรับแอปพลิเคชันที่ทํางานในบริการเหล่านั้น
หาก 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 ซึ่งคุณใช้เรียก API ของเซิร์ฟเวอร์ Firebase จากเซิร์ฟเวอร์แอปหรือสภาพแวดล้อมที่เชื่อถือได้ หากคุณกำลังพัฒนาโค้ดในเครื่องหรือติดตั้งใช้งานแอปพลิเคชันภายในองค์กร คุณสามารถใช้ข้อมูลเข้าสู่ระบบที่ได้รับผ่านบัญชีบริการนี้เพื่อให้สิทธิ์คําขอของเซิร์ฟเวอร์ได้
วิธีตรวจสอบสิทธิ์และให้สิทธิ์บัญชีบริการ ในการเข้าถึงบริการ Firebase คุณต้องสร้างไฟล์คีย์ส่วนตัวใน JSON
วิธีสร้างไฟล์คีย์ส่วนตัวสำหรับบัญชีบริการ
ในคอนโซล Firebase ให้เปิดการตั้งค่า > บัญชีบริการ
คลิกสร้างคีย์ส่วนตัวใหม่ แล้วยืนยันโดยคลิกสร้างคีย์
จัดเก็บไฟล์ 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 Auth สำหรับภาษาที่ต้องการเพื่อเรียกข้อมูลโทเค็นการเข้าถึง 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 ได้ที่บทความต่อไปนี้
คําแนะนําเกี่ยวกับวิธีสร้างคําขอส่งของเซิร์ฟเวอร์แอปด้วย HTTP v1 API ข้อมูลโค้ด "REST" ทั้งหมดใช้ API v1 เว้นแต่จะระบุไว้เป็นอย่างอื่น