Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

تفويض إرسال الطلبات

يجب أن تتم الموافقة على الطلبات المرسلة إلى FCM من خادم التطبيق أو البيئة الموثوقة. لاحظ هذه الاختلافات المهمة بين تخويل HTTP القديم و HTTP v1 API:

  • تصرح واجهة برمجة تطبيقات FCM HTTP v1 الطلبات برمز وصول OAuth 2.0 قصير العمر. لصك هذا الرمز المميز ، يمكنك استخدام بيانات الاعتماد الافتراضية لتطبيق Google (في بيئات خادم Google) و / أو الحصول يدويًا على بيانات الاعتماد المطلوبة من ملف مفتاح خاص JSON تم إنشاؤه لحساب خدمة. إذا كنت تستخدم Firebase Admin SDK لإرسال الرسائل ، فستتعامل المكتبة مع الرمز المميز نيابةً عنك.
  • يمكن أن تستخدم البروتوكولات القديمة فقط مفاتيح API طويلة العمر التي تم الحصول عليها من وحدة تحكم Firebase.

تخويل HTTP v1 بإرسال الطلبات

اعتمادًا على تفاصيل بيئة الخادم ، استخدم مجموعة من هذه الإستراتيجيات لتفويض طلبات الخادم لخدمات Firebase:

  • بيانات الاعتماد الافتراضية لتطبيق Google (ADC)
  • ملف JSON لحساب الخدمة
  • رمز دخول OAuth 2.0 قصير العمر مشتق من حساب خدمة

