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

लीगेसी HTTP से HTTP v1 में माइग्रेट करें

FCM लीगेसी HTTP API का उपयोग करने वाले ऐप्स को इस गाइड में दिए गए निर्देशों का उपयोग करके HTTP v1 API में माइग्रेट करने पर विचार करना चाहिए। लीगेसी API की तुलना में HTTP v1 API के ये लाभ हैं:

  • एक्सेस टोकन के माध्यम से बेहतर सुरक्षा HTTP v1 API OAuth2 सुरक्षा मॉडल के अनुसार अल्पकालिक एक्सेस टोकन का उपयोग करता है। किसी एक्सेस टोकन के सार्वजनिक होने की स्थिति में, इसे समाप्त होने से पहले केवल एक घंटे या उससे अधिक के लिए दुर्भावनापूर्ण रूप से उपयोग किया जा सकता है। रिफ्रेश टोकन को लीगेसी एपीआई में उपयोग की जाने वाली सुरक्षा कुंजियों के रूप में अक्सर प्रसारित नहीं किया जाता है, इसलिए उनके पकड़े जाने की संभावना बहुत कम होती है।

  • सभी प्लेटफ़ॉर्म पर संदेशों का अधिक कुशल अनुकूलन संदेश के मुख्य भाग के लिए, HTTP v1 API में सामान्य कुंजियाँ हैं जो सभी लक्षित उदाहरणों पर जाती हैं, साथ ही प्लेटफ़ॉर्म-विशिष्ट कुंजियाँ जो आपको प्लेटफ़ॉर्म पर संदेश को अनुकूलित करने देती हैं। यह आपको "ओवरराइड्स" बनाने की अनुमति देता है जो एक ही संदेश में अलग-अलग क्लाइंट प्लेटफॉर्म पर थोड़ा अलग पेलोड भेजते हैं।

  • नए क्लाइंट प्लेटफ़ॉर्म संस्करणों के लिए अधिक विस्तार योग्य और भविष्य-प्रूफ HTTP v1 API Apple प्लेटफ़ॉर्म, Android और वेब पर उपलब्ध मैसेजिंग विकल्पों का पूरी तरह से समर्थन करता है। चूँकि JSON पेलोड में प्रत्येक प्लेटफ़ॉर्म का अपना परिभाषित ब्लॉक होता है, FCM आवश्यकतानुसार नए संस्करणों और नए प्लेटफ़ॉर्म पर API का विस्तार कर सकता है।

सर्वर एंडपॉइंट को अपडेट करें

HTTP v1 API के लिए एंडपॉइंट URL लीगेसी एंडपोंट से इन तरीकों से अलग है:

  • यह पथ में /v1 के साथ संस्करणित है।
  • पथ में आपके ऐप के लिए Firebase प्रोजेक्ट की प्रोजेक्ट आईडी शामिल है, प्रारूप में /projects/myproject-ID/ । यह आईडी फायरबेस कंसोल के सामान्य प्रोजेक्ट सेटिंग टैब में उपलब्ध है।
  • यह स्पष्ट रूप से send विधि को :send के रूप में निर्दिष्ट करता है।

HTTP v1 के लिए सर्वर एंडपॉइंट को अपडेट करने के लिए, इन तत्वों को अपने भेजें अनुरोधों के शीर्षलेख में एंडपॉइंट में जोड़ें।

पहले

POST https://fcm.googleapis.com/fcm/send

बाद

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

भेजने के अनुरोधों का प्राधिकरण अपडेट करें

लीगेसी अनुरोधों में प्रयुक्त सर्वर कुंजी स्ट्रिंग के स्थान पर, HTTP v1 भेजने के अनुरोधों के लिए OAuth 2.0 एक्सेस टोकन की आवश्यकता होती है। यदि आप संदेश भेजने के लिए व्यवस्थापक SDK का उपयोग कर रहे हैं, तो लाइब्रेरी आपके लिए टोकन संभालती है। यदि आप कच्चे प्रोटोकॉल का उपयोग कर रहे हैं, तो इस खंड में वर्णित टोकन प्राप्त करें और इसे हेडर में Authorization: Bearer <valid Oauth 2.0 token>

पहले

Authorization: key=AIzaSyZ-1u...0GBYzPu7Udno5aA

बाद

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

भेजें अनुरोधों के पेलोड को अपडेट करें

FCM HTTP v1 JSON संदेश पेलोड की संरचना में एक महत्वपूर्ण परिवर्तन प्रस्तुत करता है। मुख्य रूप से, ये परिवर्तन सुनिश्चित करते हैं कि विभिन्न क्लाइंट प्लेटफॉर्म पर प्राप्त होने पर संदेशों को सही ढंग से संभाला जाता है; इसके अतिरिक्त, परिवर्तन आपको प्रति प्लेटफ़ॉर्म संदेश फ़ील्ड को अनुकूलित करने, या "ओवरराइड" करने के लिए अतिरिक्त लचीलापन देते हैं।

इस अनुभाग में उदाहरणों का निरीक्षण करने के अलावा, प्लेटफ़ॉर्म पर एक संदेश को कस्टमाइज़ करना देखें और HTTP v1 से परिचित होने के लिए API संदर्भ की समीक्षा करें।

उदाहरण: साधारण सूचना संदेश

यहां एक बहुत ही सरल अधिसूचना पेलोड की तुलना की गई है—जिसमें केवल title , body और data फ़ील्ड शामिल हैं—लेगेसी और HTTP v1 पेलोड में मूलभूत अंतर प्रदर्शित करता है।

पहले

{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

बाद

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

उदाहरण: अनेक प्लेटफ़ॉर्म लक्षित करना

एकाधिक-प्लेटफ़ॉर्म लक्ष्यीकरण को सक्षम करने के लिए, लीगेसी API ने बैकएंड में ओवरराइड का प्रदर्शन किया। इसके विपरीत, HTTP v1 चाबियों के प्लेटफ़ॉर्म-विशिष्ट ब्लॉक प्रदान करता है जो डेवलपर के लिए स्पष्ट और दृश्यमान प्लेटफ़ॉर्म के बीच कोई भी अंतर करता है। यह आपको हमेशा एक ही अनुरोध के साथ कई प्लेटफ़ॉर्म को लक्षित करने की अनुमति देता है, जैसा कि निम्नलिखित नमूने में दिखाया गया है।

पहले

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

बाद

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

उदाहरण: प्लेटफ़ॉर्म ओवरराइड के साथ कस्टमाइज़ करना

संदेशों के क्रॉस-प्लेटफ़ॉर्म लक्ष्यीकरण को सरल बनाने के अलावा, HTTP v1 API प्रति प्लेटफ़ॉर्म संदेशों को अनुकूलित करने के लिए लचीलापन प्रदान करता है।

पहले

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "Check out the Top Story.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

बाद

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY",
        "body": "Check out the Top Story"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

उदाहरण: विशिष्ट उपकरणों को लक्षित करना

HTTP v1 API के साथ विशिष्ट उपकरणों को लक्षित करने के लिए, to के बजाय token कुंजी में उपकरण का वर्तमान पंजीकरण टोकन प्रदान करें।

पहले

  { "notification": {
      "body": "This is an FCM notification message!",
      "time": "FCM Message"
    },
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }

बाद

{
   "message":{
      "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

अधिक नमूनों और FCM HTTP v1 API के बारे में जानकारी के लिए, Firebase ब्लॉग देखें।