লিগ্যাসি FCM API থেকে HTTP v1-এ স্থানান্তর করুন

HTTP এবং XMPP-এর জন্য উপেক্ষিত FCM লিগ্যাসি API ব্যবহার করে অ্যাপগুলিকে দ্রুততম সুযোগে HTTP v1 API-এ স্থানান্তরিত করা উচিত। সেই APIগুলির সাথে বার্তা পাঠানো (আপস্ট্রিম বার্তা সহ) 20 শে জুন, 2023 তারিখে অবমুক্ত করা হয়েছিল এবং 22 জুলাই, 2024 থেকে শাটডাউন শুরু হয়

প্রভাবিত হয় যে নির্দিষ্ট বৈশিষ্ট্য সম্পর্কে আরও জানুন.

চলমান সমর্থন এবং নতুন বৈশিষ্ট্যগুলি ছাড়াও, HTTP v1 API-এর লিগ্যাসি APIগুলির তুলনায় এই সুবিধাগুলি রয়েছে:

  • অ্যাক্সেস টোকেনগুলির মাধ্যমে আরও ভাল সুরক্ষা HTTP v1 API OAuth2 সুরক্ষা মডেল অনুসারে স্বল্পকালীন অ্যাক্সেস টোকেন ব্যবহার করে৷ যদি একটি অ্যাক্সেস টোকেন সর্বজনীন হয়ে যায়, তবে এটি মেয়াদ শেষ হওয়ার আগে এক ঘন্টা বা তার বেশি সময়ের জন্য এটি দূষিতভাবে ব্যবহার করা যেতে পারে। রিফ্রেশ টোকেনগুলি লিগ্যাসি API-তে ব্যবহৃত নিরাপত্তা কীগুলির মতো প্রায়ই প্রেরণ করা হয় না, তাই সেগুলি ক্যাপচার হওয়ার সম্ভাবনা অনেক কম৷

  • প্ল্যাটফর্ম জুড়ে বার্তাগুলির আরও দক্ষ কাস্টমাইজেশন মেসেজ বডির জন্য, HTTP v1 API-তে সাধারণ কী রয়েছে যা সমস্ত লক্ষ্যযুক্ত উদাহরণে যায়, প্লাটফর্ম-নির্দিষ্ট কী যা আপনাকে প্ল্যাটফর্ম জুড়ে বার্তাটি কাস্টমাইজ করতে দেয়। এটি আপনাকে "ওভাররাইড" তৈরি করতে দেয় যা একটি একক বার্তায় বিভিন্ন ক্লায়েন্ট প্ল্যাটফর্মে সামান্য ভিন্ন পেলোড পাঠায়।

  • নতুন ক্লায়েন্ট প্ল্যাটফর্ম সংস্করণের জন্য আরও প্রসারিত এবং ভবিষ্যত-প্রমাণ HTTP v1 API অ্যাপল প্ল্যাটফর্ম, অ্যান্ড্রয়েড এবং ওয়েবে উপলব্ধ মেসেজিং বিকল্পগুলিকে সম্পূর্ণরূপে সমর্থন করে। যেহেতু প্রতিটি প্ল্যাটফর্মের JSON পেলোডে নিজস্ব সংজ্ঞায়িত ব্লক রয়েছে, তাই FCM এপিআইকে প্রয়োজন অনুসারে নতুন সংস্করণ এবং নতুন প্ল্যাটফর্মে প্রসারিত করতে পারে।

সার্ভারের শেষ পয়েন্ট আপডেট করুন

HTTP v1 API-এর এন্ডপয়েন্ট ইউআরএল এই উপায়ে লিগ্যাসি এন্ডপয়েন্ট থেকে আলাদা:

  • পাথে /v1 সহ এটি সংস্করণ করা হয়েছে।
  • পাথটিতে আপনার অ্যাপের জন্য ফায়ারবেস প্রজেক্টের প্রোজেক্ট আইডি রয়েছে, ফর্ম্যাটে /projects/myproject-ID/ । এই আইডিটি Firebase কনসোলের সাধারণ প্রকল্প সেটিংস ট্যাবে উপলব্ধ।
  • এটি স্পষ্টভাবে উল্লেখ করে যে send পদ্ধতিটি :send

HTTP v1-এর জন্য সার্ভার এন্ডপয়েন্ট আপডেট করতে, আপনার পাঠানো অনুরোধের শিরোনামে এন্ডপয়েন্টে এই উপাদানগুলি যোগ করুন।

HTTP অনুরোধ আগে

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

XMPP এর আগে অনুরোধ করে

লিগ্যাসি XMPP বার্তাগুলি নিম্নলিখিত এন্ডপয়েন্টের সাথে একটি সংযোগের মাধ্যমে পাঠানো হয়:

fcm-xmpp.googleapis.com:5235

পরে

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

অনুরোধ পাঠানোর অনুমোদন আপডেট করুন

