अनुरोधों को भेजने की अनुमति दें

आपके ऐप्लिकेशन सर्वर या भरोसेमंद एनवायरमेंट से FCM को भेजे गए अनुरोधों को अनुमति दी जानी चाहिए. अब काम नहीं करने वाले लेगसी एचटीटीपी एपीआई और एचटीटीपी v1 एपीआई की अनुमति के बीच के इन अहम अंतरों पर ध्यान दें:

  • FCM एचटीटीपी v1 API, कुछ समय तक चलने वाले OAuth 2.0 ऐक्सेस टोकन वाले अनुरोधों को अनुमति देता है. इस टोकन को मिंट करने के लिए, आप Google ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (Google सर्वर वातावरण में) का उपयोग कर सकते हैं और/या किसी सेवा खाते के लिए जनरेट की गई JSON निजी कुंजी फ़ाइल से मैन्युअल रूप से आवश्यक क्रेडेंशियल पा सकते हैं. अगर मैसेज भेजने के लिए Firebase एडमिन SDK का इस्तेमाल किया जा रहा है, तो लाइब्रेरी आपके लिए टोकन को हैंडल करती है.
  • काम नहीं करने वाले लेगसी प्रोटोकॉल, Firebase कंसोल से मिले सिर्फ़ लंबे समय तक चलने वाली एपीआई कुंजियों का इस्तेमाल कर सकते हैं.

एचटीटीपी v1 से अनुरोध भेजने की अनुमति दें

अपने सर्वर एनवायरमेंट की जानकारी के आधार पर, Firebase सेवाओं के लिए सर्वर के अनुरोधों को अनुमति देने के लिए, इन रणनीतियों का इस्तेमाल करें:

  • Google ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (एडीसी)
  • सेवा खाते की JSON फ़ाइल
  • सेवा खाते से मिला, कुछ समय के लिए उपलब्ध OAuth 2.0 ऐक्सेस टोकन

अगर आपका ऐप्लिकेशन Compute Engine, Google Kubernetes Engine, App Engine या Cloud Functions पर चल रहा है, तो ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (ADC) का इस्तेमाल करें. इनमें Firebase के लिए Cloud Functions भी शामिल है. अनुरोधों को अनुमति देने के लिए क्रेडेंशियल हासिल करने के लिए, ADC आपके मौजूदा डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है. साथ ही, ADC, एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS के ज़रिए सुविधाजनक लोकल टेस्टिंग की सुविधा देता है. अनुमति देने के फ़्लो को पूरी तरह से अपने-आप पूरा करने के लिए, एडमिन SDK सर्वर लाइब्रेरी के साथ-साथ ADC का इस्तेमाल करें.

अगर आपका ऐप्लिकेशन, Google से बाहर के सर्वर एनवायरमेंट पर चल रहा है, तो आपको अपने Firebase प्रोजेक्ट से, सेवा खाते की JSON फ़ाइल डाउनलोड करनी होगी. जब तक आपके पास निजी कुंजी वाली फ़ाइल वाले फ़ाइल सिस्टम का ऐक्सेस है, तब तक मैन्युअल तरीके से मिले इन क्रेडेंशियल से मिले अनुरोधों को अनुमति देने के लिए, एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS का इस्तेमाल किया जा सकता है. अगर आपके पास ऐसी फ़ाइल का ऐक्सेस नहीं है, तो आपको अपने कोड में सेवा खाते की फ़ाइल का रेफ़रंस देना चाहिए. ऐसा करते समय बहुत सावधानी बरतें, क्योंकि आपके क्रेडेंशियल सार्वजनिक हो सकते हैं.

एडीसी का इस्तेमाल करके क्रेडेंशियल दें

Google ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (एडीसी), आपके क्रेडेंशियल की जांच इस क्रम में करते हैं:

  1. ADC यह देखता है कि एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS सेट है या नहीं. अगर वैरिएबल सेट है, तो ADC उस सेवा खाते की फ़ाइल का इस्तेमाल करता है जिस पर वैरिएबल ले जाता है.

  2. अगर एनवायरमेंट वैरिएबल सेट नहीं है, तो ADC उस डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है जो Compute Engine, Google Kubernetes Engine, App Engine, और Cloud Functions, उन सेवाओं पर चलने वाले ऐप्लिकेशन के लिए उपलब्ध कराता है.

  3. अगर ADC ऊपर दिए गए किसी भी क्रेडेंशियल का इस्तेमाल नहीं कर पाता है, तो सिस्टम गड़बड़ी की सूचना देता है.

एडमिन SDK टूल के कोड का यह उदाहरण, इस रणनीति को दिखाता है. उदाहरण में, ऐप्लिकेशन के क्रेडेंशियल साफ़ तौर पर नहीं बताए गए हैं. हालांकि, जब तक एनवायरमेंट वैरिएबल सेट है या ऐप्लिकेशन Compute Engine, Google Kubernetes Engine, App Engine या Cloud Functions पर चल रहा है, तब तक ADC सीधे तौर पर क्रेडेंशियल ढूंढ सकता है.

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

