Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

อนุญาตส่งคำขอ

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

  • FCM HTTP v1 API อนุญาตคำขอด้วยโทเค็นการเข้าถึง OAuth 2.0 ที่มีอายุสั้น ในการสร้างโทเค็นนี้ คุณสามารถใช้ข้อมูลประจำตัวเริ่มต้นของแอปพลิเคชัน Google (ในสภาพแวดล้อมเซิร์ฟเวอร์ของ Google) และ/หรือรับข้อมูลประจำตัวที่จำเป็นด้วยตนเองจากไฟล์คีย์ส่วนตัว JSON ที่สร้างขึ้นสำหรับบัญชีบริการ หากคุณใช้ Firebase Admin SDK เพื่อส่งข้อความ ไลบรารีจะจัดการโทเค็นให้คุณ
  • โปรโตคอลเดิมสามารถใช้เฉพาะคีย์ API ที่มีอายุการใช้งานยาวนานซึ่งได้รับจากคอนโซล Firebase

อนุญาตคำขอส่ง HTTP v1

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

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

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

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

ให้ข้อมูลรับรองโดยใช้ ADC

Google Application Default Credentials (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

โหนด js

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

ชวา

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

FirebaseApp.initializeApp(options);

หลาม

default_app = firebase_admin.initialize_app()

ไป

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

ค#

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

ให้ข้อมูลประจำตัวด้วยตนเอง

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

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

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

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

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

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

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

ในการตั้งค่าตัวแปรสภาพแวดล้อม:

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

ลินุกซ์หรือ macOS

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

หน้าต่าง

ด้วย PowerShell:

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

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

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

เว้นแต่คุณจะใช้ Admin SDK ซึ่งจัดการการให้สิทธิ์โดยอัตโนมัติ คุณจะต้องสร้างโทเค็นการเข้าถึงและเพิ่มเพื่อส่งคำขอ

ใช้ข้อมูลรับรอง Firebase ของคุณร่วมกับ Google Auth Library สำหรับภาษาที่คุณต้องการเพื่อดึงโทเค็นการเข้าถึง 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

หลาม

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

ชวา

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

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

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

ในการเพิ่มโทเค็นการเข้าถึงไปยังส่วนหัวคำขอ HTTP:

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

node.js

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

หลาม

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

ชวา

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

อนุญาตคำขอส่งโปรโตคอลดั้งเดิม

ด้วยโปรโตคอล HTTP เดิม แต่ละคำขอต้องมีคีย์เซิร์ฟเวอร์จากแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase สำหรับ XMPP คุณต้องใช้รหัสเซิร์ฟเวอร์เดียวกันเพื่อสร้างการเชื่อมต่อ

โอนย้ายรหัสเซิร์ฟเวอร์เดิม

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

หากต้องการลบคีย์เซิร์ฟเวอร์เดิมที่มีอยู่ คุณสามารถทำได้ใน Google Cloud Console

อนุญาตคำขอ HTTP

คำขอข้อความประกอบด้วยสองส่วน: ส่วนหัว HTTP และเนื้อหา HTTP ส่วนหัว HTTP ต้องมีส่วนหัวต่อไปนี้:

  • Authorization : key=YOUR_SERVER_KEY
    ตรวจสอบให้แน่ใจว่านี่คือคีย์ เซิร์ฟเวอร์ ซึ่งมีค่าอยู่ในแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase คีย์ Android, แพลตฟอร์ม Apple และเบราว์เซอร์ถูกปฏิเสธโดย FCM
  • Content-Type : application/json สำหรับ JSON; application/x-www-form-urlencoded;charset=UTF-8 สำหรับข้อความธรรมดา
    หากละเว้น Content-Type รูปแบบจะถือว่าเป็นข้อความธรรมดา

ตัวอย่างเช่น:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

ดู สร้างคำขอส่ง สำหรับรายละเอียดทั้งหมดเกี่ยวกับการสร้างคำขอส่ง การอ้างอิงโปรโตคอล HTTP แบบเดิม จะแสดงรายการพารามิเตอร์ทั้งหมดที่ข้อความของคุณสามารถมีได้

การตรวจสอบความถูกต้องของรหัสเซิร์ฟเวอร์

หากคุณได้รับข้อผิดพลาดในการรับรองความถูกต้องเมื่อส่งข้อความ ให้ตรวจสอบความถูกต้องของรหัสเซิร์ฟเวอร์ของคุณ ตัวอย่างเช่น บน Linux ให้รันคำสั่งต่อไปนี้:

api_key=YOUR_SERVER_KEY

curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

หากคุณได้รับรหัสสถานะ HTTP 401 แสดงว่ารหัสเซิร์ฟเวอร์ของคุณไม่ถูกต้อง

อนุญาตการเชื่อมต่อ XMPP

ด้วย XMPP คุณสามารถรักษาการเชื่อมต่อแบบสองทิศทางแบบถาวร แบบอะซิงโครนัส กับเซิร์ฟเวอร์ FCM สามารถใช้การเชื่อมต่อเพื่อส่งและรับข้อความระหว่างเซิร์ฟเวอร์และอุปกรณ์ที่เชื่อมต่อ FCM ของผู้ใช้

คุณสามารถใช้ไลบรารี XMPP ส่วนใหญ่เพื่อจัดการการเชื่อมต่อกับ FCM ที่มีอายุการใช้งานยาวนาน ตำแหน่งข้อมูล XMPP ทำงานที่ fcm-xmpp.googleapis.com:5235 เมื่อทดสอบฟังก์ชันกับผู้ใช้ที่ไม่ได้ใช้งานจริง คุณควรเชื่อมต่อกับเซิร์ฟเวอร์ก่อนใช้งานจริงที่ fcm-xmpp.googleapis.com:5236 (สังเกตพอร์ตอื่น)

การทดสอบปกติในช่วงก่อนการผลิต (สภาพแวดล้อมที่เล็กลงซึ่งการเรียกใช้ FCM บิลด์ล่าสุด) มีประโยชน์ในการแยกผู้ใช้จริงออกจากโค้ดทดสอบ อุปกรณ์ทดสอบและรหัสทดสอบที่เชื่อมต่อกับ fcm-xmpp.googleapis.com:5236 ควรใช้รหัสผู้ส่ง FCM อื่นเพื่อหลีกเลี่ยงความเสี่ยงในการส่งข้อความทดสอบไปยังผู้ใช้ที่ใช้งานจริงหรือส่งข้อความอัปสตรีมจากการรับส่งข้อมูลที่ใช้งานจริงผ่านการเชื่อมต่อทดสอบ

การเชื่อมต่อมีข้อกำหนดที่สำคัญสองประการ:

  • คุณต้องเริ่มการเชื่อมต่อ Transport Layer Security (TLS) โปรดทราบว่าขณะนี้ FCM ไม่รองรับ ส่วนขยาย STARTTLS
  • FCM ต้องการกลไกการตรวจสอบสิทธิ์ SASL PLAIN โดยใช้ <your_FCM_Sender_Id>@fcm.googleapis.com (FCM sender ID ) และคีย์เซิร์ฟเวอร์เป็นรหัสผ่าน ค่าเหล่านี้มีอยู่ในแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase

หากจุดใดที่การเชื่อมต่อล้มเหลว คุณควรเชื่อมต่อใหม่ทันที ไม่จำเป็นต้องถอยกลับหลังจากตัดการเชื่อมต่อที่เกิดขึ้นหลังการรับรองความถูกต้อง สำหรับแต่ละ ID ผู้ส่ง FCM อนุญาตการเชื่อมต่อแบบขนาน 2,500 รายการ

ตัวอย่างต่อไปนี้แสดงวิธีการตรวจสอบสิทธิ์และการอนุญาตสำหรับการเชื่อมต่อ XMPP กับ FCM

เซิร์ฟเวอร์ XMPP

เซิร์ฟเวอร์ XMPP ร้องขอการเชื่อมต่อกับ FCM

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

เอฟซีเอ็ม

FCM เปิดการเชื่อมต่อและร้องขอกลไกการตรวจสอบสิทธิ์ รวมถึงเมธอด PLAIN

<stream:features>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>X-OAUTH2</mechanism>
    <mechanism>X-GOOGLE-TOKEN</mechanism>
    <mechanism>PLAIN</mechanism>
  </mechanisms>
</stream:features>

เซิร์ฟเวอร์ XMPP

เซิร์ฟเวอร์ XMPP ต้องตอบสนองโดยใช้วิธีการรับรองความถูก PLAIN โดยระบุรหัสเซิร์ฟเวอร์จากแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase

<auth mechanism="PLAIN"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb
mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth>

เอฟซีเอ็ม

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

เซิร์ฟเวอร์ XMPP

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

เอฟซีเอ็ม

<stream:features>
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>

เซิร์ฟเวอร์ XMPP

<iq type="set">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind>
</iq>

เอฟซีเอ็ม

<iq type="result">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>SENDER_ID@fcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

หมายเหตุ: FCM ไม่ใช้ทรัพยากรที่ผูกไว้ขณะกำหนดเส้นทางข้อความ

ดู สร้างคำขอส่ง สำหรับรายละเอียดทั้งหมดเกี่ยวกับการสร้างคำขอส่ง การอ้างอิงโปรโตคอล XMPP แบบดั้งเดิม แสดงรายการพารามิเตอร์ทั้งหมดที่ข้อความของคุณมีได้