अनुरोध भेजने के लिए अधिकृत करें

आपके ऐप सर्वर या विश्वसनीय वातावरण से एफसीएम को भेजे गए अनुरोध अधिकृत होने चाहिए। अप्रचलित लीगेसी HTTP API और HTTP v1 API प्राधिकरण के बीच इन महत्वपूर्ण अंतरों पर ध्यान दें:

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

HTTP v1 अनुरोध भेजने को अधिकृत करें

अपने सर्वर वातावरण के विवरण के आधार पर, फायरबेस सेवाओं के लिए सर्वर अनुरोधों को अधिकृत करने के लिए इन रणनीतियों के संयोजन का उपयोग करें:

  • Google एप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (एडीसी)
  • एक सेवा खाता JSON फ़ाइल
  • सेवा खाते से प्राप्त एक अल्पकालिक OAuth 2.0 एक्सेस टोकन

यदि आपका एप्लिकेशन कंप्यूट इंजन, Google Kubernetes इंजन, ऐप इंजन, या क्लाउड फ़ंक्शंस (फ़ायरबेस के लिए क्लाउड फ़ंक्शंस सहित) पर चल रहा है , तो एप्लिकेशन डिफॉल्ट क्रेडेंशियल्स (एडीसी) का उपयोग करें। ADC अनुरोधों को अधिकृत करने के लिए क्रेडेंशियल प्राप्त करने के लिए आपके मौजूदा डिफ़ॉल्ट सेवा खाते का उपयोग करता है, और ADC पर्यावरण चर GOOGLE_APPLICATION_CREDENTIALS के माध्यम से लचीले स्थानीय परीक्षण को सक्षम करता है। प्राधिकरण प्रवाह के पूर्ण स्वचालन के लिए, एडमिन एसडीके सर्वर लाइब्रेरीज़ के साथ एडीसी का उपयोग करें।

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

एडीसी का उपयोग करके क्रेडेंशियल प्रदान करें

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

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

  2. यदि पर्यावरण चर सेट नहीं है, तो एडीसी डिफ़ॉल्ट सेवा खाते का उपयोग करता है जो कंप्यूट इंजन, Google कुबेरनेट्स इंजन, ऐप इंजन और क्लाउड फ़ंक्शंस उन सेवाओं पर चलने वाले अनुप्रयोगों के लिए प्रदान करते हैं।

  3. यदि एडीसी उपरोक्त क्रेडेंशियल्स में से किसी का भी उपयोग नहीं कर सकता है, तो सिस्टम एक त्रुटि उत्पन्न करता है।

निम्नलिखित एडमिन एसडीके कोड उदाहरण इस रणनीति को दर्शाता है। उदाहरण स्पष्ट रूप से एप्लिकेशन क्रेडेंशियल निर्दिष्ट नहीं करता है। हालाँकि, जब तक पर्यावरण चर सेट है, या जब तक एप्लिकेशन कंप्यूट इंजन, Google Kubernetes इंजन, ऐप इंजन, या क्लाउड फ़ंक्शंस पर चल रहा है, ADC अंतर्निहित रूप से क्रेडेंशियल ढूंढने में सक्षम है।

नोड.जे.एस

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(),
});

क्रेडेंशियल मैन्युअल रूप से प्रदान करें

फायरबेस प्रोजेक्ट Google सेवा खातों का समर्थन करते हैं, जिनका उपयोग आप अपने ऐप सर्वर या विश्वसनीय वातावरण से फायरबेस सर्वर एपीआई को कॉल करने के लिए कर सकते हैं। यदि आप स्थानीय रूप से कोड विकसित कर रहे हैं या अपने एप्लिकेशन को ऑन-प्रिमाइसेस तैनात कर रहे हैं, तो आप सर्वर अनुरोधों को अधिकृत करने के लिए इस सेवा खाते के माध्यम से प्राप्त क्रेडेंशियल्स का उपयोग कर सकते हैं।

किसी सेवा खाते को प्रमाणित करने और उसे फायरबेस सेवाओं तक पहुंचने के लिए अधिकृत करने के लिए, आपको JSON प्रारूप में एक निजी कुंजी फ़ाइल उत्पन्न करनी होगी।

अपने सेवा खाते के लिए एक निजी कुंजी फ़ाइल बनाने के लिए:

  1. फायरबेस कंसोल में, सेटिंग्स > सेवा खाते खोलें।

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

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

सेवा खाते के माध्यम से अधिकृत करते समय, आपके पास अपने आवेदन में क्रेडेंशियल प्रदान करने के लिए दो विकल्प होते हैं। आप या तो GOOGLE_APPLICATION_CREDENTIALS पर्यावरण चर सेट कर सकते हैं, या आप कोड में सेवा खाता कुंजी का पथ स्पष्ट रूप से पास कर सकते हैं। पहला विकल्प अधिक सुरक्षित है और इसकी पुरजोर अनुशंसा की जाती है।

पर्यावरण चर सेट करने के लिए:

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

लिनक्स या macOS

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

खिड़कियाँ

पॉवरशेल के साथ:

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

आपके द्वारा उपरोक्त चरणों को पूरा करने के बाद, एप्लिकेशन डिफॉल्ट क्रेडेंशियल्स (एडीसी) आपके क्रेडेंशियल्स को अंतर्निहित रूप से निर्धारित करने में सक्षम है, जो आपको गैर-Google वातावरण में परीक्षण या चलाने के दौरान सेवा खाता क्रेडेंशियल्स का उपयोग करने की अनुमति देता है।