शुरू करें

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 सेवा खातों के साथ काम करते हैं. इनका इस्तेमाल करके, अपने ऐप्लिकेशन सर्वर या भरोसेमंद एनवायरमेंट से Firebase सर्वर एपीआई को कॉल किया जा सकता है. अगर आपको स्थानीय तौर पर कोड डेवलप करना है या ऐप्लिकेशन को कंपनी की इमारत में डिप्लॉय करना है, तो सर्वर के अनुरोधों को अनुमति देने के लिए, इस सेवा खाते से मिले क्रेडेंशियल का इस्तेमाल किया जा सकता है.

सेवा खाते की पुष्टि करने और उसे Firebase की सेवाएं ऐक्सेस करने की अनुमति देने के लिए, आपको JSON फ़ॉर्मैट में एक निजी कुंजी फ़ाइल जनरेट करनी होगी.

अपने सेवा खाते के लिए, निजी पासकोड वाली फ़ाइल जनरेट करने के लिए:

  1. Firebase कंसोल में, सेटिंग > सेवा खाते खोलें.

  2. नई निजी कुंजी जनरेट करें पर क्लिक करें, फिर कुंजी जनरेट करें पर क्लिक करके पुष्टि करें.

  3. कुंजी वाली JSON फ़ाइल को सुरक्षित तरीके से सेव करें.

सेवा खाते से अनुमति देते समय, आपके पास अपने ऐप्लिकेशन को क्रेडेंशियल देने के दो विकल्प होते हैं. आपके पास GOOGLE_APPLICATION_CREDENTIALS एनवायरमेंट वैरिएबल को सेट करने का विकल्प है. इसके अलावा, कोड में सेवा खाता कुंजी के पाथ को साफ़ तौर पर पास किया जा सकता है. पहला विकल्प ज़्यादा सुरक्षित है और इसे इस्तेमाल करने का सुझाव दिया जाता है.

एनवायरमेंट वैरिएबल सेट करने के लिए:

एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS को उस JSON फ़ाइल के फ़ाइल पाथ पर सेट करें जिसमें आपकी सेवा खाता कुंजी है. यह वैरिएबल सिर्फ़ आपके मौजूदा शेल सेशन पर लागू होता है. इसलिए, नया सेशन खोलने पर वैरिएबल को फिर से सेट करें.

Linux या 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"

ऊपर दिए गए चरणों को पूरा करने के बाद, ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (एडीसी) आपके क्रेडेंशियल को सीधे तौर पर तय कर सकते हैं. इससे, Google से बाहर के प्लैटफ़ॉर्म में जांच करते समय या रन करते समय, सेवा खाते के क्रेडेंशियल का इस्तेमाल किया जा सकता है.

ऐक्सेस टोकन को मिंट करने के लिए, क्रेडेंशियल का इस्तेमाल करें

अगर आपने ऐक्सेस टोकन को अपने-आप मैनेज करने वाले एडमिन SDK का इस्तेमाल नहीं किया है, तो आपको ऐक्सेस टोकन को मिंट करना होगा और अनुरोध भेजने के लिए उसे जोड़ना होगा.

कुछ समय के लिए काम करने वाले OAuth 2.0 ऐक्सेस टोकन को फिर से पाने के लिए, अपनी पसंदीदा भाषा के लिए Google ऑथराइज़ेशन लाइब्रेरी के साथ अपने Firebase क्रेडेंशियल का इस्तेमाल करें:

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 के स्कोप का अनुरोध करें.

ऐक्सेस टोकन को किसी एचटीटीपी अनुरोध के हेडर में जोड़ने के लिए:

Authorization: Bearer <access_token> फ़ॉर्मैट में, Authorization हेडर की वैल्यू के तौर पर टोकन जोड़ें:

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;

लेगसी प्रोटोकॉल को मैसेज भेजने के अनुरोध की अनुमति दें

एचटीटीपी के पुराने प्रोटोकॉल के तहत, हर अनुरोध में Firebase कंसोल के सेटिंग पैनल के क्लाउड से मैसेज टैब की सर्वर कुंजी शामिल होनी चाहिए. XMPP के लिए, कनेक्शन स्थापित करने के लिए आपको एक ही सर्वर कुंजी का उपयोग करना होगा.

लेगसी सर्वर कुंजियों को माइग्रेट करें

मार्च 2020 से, FCM ने लेगसी सर्वर कुंजियां बनाना बंद कर दिया है. मौजूदा पुरानी सर्वर कुंजियां काम करती रहेंगी. हालांकि, हमारा सुझाव है कि आप इसके बजाय Firebase कंसोल में सर्वर कुंजी लेबल वाला नया वर्शन इस्तेमाल करें.

अगर आपको किसी मौजूदा पुराने सर्वर कुंजी को मिटाना है, तो Google Cloud Console में जाएं.

