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

HTTP ve XMPP için kullanımdan kaldırılan eski FCM API'lerini kullanan uygulamalar, ilk fırsatta HTTP v1 API'sine geçmelidir. Bu API'lerle mesaj gönderme (yukarı akış mesajları dahil) 20 Haziran 2023'te kullanımdan kaldırıldı ve Haziran 2024'te kaldırılacak .

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

  • Erişim belirteçleri aracılığıyla daha iyi güvenlik HTTP v1 API, OAuth2 güvenlik modeline göre kısa ömürlü erişim belirteçleri kullanır. Bir erişim belirtecinin halka açık hale gelmesi durumunda, süresi dolmadan önce yalnızca bir saat kadar kötü amaçlı olarak kullanılabilir. Yenileme belirteçleri, eski API'de kullanılan güvenlik anahtarları kadar sık ​​aktarılmadığından yakalanma olasılıkları çok daha düşüktür.

  • Mesajların platformlar arasında daha verimli şekilde özelleştirilmesi HTTP v1 API, mesaj gövdesi için tüm hedeflenen örneklere giden ortak anahtarlara ve ayrıca mesajı platformlar arasında özelleştirmenize olanak tanıyan platforma özel anahtarlara sahiptir. Bu, tek bir mesajda farklı istemci platformlarına biraz farklı veriler gönderen "geçersiz kılmalar" oluşturmanıza olanak tanır.

  • Yeni istemci platformu sürümleri için daha genişletilebilir ve geleceğe yönelik HTTP v1 API, Apple platformları, Android ve Web'de bulunan mesajlaşma seçeneklerini tam olarak destekler. JSON yükünde her platformun kendi tanımlı bloğu olduğundan, FCM, API'yi gerektiği gibi yeni sürümlere ve yeni platformlara genişletebilir.

Sunucu uç noktasını güncelleyin

HTTP v1 API'sinin uç nokta URL'si eski uç noktadan şu yönlerden farklılık gösterir:

  • Yolda /v1 ile sürümlendirilmiştir.
  • Yol, uygulamanızın Firebase projesinin proje kimliğini /projects/myproject-ID/ biçiminde içerir. Bu kimlik, Firebase konsolunun Genel proje ayarları sekmesinde bulunur.
  • send yöntemini :send olarak belirtmeyi açıkça belirtir.

HTTP v1 için sunucu uç noktasını güncellemek üzere bu öğeleri gönderme isteklerinizin başlığındaki uç noktaya ekleyin.

Daha önce HTTP istekleri

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

Daha önce XMPP istekleri

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

fcm-xmpp.googleapis.com:5235

Sonrasında

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

Gönderme isteklerinin yetkilendirmesini güncelle

Eski isteklerde kullanılan sunucu anahtar dizesi yerine, HTTP v1 gönderme istekleri bir OAuth 2.0 erişim belirtecini gerektirir. İleti göndermek için Yönetici SDK'sını kullanıyorsanız kitaplık, belirteci sizin için işler. Ham protokolü kullanıyorsanız, belirteci bu bölümde açıklandığı şekilde edinin ve bunu Authorization: Bearer <valid Oauth 2.0 token> olarak başlığa ekleyin.

Önce

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

Sonrasında

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

Sunucu ortamınızın ayrıntılarına bağlı olarak, sunucu isteklerini Firebase hizmetlerine yetkilendirmek için aşağıdaki stratejilerin bir kombinasyonunu kullanın:

  • Google Uygulaması Varsayılan Kimlik Bilgileri (ADC)
  • Bir 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, Google Kubernetes Engine, App Engine veya Cloud Functions (Firebase için Cloud Functions dahil) üzerinde çalışıyorsa Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanın. ADC, istekleri yetkilendirmek amacıyla kimlik bilgileri almak için mevcut varsayılan hizmet hesabınızı kullanır ve ADC, GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni aracılığıyla esnek yerel testlere olanak tanır. Yetkilendirme akışının tam otomasyonu için ADC'yi Admin SDK sunucu kitaplıklarıyla birlikte kullanın.

Uygulamanız Google dışı bir sunucu ortamında çalışıyorsa Firebase projenizden bir hizmet hesabı JSON dosyası indirmeniz gerekir. Özel anahtar dosyasını içeren bir dosya sistemine erişiminiz olduğu sürece, manuel olarak elde edilen bu kimlik bilgileriyle istekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini kullanabilirsiniz. Bu tür bir dosya erişiminiz yoksa kodunuzdaki hizmet hesabı dosyasına başvurmanız gerekir; bu, kimlik bilgilerinizin açığa çıkması riski nedeniyle son derece dikkatli yapılmalıdır.

ADC kullanarak kimlik bilgilerini sağlayın