إذا تم تشغيل التطبيق الخاص بك على حساب محرك جوجل Kubernetes محرك، محرك التطبيقات، أو سحابة وظائف (بما في ذلك وظائف الغيمة ل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 أو وظائف السحابة.

Node.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 جوجل حسابات الخدمة ، والتي يمكنك استخدامها للاتصال Firebase الخادم واجهات برمجة التطبيقات من خادم التطبيق أو البيئة موثوق به. إذا كنت تقوم بتطوير التعليمات البرمجية محليًا أو نشر تطبيقك محليًا ، فيمكنك استخدام بيانات الاعتماد التي تم الحصول عليها عبر حساب الخدمة هذا لتفويض طلبات الخادم.

لمصادقة حساب خدمة وتفويضه للوصول إلى خدمات Firebase ، يجب عليك إنشاء ملف مفتاح خاص بتنسيق JSON.

لإنشاء ملف مفتاح خاص لحساب الخدمة الخاص بك:

  1. في وحدة تحكم Firebase، افتح الإعدادات> الحسابات الخدمة .

  2. انقر فوق إنشاء مفتاح جديد الخاصة، ثم تأكيد عن طريق النقر توليد مفتاح.

  3. قم بتخزين ملف JSON الذي يحتوي على المفتاح بشكل آمن.

عند التفويض عبر حساب خدمة ، لديك خياران لتقديم بيانات الاعتماد لتطبيقك. يمكنك إما تعيين GOOGLE_APPLICATION_CREDENTIALS متغير البيئة، أو يمكنك تمرير صراحة المسار إلى مفتاح حساب الخدمة في التعليمات البرمجية. الخيار الأول أكثر أمانًا ويوصى به بشدة.

لتعيين متغير البيئة:

تعيين متغير البيئة GOOGLE_APPLICATION_CREDENTIALS إلى مسار الملف من ملف JSON يحتوي على مفتاح حساب الخدمة الخاص بك. ينطبق هذا المتغير فقط على جلسة shell الحالية ، لذلك إذا فتحت جلسة جديدة ، فقم بتعيين المتغير مرة أخرى.

Linux أو macOS

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

شبابيك

مع بوويرشيل:

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

بعد الانتهاء من الخطوات المذكورة أعلاه ، يمكن لبيانات اعتماد التطبيق الافتراضية (ADC) تحديد بيانات الاعتماد الخاصة بك بشكل ضمني ، مما يسمح لك باستخدام بيانات اعتماد حساب الخدمة عند الاختبار أو التشغيل في بيئات غير تابعة لـ Google.

استخدم بيانات الاعتماد لصك رموز الوصول

إلا إذا كنت تستخدم SDK المسؤول ، الذي تفويض مقبض تلقائيا، سوف تحتاج إلى النعناع وصول رمز وإضافته لإرسال الطلبات.

استخدام بيانات اعتماد Firebase الخاص جنبا إلى جنب مع مكتبة مصادقة جوجل لغتك المفضلة لاسترداد الوصول قصيرة الأجل أوث 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 الطلب باستخدام رمز ويب JSON أو JWT. لمزيد من المعلومات، راجع JSON الرموز على شبكة الإنترنت .

بايثون

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

جافا

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 تراث، يجب أن يحتوي على كل طلب مفتاح الملقم من الغيمة التراسل علامة التبويب الجزء Firebase حدة إعدادات. بالنسبة إلى XMPP ، يجب عليك استخدام نفس مفتاح الخادم لإنشاء اتصال.

ترحيل مفاتيح الخادم القديم

بدءًا من مارس 2020 ، توقف FCM عن إنشاء مفاتيح خادم قديمة. وسوف تستمر القائمة مفاتيح الخادم القديمة إلى العمل، ولكن من المستحسن أن تقوم بدلا من استخدام الإصدار الأحدث من المفتاح المسمى مفتاح Server في وحدة التحكم Firebase .

إذا كنت ترغب في حذف مفتاح الخادم القديمة القائمة، يمكنك القيام بذلك في وحدة التحكم سحابة جوجل .

تفويض طلبات HTTP

يتكون طلب الرسالة من جزأين: رأس HTTP ونص HTTP. يجب أن يحتوي رأس HTTP على الرؤوس التالية:

  • Authorization : مفتاح = YOUR_SERVER_KEY
    جعل متأكد من أن هذا هو مفتاح الخادم، قيمتها متاح في سحابة التراسل علامة التبويب الجزء Firebase حدة إعدادات. تم رفض مفاتيح Android و iOS والمتصفح بواسطة 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 يجب أن تستخدم مختلف ID FCM المرسل لتجنب أي مخاطر من إرسال رسائل اختبار للمستخدمين إنتاج أو إرسال رسائل المنبع من المرور عبر اتصالات إنتاج الاختبار.

الاتصال له متطلبان مهمان:

  • يجب عليك بدء اتصال أمان طبقة النقل (TLS). علما بأن FCM لا يدعم حاليا تمديد STARTTLS .
  • يتطلب FCM آلية المصادقة SASL جلي باستخدام <your_FCM_Sender_Id>@fcm.googleapis.com (FCM هوية المرسل ) ومفتاح خادم ككلمة المرور. تتوفر في هذه القيم سحابة التراسل علامة التبويب الجزء Firebase حدة إعدادات.

إذا فشل الاتصال في أي وقت ، يجب عليك إعادة الاتصال على الفور. ليست هناك حاجة للتراجع بعد انقطاع الاتصال الذي يحدث بعد المصادقة. لكل هوية المرسل ، FCM تسمح 2500 اتصالات في نفس الوقت.

توضح المقتطفات التالية كيفية إجراء المصادقة والترخيص لاتصال 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

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 طريقة المصادقة، وتوفير مفتاح الملقم من الغيمة التراسل علامة التبويب الجزء Firebase حدة إعدادات.

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

FCM

<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">

FCM

<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>

FCM

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

ملاحظة: لا يستخدم FCM المورد المنضم أثناء توجيه الرسائل.

رؤية البناء إرسال طلبات للحصول على التفاصيل كاملة على خلق طلبات ترسل. و راثي XMPP بروتوكول المرجعي يقدم قائمة من جميع المعلمات يمكن أن تحتوي رسالتك.