एचटीटीपी अनुरोधों को अनुमति दें

मैसेज के अनुरोध के दो हिस्से होते हैं: एचटीटीपी हेडर और एचटीटीपी का मुख्य हिस्सा. एचटीटीपी हेडर में ये हेडर होने चाहिए:

  • Authorization: key=YOUR_SERVER_KEY
    पक्का करें कि यह सर्वर कुंजी है, जिसकी वैल्यू Firebase कंसोल के सेटिंग पैनल के क्लाउड से मैसेज टैब में उपलब्ध है. Android, Apple प्लैटफ़ॉर्म, और ब्राउज़र कुंजियों को FCM ने अस्वीकार कर दिया है.
  • Content-Type: JSON के लिए application/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" : {
    ...
  },
}

भेजने के अनुरोध बनाने के बारे में पूरी जानकारी के लिए, अनुरोध भेजें देखें. लेगसी एचटीटीपी प्रोटोकॉल रेफ़रंस में, उन सभी पैरामीटर की सूची होती है जो आपके मैसेज में शामिल हो सकते हैं.

सर्वर कुंजी की वैधता की जांच की जा रही है

अगर आपको ईमेल भेजते समय पुष्टि करने से जुड़ी गड़बड़ियां मिलती हैं, तो देखें कि आपकी सर्वर कुंजी मान्य है या नहीं. उदाहरण के लिए, 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\"]}"

अगर आपको 401 एचटीटीपी स्टेटस कोड मिलता है, तो इसका मतलब है कि आपकी सर्वर कुंजी मान्य नहीं है.

किसी XMPP कनेक्शन को अधिकृत करें

XMPP के साथ, आप FCM सर्वर के लिए एक स्थायी, एसिंक्रोनस, द्विदिशात्मक कनेक्शन बनाए रख सकते हैं. कनेक्शन का इस्तेमाल आपके सर्वर और उपयोगकर्ताओं के FCM से कनेक्ट किए गए डिवाइसों के बीच मैसेज भेजने और पाने के लिए किया जा सकता है.

FCM से लंबे समय तक चलने वाले कनेक्शन को मैनेज करने के लिए, ज़्यादातर XMPP लाइब्रेरी का इस्तेमाल किया जा सकता है. XMPP एंडपॉइंट fcm-xmpp.googleapis.com:5235 पर चलता है. नॉन-प्रोडक्शन उपयोगकर्ताओं के साथ फ़ंक्शन की जांच करने के दौरान, आपको fcm-xmpp.googleapis.com:5236 पर प्री-प्रोडक्शन सर्वर से कनेक्ट करना चाहिए (अलग-अलग पोर्ट पर ध्यान दें).

प्री-प्रोडक्शन पर नियमित टेस्ट (एक छोटा एनवायरमेंट जहां नया FCM बिल्ड चलता है) से असली उपयोगकर्ताओं को टेस्ट कोड से अलग करने में मदद मिलती है. fcm-xmpp.googleapis.com:5236 से कनेक्ट करने वाले टेस्ट डिवाइसों और टेस्ट कोड को किसी दूसरे FCM भेजने वाले आईडी का इस्तेमाल करना चाहिए. इससे प्रोडक्शन उपयोगकर्ताओं को टेस्ट मैसेज भेजने या टेस्ट कनेक्शन पर प्रोडक्शन ट्रैफ़िक से अपस्ट्रीम मैसेज भेजने जैसे किसी जोखिम से बचा जा सकता है.

कनेक्शन की दो अहम ज़रूरतें हैं:

  • आपको ट्रांसपोर्ट लेयर सिक्योरिटी (TLS) कनेक्शन शुरू करना होगा. ध्यान दें कि फ़िलहाल FCM STARTTLS एक्सटेंशन के साथ काम नहीं करता.
  • FCM को <your_FCM_Sender_Id>@fcm.googleapis.com (FCM भेजने वाले का आईडी) और पासवर्ड के तौर पर सर्वर कुंजी का इस्तेमाल करके, SASL PLAIN की पुष्टि करने वाले तरीके की ज़रूरत होती है. ये वैल्यू Firebase कंसोल के सेटिंग पैनल के क्लाउड से मैसेज टैब में उपलब्ध हैं.

अगर किसी भी समय कनेक्शन टूटता है, तो आपको तुरंत फिर से कनेक्ट करना चाहिए. पुष्टि होने के बाद डिसकनेक्ट होने के बाद, वापस जाने की कोई ज़रूरत नहीं है. हर भेजने वाले का आईडी के लिए, FCM एक साथ 2,500 कनेक्शन की अनुमति देता है.

नीचे दिए गए स्निपेट बताते हैं कि FCM के लिए XMPP कनेक्शन के लिए पुष्टि और अनुमति देने का तरीका क्या है.

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 प्रोटोकॉल रेफ़रंस में, उन सभी पैरामीटर की सूची होती है जो आपके मैसेज में शामिल हो सकते हैं.