লিগ্যাসি অনুরোধে ব্যবহৃত সার্ভার কী স্ট্রিংয়ের জায়গায়, HTTP v1 অনুরোধ পাঠাতে একটি OAuth 2.0 অ্যাক্সেস টোকেন প্রয়োজন। আপনি বার্তা পাঠানোর জন্য অ্যাডমিন SDK ব্যবহার করলে, লাইব্রেরি আপনার জন্য টোকেন পরিচালনা করে। আপনি যদি eef raw প্রোটোকল ব্যবহার করেন, তাহলে এই বিভাগে বর্ণিত টোকেনটি পান এবং এটিকে Authorization: Bearer <valid Oauth 2.0 token>

আগে

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

পরে

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

আপনার সার্ভার পরিবেশের বিশদ বিবরণের উপর নির্ভর করে, Firebase পরিষেবাগুলিতে সার্ভারের অনুরোধগুলি অনুমোদন করতে এই কৌশলগুলির সংমিশ্রণ ব্যবহার করুন:

  • Google অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র (ADC)
  • একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল
  • একটি পরিষেবা অ্যাকাউন্ট থেকে প্রাপ্ত একটি স্বল্পকালীন OAuth 2.0 অ্যাক্সেস টোকেন

আপনার অ্যাপ্লিকেশন যদি Compute Engine , Google Kubernetes Engine , App Engine , বা ক্লাউড ফাংশন ( Cloud Functions for Firebase সহ) Compute Engine Google Kubernetes Engine App Engine , তাহলে অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র (ADC) ব্যবহার করুন। ADC আপনার বিদ্যমান ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে অনুরোধগুলি অনুমোদন করার জন্য শংসাপত্রগুলি পেতে, এবং ADC পরিবেশ পরিবর্তনশীল GOOGLE_APPLICATION_CREDENTIALS মাধ্যমে নমনীয় স্থানীয় পরীক্ষা সক্ষম করে। অনুমোদন প্রবাহের সম্পূর্ণ অটোমেশনের জন্য, অ্যাডমিন SDK সার্ভার লাইব্রেরির সাথে ADC ব্যবহার করুন।

যদি আপনার অ্যাপ্লিকেশনটি একটি নন-Google সার্ভার পরিবেশে চলছে , তাহলে আপনাকে আপনার Firebase প্রকল্প থেকে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ডাউনলোড করতে হবে। যতক্ষণ পর্যন্ত আপনার ব্যক্তিগত কী ফাইল ধারণকারী একটি ফাইল সিস্টেমে অ্যাক্সেস থাকে, আপনি এই ম্যানুয়ালি প্রাপ্ত শংসাপত্রগুলির সাথে অনুরোধগুলি অনুমোদন করতে পরিবেশ পরিবর্তনশীল GOOGLE_APPLICATION_CREDENTIALS ব্যবহার করতে পারেন৷ আপনার যদি এই ধরনের ফাইল অ্যাক্সেসের অভাব থাকে, তাহলে আপনাকে অবশ্যই আপনার কোডে পরিষেবা অ্যাকাউন্ট ফাইলটি উল্লেখ করতে হবে- যা আপনার শংসাপত্র প্রকাশের ঝুঁকির কারণে অত্যন্ত যত্ন সহকারে করা উচিত।

ADC ব্যবহার করে শংসাপত্র প্রদান করুন

Google Application Default Credentials (ADC) নিম্নলিখিত ক্রমে আপনার শংসাপত্রগুলি পরীক্ষা করে:

  1. ADC এনভায়রনমেন্ট ভেরিয়েবল GOOGLE_APPLICATION_CREDENTIALS সেট করা আছে কিনা তা পরীক্ষা করে। ভেরিয়েবল সেট করা থাকলে, ADC পরিষেবা অ্যাকাউন্ট ফাইল ব্যবহার করে যেটি ভেরিয়েবল নির্দেশ করে।

  2. যদি এনভায়রনমেন্ট ভেরিয়েবল সেট করা না থাকে, ADC ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে যা Compute Engine , Google Kubernetes Engine , App Engine , এবং ক্লাউড ফাংশনগুলি সেই পরিষেবাগুলিতে চলা অ্যাপ্লিকেশনগুলির জন্য প্রদান করে৷

  3. যদি ADC উপরের শংসাপত্রগুলির মধ্যে একটি ব্যবহার করতে না পারে, তাহলে সিস্টেমটি একটি ত্রুটি নিক্ষেপ করে৷

