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

แอปที่ใช้ 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 มีคีย์ทั่วไปที่ส่งไปยังอินสแตนซ์เป้าหมายทั้งหมด รวมถึงคีย์เฉพาะแพลตฟอร์ม ที่ช่วยให้คุณปรับแต่งข้อความในแพลตฟอร์มต่างๆ ได้ ซึ่งจะช่วยให้คุณ สร้าง "การลบล้าง" ที่ส่งเพย์โหลดที่แตกต่างกันเล็กน้อยไปยัง แพลตฟอร์มไคลเอ็นต์ต่างๆ ในข้อความเดียวได้

  • ขยายได้มากขึ้นและพร้อมรับมือกับเวอร์ชันแพลตฟอร์มไคลเอ็นต์ใหม่ๆ ในอนาคต API ของ HTTP v1 รองรับตัวเลือกการรับส่งข้อความที่มีในแพลตฟอร์มของ 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) จะตรวจสอบข้อมูลเข้าสู่ระบบของคุณ ตามลำดับต่อไปนี้

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

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

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

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

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

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

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

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

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

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 ซึ่งแตกต่างจาก Messaging API เวอร์ชันเดิม ต้องมีการแปลงจาก JSON เป็นสตริง

ก่อน

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

หลัง

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

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

หากต้องการเปิดใช้การกำหนดเป้าหมายหลายแพลตฟอร์ม Legacy 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"
      }
   }
}

ดูตัวอย่างและข้อมูลเพิ่มเติมเกี่ยวกับ FCMHTTP v1 API ได้ที่หัวข้อต่อไปนี้