एक्सेस टोकन प्राप्त करने के लिए क्रेडेंशियल्स का उपयोग करें

जब तक आप एडमिन एसडीके का उपयोग नहीं कर रहे हैं, जो प्राधिकरण को स्वचालित रूप से संभालता है, आपको एक्सेस टोकन को मिंट करना होगा और अनुरोध भेजने के लिए इसे जोड़ना होगा।

अल्पकालिक OAuth 2.0 एक्सेस टोकन प्राप्त करने के लिए अपनी पसंदीदा भाषा के लिए Google Auth लाइब्रेरी के साथ अपने Firebase क्रेडेंशियल का उपयोग करें:

नोड.जे.एस

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

आपके एक्सेस टोकन की समय सीमा समाप्त होने के बाद, अपडेटेड एक्सेस टोकन को पुनः प्राप्त करने के लिए टोकन रिफ्रेश विधि को स्वचालित रूप से कॉल किया जाता है।

एफसीएम तक पहुंच को अधिकृत करने के लिए, स्कोप https://www.googleapis.com/auth/firebase.messaging का अनुरोध करें।

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

Authorization हेडर के मान के रूप में टोकन को Authorization: Bearer <access_token> प्रारूप में जोड़ें:

नोड.जे.एस

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 लीगेसी प्रोटोकॉल के साथ, प्रत्येक अनुरोध में फायरबेस कंसोल सेटिंग्स फलक के क्लाउड मैसेजिंग टैब से सर्वर कुंजी शामिल होनी चाहिए। एक्सएमपीपी के लिए, आपको कनेक्शन स्थापित करने के लिए उसी सर्वर कुंजी का उपयोग करना होगा।

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

मार्च 2020 से, FCM ने लीगेसी सर्वर कुंजियाँ बनाना बंद कर दिया। मौजूदा लीगेसी सर्वर कुंजियाँ काम करती रहेंगी, लेकिन हम अनुशंसा करते हैं कि आप इसके बजाय फायरबेस कंसोल में सर्वर कुंजी लेबल वाले कुंजी के नए संस्करण का उपयोग करें।

यदि आप मौजूदा लीगेसी सर्वर कुंजी को हटाना चाहते हैं, तो आप Google क्लाउड कंसोल में ऐसा कर सकते हैं।

HTTP अनुरोधों को अधिकृत करें

एक संदेश अनुरोध में दो भाग होते हैं: HTTP हेडर और HTTP बॉडी। HTTP हेडर में निम्नलिखित हेडर होने चाहिए:

  • Authorization : कुंजी=आपका_सर्वर_कुंजी
    सुनिश्चित करें कि यह सर्वर कुंजी है, जिसका मान फायरबेस कंसोल सेटिंग्स फलक के क्लाउड मैसेजिंग टैब में उपलब्ध है। 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" : {
    ...
  },
}

भेजें अनुरोध बनाने के बारे में पूरी जानकारी के लिए बिल्ड सेंड रिक्वेस्ट देखें। लीगेसी HTTP प्रोटोकॉल संदर्भ आपके संदेश में शामिल सभी मापदंडों की एक सूची प्रदान करता है।

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

यदि आपको संदेश भेजते समय प्रमाणीकरण त्रुटियाँ प्राप्त होती हैं, तो अपनी सर्वर कुंजी की वैधता की जाँच करें। उदाहरण के लिए, लिनक्स पर, निम्नलिखित कमांड चलाएँ:

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 HTTP स्थिति कोड प्राप्त होता है, तो आपकी सर्वर कुंजी मान्य नहीं है।

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

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

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

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

कनेक्शन की दो महत्वपूर्ण आवश्यकताएँ हैं:

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

यदि किसी भी बिंदु पर कनेक्शन विफल हो जाता है, तो आपको तुरंत पुनः कनेक्ट करना चाहिए। प्रमाणीकरण के बाद होने वाले डिस्कनेक्ट के बाद पीछे हटने की कोई आवश्यकता नहीं है। प्रत्येक प्रेषक आईडी के लिए, एफसीएम समानांतर में 2500 कनेक्शन की अनुमति देता है।

निम्नलिखित स्निपेट बताते हैं कि एफसीएम के लिए एक्सएमपीपी कनेक्शन के लिए प्रमाणीकरण और प्राधिकरण कैसे करें।

एक्सएमपीपी सर्वर

एक्सएमपीपी सर्वर एफसीएम से कनेक्शन का अनुरोध करता है

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

एफसीएम

एफसीएम कनेक्शन खोलता है और 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>

एक्सएमपीपी सर्वर

एक्सएमपीपी सर्वर को फ़ायरबेस कंसोल सेटिंग्स फलक के क्लाउड मैसेजिंग टैब से सर्वर कुंजी प्रदान करते हुए, PLAIN प्रमाणीकरण विधि का उपयोग करके प्रतिक्रिया देनी होगी।

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

एफसीएम

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

एक्सएमपीपी सर्वर

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

एक्सएमपीपी सर्वर

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

नोट: संदेशों को रूट करते समय एफसीएम बाउंड संसाधन का उपयोग नहीं करता है।

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