Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

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

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

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

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

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

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

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

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

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

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

निम्न व्यवस्थापक SDK कोड उदाहरण इस रणनीति को दर्शाता है। उदाहरण एप्लिकेशन क्रेडेंशियल्स को स्पष्ट रूप से निर्दिष्ट नहीं करता है। हालाँकि, जब तक पर्यावरण चर सेट किया जाता है, या जब तक कंप्यूट इंजन, Google कुबेरनेट्स इंजन, ऐप इंजन, या क्लाउड फ़ंक्शंस पर एप्लिकेशन चल रहा होता है, तब तक 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 सेवा खातों का समर्थन करते हैं, जिनका उपयोग आप अपने ऐप सर्वर या विश्वसनीय वातावरण से फायरबेस सर्वर एपीआई को कॉल करने के लिए कर सकते हैं। यदि आप स्थानीय रूप से कोड विकसित कर रहे हैं या अपने एप्लिकेशन को ऑन-प्रिमाइसेस परिनियोजित कर रहे हैं, तो आप सर्वर अनुरोधों को अधिकृत करने के लिए इस सेवा खाते के माध्यम से प्राप्त क्रेडेंशियल्स का उपयोग कर सकते हैं।

किसी सेवा खाते को प्रमाणित करने और उसे 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"

खिड़कियाँ

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

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

आपके द्वारा उपरोक्त चरणों को पूरा करने के बाद, एप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल्स (ADC) आपके क्रेडेंशियल्स को स्पष्ट रूप से निर्धारित करने में सक्षम है, जिससे आपको गैर-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.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

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

FCM तक पहुंच अधिकृत करने के लिए, दायरे का अनुरोध करें 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 " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

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

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

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

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

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

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

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

  • Authorization : कुंजी = आपका_SERVER_KEY
    सुनिश्चित करें कि यह सर्वर कुंजी है, जिसका मान फायरबेस कंसोल सेटिंग्स फलक के क्लाउड मैसेजिंग टैब में उपलब्ध है। FCM द्वारा Android, Apple प्लेटफ़ॉर्म और ब्राउज़र कुंजियों को अस्वीकार कर दिया गया है।
  • 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 प्रोटोकॉल संदर्भ आपके संदेश में शामिल सभी पैरामीटर की एक सूची प्रदान करता है।

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

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

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

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

निम्नलिखित स्निपेट 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 सर्वर को फायरबेस कंसोल सेटिंग्स फलक के क्लाउड मैसेजिंग टैब से सर्वर कुंजी प्रदान करते हुए, 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>

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

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