Google Uygulaması Varsayılan Kimlik Bilgileri (ADC), kimlik bilgilerinizi aşağıdaki sırayla kontrol eder:

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

  2. Ortam değişkeni ayarlanmamışsa ADC, Compute Engine, Google Kubernetes Engine, App Engine ve Cloud Functions'ın bu hizmetlerde çalışan uygulamalar için sağladığı varsayılan hizmet hesabını kullanır.

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

Aşağıdaki Admin SDK kod örneği bu stratejiyi göstermektedir. Örnek, uygulama kimlik bilgilerini açıkça belirtmiyor. Ancak ADC, ortam değişkeni ayarlandığı veya uygulama Compute Engine, Google Kubernetes Engine, App Engine veya Cloud Functions üzerinde çalıştığı sürece kimlik bilgilerini örtülü olarak bulabilir.

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

Gitmek

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, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucu API'lerini çağırmak için kullanabileceğiniz Google hizmet hesaplarını destekler. Yerel olarak kod geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız, sunucu isteklerini yetkilendirmek için bu hizmet hesabı aracılığıyla elde edilen kimlik bilgilerini kullanabilirsiniz.

Bir hizmet hesabının kimliğini doğrulamak ve Firebase hizmetlerine erişmesine izin vermek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir.

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

  1. Firebase konsolunda Ayarlar > Hizmet Hesapları'nı açın.

  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 saklayın.

Bir hizmet hesabı aracılığıyla yetkilendirme yaparken, uygulamanıza kimlik bilgileri sağlamak için iki seçeneğiniz vardır. GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayabilir veya koddaki hizmet hesabı anahtarının yolunu açıkça iletebilirsiniz. İlk seçenek daha güvenlidir ve şiddetle tavsiye edilir.

Ortam değişkenini ayarlamak için:

GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini, hizmet hesabı anahtarınızı içeren JSON dosyasının dosya yoluna ayarlayın. Bu değişken yalnızca mevcut kabuk oturumunuz için geçerlidir; dolayısıyla yeni bir oturum açarsanız değişkeni yeniden ayarlayın.

Linux veya macOS

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

pencereler

PowerShell'le:

$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ı olarak belirleyebilir ve Google dışı ortamlarda test yaparken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanmanıza olanak tanır.

Erişim belirteçlerini oluşturmak için kimlik bilgilerini kullanın

Kısa ömürlü bir OAuth 2.0 erişim jetonu almak için Firebase kimlik bilgilerinizi Google Auth Kitaplığı ile birlikte tercih ettiğiniz dil için kullanın:

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

Bu örnekte, Google API istemci kitaplığı, isteğin kimliğini bir JSON web belirteci veya JWT ile doğrular. Daha fazla bilgi için bkz. JSON web belirteçleri .

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 belirtecinizin süresi dolduktan sonra, güncellenmiş erişim belirtecini almak için belirteç yenileme yöntemi otomatik olarak çağrılır.

FCM'ye erişim yetkisi vermek için https://www.googleapis.com/auth/firebase.messaging kapsamını isteyin.

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

Belirteci Authorization başlığının değeri olarak Authorization: Bearer <access_token> :

node.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 yükünün yapılandırılmasında önemli bir değişiklik getiriyor. Bu değişiklikler öncelikle mesajların farklı istemci platformlarında alındığında doğru şekilde işlenmesini sağlar; ek olarak, değişiklikler size platform başına mesaj alanlarını kişiselleştirme veya "geçersiz kılma" konusunda ekstra esneklik sağlar.

Bu bölümdeki örnekleri incelemenin yanı sıra, HTTP v1'e aşina olmak için Bir mesajı platformlar arasında özelleştirme konusuna bakın ve API referansını inceleyin.

Örnek: basit bildirim mesajı

Burada, yalnızca title , body ve data alanlarını içeren, eski ve HTTP v1 yükleri arasındaki temel farklılıkları gösteren çok basit bir bildirim yükünün karşılaştırması verilmiştir.

Önce

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

Sonrasında

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

Örnek: birden fazla platformu hedefleme

Çoklu platform hedeflemeyi etkinleştirmek için eski API, arka uçta geçersiz kılmalar gerçekleştirdi. Bunun aksine, HTTP v1, platformlar arasındaki farkları geliştirici için açık ve görünür hale getiren, platforma özgü anahtar blokları sağlar. Bu, aşağıdaki örnekte gösterildiği gibi, her zaman tek bir istekle birden çok platformu hedeflemenize olanak tanır.

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

Sonrasında

{
  "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ı platform başına özelleştirme esnekliği de sağlar.

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

Sonrasında

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

Belirli cihazları HTTP v1 API ile hedeflemek için token to yerine cihazın geçerli kayıt jetonunu sağlayın.

Önce

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

Sonrasında

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

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