مجوز ارسال درخواست ها

درخواست‌هایی که از سرور برنامه یا محیط مورد اعتماد شما به FCM ارسال می‌شوند باید مجاز باشند. به این تفاوت های مهم بین API قدیمی HTTP قدیمی و مجوز API 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 که از یک حساب سرویس مشتق شده است

اگر برنامه شما روی 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 (ADC) اعتبار شما را به ترتیب زیر بررسی می کند:

  1. ADC بررسی می کند که آیا متغیر محیطی GOOGLE_APPLICATION_CREDENTIALS تنظیم شده است یا خیر. اگر متغیر تنظیم شده باشد، ADC از فایل حساب سرویس که متغیر به آن اشاره می کند استفاده می کند.

  2. اگر متغیر محیط تنظیم نشده باشد، ADC از حساب سرویس پیش‌فرض که Compute Engine، Google Kubernetes Engine، App Engine و Cloud Functions برای برنامه‌هایی که روی آن سرویس‌ها اجرا می‌شوند، استفاده می‌کند.

  3. اگر ADC نتواند از هیچ یک از اعتبارنامه های بالا استفاده کند، سیستم خطا می دهد.

مثال کد Admin SDK زیر این استراتژی را نشان می دهد. مثال به صراحت اعتبار برنامه را مشخص نمی کند. با این حال، ADC تا زمانی که متغیر محیطی تنظیم شده باشد، یا تا زمانی که برنامه در موتور محاسباتی، موتور Google Kubernetes، 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 از حساب‌های سرویس Google پشتیبانی می‌کنند که می‌توانید از آنها برای فراخوانی APIهای سرور Firebase از سرور برنامه یا محیط مورد اعتماد خود استفاده کنید. اگر در حال توسعه کد به صورت محلی یا نصب برنامه خود در محل هستید، می توانید از اعتبارنامه های به دست آمده از طریق این حساب سرویس برای تأیید درخواست های سرور استفاده کنید.

برای احراز هویت یک حساب سرویس و اجازه دسترسی به خدمات Firebase، باید یک فایل کلید خصوصی با فرمت JSON ایجاد کنید.

برای ایجاد یک فایل کلید خصوصی برای حساب سرویس خود:

  1. در کنسول Firebase، تنظیمات > حساب‌های سرویس را باز کنید.

  2. روی Generate New Private Key کلیک کنید، سپس با کلیک روی Generate Key تأیید کنید.

  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"

پس از تکمیل مراحل بالا، اعتبارنامه پیش‌فرض برنامه (ADC) می‌تواند به طور ضمنی اعتبار شما را تعیین کند و به شما این امکان را می‌دهد که از اعتبار حساب سرویس هنگام آزمایش یا اجرا در محیط‌های غیر Google استفاده کنید.

از اعتبارنامه ها برای برش توکن های دسترسی استفاده کنید

مگر اینکه از Admin SDK استفاده کنید، که مجوز را به طور خودکار مدیریت می کند، باید رمز دسترسی را برش داده و برای ارسال درخواست ها اضافه کنید.

برای بازیابی رمز دسترسی کوتاه مدت OAuth 2.0، از اعتبارنامه Firebase خود به همراه کتابخانه Google Auth برای زبان دلخواه خود استفاده کنید:

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

پایتون

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 " + getServiceAccountAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

مجوز ارسال درخواست های پروتکل قدیمی

با پروتکل قدیمی HTTP، هر درخواست باید حاوی کلید سرور از برگه Cloud Messaging در صفحه تنظیمات کنسول Firebase باشد. برای XMPP، باید از همان کلید سرور برای ایجاد یک اتصال استفاده کنید.

انتقال کلیدهای سرور قدیمی

از مارس 2020، FCM ایجاد کلیدهای سرور قدیمی را متوقف کرد. کلیدهای سرور قدیمی موجود به کار خود ادامه می دهند، اما توصیه می کنیم در عوض از نسخه جدید کلید با برچسب Server key در کنسول Firebase استفاده کنید.

اگر می‌خواهید یک کلید سرور قدیمی موجود را حذف کنید، می‌توانید این کار را در کنسول Google Cloud انجام دهید.

درخواست های HTTP را مجاز کنید

درخواست پیام از دو بخش تشکیل شده است: هدر HTTP و بدنه HTTP. هدر HTTP باید شامل هدرهای زیر باشد:

  • Authorization : key=YOUR_SERVER_KEY
    مطمئن شوید که این کلید سرور است که مقدار آن در برگه Cloud Messaging در صفحه تنظیمات کنسول Firebase موجود است. کلیدهای اندروید، پلتفرم اپل و مرورگر توسط 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 Legacy فهرستی از تمام پارامترهایی که پیام شما می تواند داشته باشد را ارائه می دهد.

بررسی اعتبار کلید سرور

اگر هنگام ارسال پیام ها خطاهای احراز هویت دریافت کردید، اعتبار کلید سرور خود را بررسی کنید. به عنوان مثال، در لینوکس، دستور زیر را اجرا کنید:

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 متفاوتی استفاده کنند تا از خطرات ارسال پیام‌های آزمایشی به کاربران تولیدی یا ارسال پیام‌های بالادستی از ترافیک تولید از طریق اتصالات آزمایشی جلوگیری شود.

اتصال دو الزام مهم دارد:

  • شما باید یک اتصال امنیت لایه حمل و نقل (TLS) را راه اندازی کنید. توجه داشته باشید که FCM در حال حاضر از برنامه افزودنی STARTTLS پشتیبانی نمی کند.
  • FCM به مکانیزم احراز هویت SASL PLAIN با استفاده از <your_FCM_Sender_Id>@fcm.googleapis.com ( شناسه فرستنده FCM ) و کلید سرور به عنوان رمز عبور نیاز دارد. این مقادیر در برگه Cloud Messaging در صفحه تنظیمات کنسول 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 auth پاسخ دهد و کلید سرور را از برگه Cloud Messaging در صفحه تنظیمات کنسول 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 Legacy فهرستی از تمام پارامترهایی که پیام شما می تواند داشته باشد را ارائه می دهد.