নিম্নলিখিত প্রশাসক SDK কোড উদাহরণ এই কৌশল চিত্রিত. উদাহরণটি স্পষ্টভাবে অ্যাপ্লিকেশন শংসাপত্রগুলি নির্দিষ্ট করে না। যাইহোক, যতক্ষণ পর্যন্ত এনভায়রনমেন্ট ভেরিয়েবল সেট করা থাকে বা যতক্ষণ পর্যন্ত অ্যাপ্লিকেশনটি Compute Engine , Google Kubernetes Engine , App Engine বা ক্লাউড ফাংশনে চলছে ততক্ষণ পর্যন্ত ADC নিহিতভাবে শংসাপত্রগুলি খুঁজে পেতে সক্ষম।

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 পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করে, যা আপনি আপনার অ্যাপ সার্ভার বা বিশ্বস্ত পরিবেশ থেকে Firebase সার্ভার API কল করতে ব্যবহার করতে পারেন৷ আপনি যদি স্থানীয়ভাবে কোড ডেভেলপ করছেন বা আপনার অ্যাপ্লিকেশনটি প্রাঙ্গনে স্থাপন করছেন, আপনি সার্ভার অনুরোধ অনুমোদন করতে এই পরিষেবা অ্যাকাউন্টের মাধ্যমে প্রাপ্ত শংসাপত্রগুলি ব্যবহার করতে পারেন৷

একটি পরিষেবা অ্যাকাউন্ট প্রমাণীকরণ করতে এবং এটিকে Firebase পরিষেবাগুলি অ্যাক্সেস করার অনুমোদন দিতে, আপনাকে অবশ্যই JSON ফর্ম্যাটে একটি ব্যক্তিগত কী ফাইল তৈরি করতে হবে৷

আপনার পরিষেবা অ্যাকাউন্টের জন্য একটি ব্যক্তিগত কী ফাইল তৈরি করতে:

  1. Firebase কনসোলে, সেটিংস > পরিষেবা অ্যাকাউন্ট খুলুন।

  2. জেনারেট নিউ প্রাইভেট কী ক্লিক করুন, তারপর জেনারেট কী ক্লিক করে নিশ্চিত করুন।

  3. কী আছে এমন JSON ফাইলটি নিরাপদে সংরক্ষণ করুন।

একটি পরিষেবা অ্যাকাউন্টের মাধ্যমে অনুমোদন করার সময়, আপনার আবেদনে শংসাপত্রগুলি প্রদান করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে৷ আপনি হয় GOOGLE_APPLICATION_CREDENTIALS এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন, অথবা আপনি কোডে পরিষেবা অ্যাকাউন্ট কী-এর পথটি স্পষ্টভাবে পাস করতে পারেন৷ প্রথম বিকল্পটি আরো নিরাপদ এবং দৃঢ়ভাবে সুপারিশ করা হয়।

পরিবেশ পরিবর্তনশীল সেট করতে:

এনভায়রনমেন্ট ভেরিয়েবল GOOGLE_APPLICATION_CREDENTIALS JSON ফাইলের ফাইল পাথে সেট করুন যাতে আপনার পরিষেবা অ্যাকাউন্ট কী রয়েছে। এই ভেরিয়েবলটি শুধুমাত্র আপনার বর্তমান শেল সেশনে প্রযোজ্য, তাই আপনি যদি একটি নতুন সেশন খোলেন, তাহলে ভেরিয়েবলটি আবার সেট করুন।

লিনাক্স বা ম্যাকোস

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 পরিবেশে পরীক্ষা বা চালানোর সময় পরিষেবা অ্যাকাউন্টের শংসাপত্রগুলি ব্যবহার করার অনুমতি দেয়।

মিন্ট অ্যাক্সেস টোকেন করতে প্রমাণপত্রাদি ব্যবহার করুন

একটি স্বল্পস্থায়ী OAuth 2.0 অ্যাক্সেস টোকেন পুনরুদ্ধার করতে আপনার পছন্দের ভাষার জন্য Google Auth লাইব্রেরির সাথে একসাথে আপনার 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 ওয়েব টোকেন দেখুন।

পাইথন

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;

পাঠানোর অনুরোধের পেলোড আপডেট করুন

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

উদাহরণ: নেস্টেড JSON ডেটা

লিগ্যাসি মেসেজিং API-এর বিপরীতে, HTTP v1 API data ক্ষেত্রে নেস্টেড JSON মান সমর্থন করে না। JSON থেকে স্ট্রিং-এ একটি রূপান্তর প্রয়োজন।

আগে

{
  ...
  "data": {
    "keysandvalues": {"key1": "value1", "key2": 123}
  }
}

পরে

{
  "message": {
   ...
    "data": {
      "keysandvalues": "{\"key1\": \"value1\", \"key2\": 123}"
    }
  }
}

উদাহরণ: একাধিক প্ল্যাটফর্ম লক্ষ্য করা

একাধিক-প্ল্যাটফর্ম টার্গেটিং সক্ষম করতে, লিগ্যাসি 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 key-এর পরিবর্তে token কী-তে ডিভাইসের বর্তমান নিবন্ধন টোকেন প্রদান করুন।

আগে

  { "notification": {
      "body": "This is an FCM notification message!",
      "title": "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 সম্পর্কে আরও নমুনা এবং তথ্যের জন্য, নিম্নলিখিতগুলি দেখুন: