Eski FCM API'lerinden HTTP v1'e geçiş yapın

HTTP ve XMPP için desteği sonlandırılmış FCM eski API'lerini kullanan uygulamalar HTTP v1 API'yi geri yükleyin. İleti gönderme (yukarı akış mesajları dahil) bu API'lerle şu tarihte kullanımdan kaldırılmıştır: 20 Haziran 2023'te başlayacak ve kapanış 22 Temmuz 2024'te başlayacak.

Etkilenen belirli özellikler hakkında daha fazla bilgi edinin.

HTTP v1 API, devam eden desteğe ve yeni özelliklere ek olarak Eski API'lere göre şu avantajları vardır:

  • Erişim jetonları ile daha iyi güvenlik HTTP v1 API, kısa ömürlü erişim kullanır jetonları OAuth2 güvenlik modeline göre belirlenmiştir. Karşı tarafın erişim jetonu herkese açık hale gelir ve yalnızca kötü amaçlı olarak kullanılabilir yaklaşık bir saat önce sona erecektir. Yenileme jetonları, kullanılan güvenlik anahtarlarıyla aynı sıklıkta iletilmez olduğundan bunların yakalanma olasılığı çok daha düşüktür.

  • Farklı platformlarda mesajların daha verimli bir şekilde özelleştirilmesi. Mesaj için body, HTTP v1 API tüm hedeflenen örneklere giden ortak anahtarlara ve platforma özel anahtarlara sahiptir Bu da mesajı farklı platformlarda özelleştirmenizi sağlar. Bu şekilde şunları yapabilirsiniz: "geçersiz kılmalar" oluşturma farklı alanlara biraz farklı yük gönderen tek bir mesajla gönderin.

  • Yeni istemci platformu sürümleri için daha genişletilebilir ve geleceğe hazır HTTP v1 API; Apple platformları, Android ve Web. Her platformun JSON yükünde kendi tanımlı bloğu olduğundan, FCM, API'yi yeni sürümlere ve yeni platformlara genişletebilir gerekir.

Sunucu uç noktasını güncelleme

HTTP v1 API'nin uç nokta URL'si, bu yöntemler:

  • Bu URL'nin sürümü oluşturulmuş ve yolda /v1 bulunuyor.
  • Yol, şuna ait Firebase projesinin proje kimliğini içerir: /projects/myproject-ID/ biçiminde girin. Bu kimlik aşağıdaki dillerde mevcuttur: Genel proje ayarları sekmesinden Firebase konsolu.
  • send yöntemini açıkça :send olarak belirtir.

HTTP v1 için sunucu uç noktasını güncellemek üzere bu öğeleri uç noktaya ekleyin ifadesini girin.

Şu tarihten önceki HTTP istekleri:

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

Şu tarihten önceki XMPP istekleri:

Eski XMPP mesajları, aşağıdaki uç noktaya bir bağlantı üzerinden gönderilir:

fcm-xmpp.googleapis.com:5235

Sonra

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

Gönderme isteklerinin yetkilendirmesini güncelleme

Eski isteklerde kullanılan sunucu anahtarı dizesinin yerine HTTP v1 gönderme istekleri OAuth 2.0 erişim jetonu gerektirir. Admin SDK'yı kullanıyorsanız kitaplığınız, jetonu sizin yerinize işler. Efekt kullanıyorsanız ham protokolü kullanıyorsanız jetonu bu bölümde açıklandığı şekilde alın ve Authorization: Bearer <valid Oauth 2.0 token> olarak üstbilgiyi görürsünüz.

Önce

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

Sonra

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

İş görüşmelerinizin ayrıntılarına kullanıyorsanız, sunucuyu yetkilendirmek için bu stratejilerin bir kombinasyonunu Firebase hizmetlerine gönderilen istekler:

  • Google Uygulaması Varsayılan Kimlik Bilgileri (ADC)
  • Hizmet hesabı JSON dosyası
  • Bir hizmet hesabından türetilen kısa ömürlü bir OAuth 2.0 erişim jetonu

Uygulamanız Compute Engine üzerinde çalışıyorsa Google Kubernetes Engine, App Engine veya Cloud Functions Cloud Functions for Firebase dahil olmak üzere, Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanın. ADC, mevcut varsayılan hizmetinizi kullanır yetkilendirmek için kimlik bilgilerini alması gerektiğini varsayalım. ADC, ortam değişkeni aracılığıyla esnek yerel test GOOGLE_APPLICATION_CREDENTIALS Eksiksiz otomasyondan yararlanmak için Yetkilendirme akışı için ADC'yi Yönetici SDK'sı sunucu kitaplıklarıyla birlikte kullanın.

Uygulamanız Google harici bir sunucu ortamında çalışıyorsa, Firebase projenizden bir hizmet hesabı JSON dosyası indirmeniz gerekir. Örneğin, özel anahtar dosyası oluşturmak için İstekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS bu bilgileri manuel olarak alabilirsiniz. kodunuzda hizmet hesabı dosyasına referans vermeniz gerekir. kimlik bilgilerinizi ifşa etme riski taşıdığından son derece dikkatli bir şekilde yapılmalıdır.

ADC kullanarak kimlik bilgisi sağlama

Google Uygulaması Varsayılan Kimlik Bilgileri (ADC), kimlik bilgilerinizi kontrol eder şu sırada:

  1. ADC, ortam değişkeninin GOOGLE_APPLICATION_CREDENTIALS ayarlandı. Değişken ayarlanırsa ADC, değişkenin işaret ettiği hizmet hesabı dosyasını kullanır.

  2. Ortam değişkeni belirlenmediyse ADC, varsayılan hizmet hesabını kullanır Google Kubernetes Engine, App Engine, ve Cloud Functions, bu hizmetlerde çalışan uygulamalar sunar.

  3. ADC yukarıdaki kimlik bilgilerinden herhangi birini kullanamazsa sistem bir hata verir.

Aşağıdaki Yönetici SDK'sı kod örneğinde bu strateji gösterilmektedir. Örnek uygulama kimlik bilgilerini açık bir şekilde belirtmez. Ancak ADC, ortam değişkeni ayarlandığı sürece kimlik bilgilerini dolaylı olarak bulabilir veya uygulama Compute Engine'de çalıştığı sürece Google Kubernetes Engine, App Engine veya Cloud Functions.

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

Go

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

Kimlik bilgilerini manuel olarak sağlayın

Firebase projeleri Google'ı destekler hizmet hesapları kullanıyorsanız Firebase'i çağırmak için kullanabileceğiniz uygulama sunucunuzdaki veya güvenilir ortamınızdaki sunucu API'leri Proje yöneticisi olarak yerel olarak kodlayın veya uygulamanızı şirket içine dağıtın edinilen kimlik bilgilerini kullanabilir bu hizmet hesabını kullanarak sunucu isteklerini yetkilendirebilir.

Bir hizmet hesabının kimliğini doğrulama ve hesabı yetkilendirme Firebase hizmetlerine erişmek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir biçimindedir.

Hizmet hesabınız için özel anahtar dosyası oluşturmak üzere:

  1. Firebase konsolunda şu dosyayı açın: Ayarlar > Hizmet Hesapları.

  2. Yeni Özel Anahtar Oluştur'u tıklayın ve ardından Anahtar Oluştur'u tıklayarak onaylayın.

  3. Anahtarı içeren JSON dosyasını güvenli bir şekilde depolayın.

Bir hizmet hesabı aracılığıyla yetkilendirme yaparken, uygulamanıza kimlik bilgisi ekleyin. İsterseniz GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni kullanabilirsiniz. hizmet hesabı anahtarının yolunu kodda açıkça iletin. İlk seçenek daha güvenlidir ve kesinlikle önerilir.

Ortam değişkenini ayarlamak için:

GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayın hizmet hesabı anahtarınızı içeren JSON dosyasının dosya yoluna. Bu değişken yalnızca mevcut kabuk oturumunuz için geçerlidir. Bu nedenle, yeni bir oturum açmak istiyorsanız değişkeni tekrar ayarlayın.

Linux veya macOS

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

Windows

Powerpoint ile:

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

Yukarıdaki adımları tamamladıktan sonra Uygulama Varsayılan Kimlik Bilgileri (ADC) kimlik bilgilerinizi dolaylı yoldan belirleyerek hesap kimlik bilgilerini ele alacağız.

Erişim jetonlarını basmak için kimlik bilgilerini kullanın

Firebase kimlik bilgilerinizi Google Kimlik Doğrulama Kitaplığı kısa ömürlü bir OAuth 2.0 erişim jetonu almak için tercih ettiğiniz dile dokunun:

düğüm.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);
    });
  });
}

Bu örnekte, Google API istemci kitaplığı isteğin kimliğini JSON web jetonu veya JWT. Daha fazla bilgi için bkz. JSON web jetonları.

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

Erişim jetonunuzun süresi dolduktan sonra jeton yenileme yöntemi çağrılır. otomatik olarak alır.

FCM'ye erişimi yetkilendirmek için kapsamı isteyin https://www.googleapis.com/auth/firebase.messaging

Erişim jetonunu HTTP istek başlığına eklemek için:

Jetonu Authorization başlığının değeri olarak şu biçimde ekleyin: Authorization: Bearer <access_token>:

düğüm.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;

Gönderme isteklerinin yükünü güncelleme

FCM HTTP v1, JSON mesajının yapısında önemli bir değişiklik yaratıyor yük. Öncelikle, bu değişiklikler iletilerin doğru bir şekilde işlenmesini sağlar. Google Analytics 4'e göre Ayrıca değişiklikler size özelleştirmek için ekstra esneklik ya da "geçersiz kılma" mesaj alanı sayısını artırır.

Bu bölümdeki örnekleri incelemenin yanı sıra bkz. Mesajları farklı platformlarda özelleştirin ve API referansı hakkında bilgi sahibisiniz.

Örnek: basit bildirim mesajı

Burada, çok basit bir bildirim yükünün karşılaştırması verilmiştir. Yalnızca title, body ve data alanları için geçerlidir. Bu, farkı vardır.

Önce

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

Sonra

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

Örnek: iç içe yerleştirilmiş JSON verileri

Eski mesajlaşma API'sinin aksine HTTP v1 API, data alanında iç içe yerleştirilmiş JSON değerlerini desteklemez. JSON'den dizeye dönüşüm gereklidir.

Önce

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

Sonra

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

Örnek: birden fazla platformu hedefleme

Eski API, çoklu platform hedeflemeyi etkinleştirmek için geçersiz kılma işlemleri gerçekleştirdi bu arka uçta yer alır. Buna karşılık HTTP v1, Platformlar arasında fark yaratan, platforma özgü anahtar blokları açık ve geliştirici tarafından görülebilir. Bu strateji, birden fazla aşağıdaki örnekte gösterildiği gibi her zaman tek bir istekle kullanılabilir.

Önce

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

Sonra

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

Örnek: platform geçersiz kılmalarıyla özelleştirme

HTTP v1 API, mesajların platformlar arası hedeflemesini basitleştirmenin yanı sıra mesajları platforma göre özelleştirme esnekliği sunar.

Önce

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

Sonra

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

Örnek: belirli cihazları hedefleme

HTTP v1 API ile belirli cihazları hedeflemek için cihazın token anahtarındaki geçerli kayıt jetonunu to tuşuna basın.

Önce

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

Sonra

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

FCM HTTP v1 API hakkında daha fazla örnek ve bilgi için aşağıdakilere bakın: