FCM HTTP v1 API'yi kullanarak mesaj gönderme

FCM HTTP v1 API'yi kullanarak mesaj istekleri oluşturabilir ve bunları aşağıdaki hedef türlerine gönderebilirsiniz:

  • Konu adı
  • Koşul
  • Cihaz kayıt jetonu
  • Cihaz grubu adı (yalnızca protokol)

Önceden tanımlanmış alanlardan oluşan bir bildirim yükü, kendi kullanıcı tanımlı alanlarınızdan oluşan bir veri yükü veya her iki yük türünü de içeren bir ileti gönderebilirsiniz. Daha fazla bilgi için Mesaj türleri başlıklı makaleyi inceleyin.

HTTP v1 gönderme isteklerini yetkilendirme

Sunucu ortamınızın ayrıntılarına bağlı olarak, Firebase hizmetlerine yönelik sunucu isteklerini yetkilendirmek için bu stratejilerin bir kombinasyonunu kullanın:

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

Uygulamanız Compute Engine, Google Kubernetes Engine, App Engine veya Cloud Functions'ta (Cloud Functions for Firebase dahil) çalışıyorsa varsayılan uygulama kimlik bilgilerini (ADC) kullanın. ADC, istekleri yetkilendirmek için kimlik bilgileri almak üzere mevcut varsayılan hizmet hesabınızı kullanır ve GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni aracılığıyla esnek yerel testlere olanak tanır. Yetkilendirme akışının en kapsamlı şekilde otomatikleştirilmesi için ADC'yi Yönetici SDK'sı 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şebildiğiniz sürece, ortam değişkeni GOOGLE_APPLICATION_CREDENTIALS'yı kullanarak bu manuel olarak edinilmiş kimlik bilgileriyle istekleri yetkilendirebilirsiniz. Bu tür dosya erişiminiz yoksa kodunuzda hizmet hesabı dosyasına referans vermeniz gerekir. Bu işlem, kimlik bilgilerinizin açığa çıkma riski nedeniyle son derece dikkatli bir şekilde yapılmalıdır.

ADC kullanarak kimlik bilgileri sağlama

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

  1. ADC, ortam değişkeni GOOGLE_APPLICATION_CREDENTIALS'nin ayarlanıp ayarlanmadığını kontrol eder. Değişken ayarlanmışsa 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 hiçbirini kullanamazsa sistem hata verir.

Aşağıdaki Admin SDK kod örneğinde bu strateji gösterilmektedir. Örnekte uygulama kimlik bilgileri açıkça belirtilmiyor. Ancak, ortam değişkeni ayarlandığı veya uygulama Compute Engine, Google Kubernetes Engine, App Engine ya da Cloud Functions üzerinde çalıştığı sürece ADC, 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()

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ğlama

Firebase projeleri, uygulamanızın sunucusundan veya güvenilir ortamdan Firebase sunucu API'lerini çağırmak için kullanabileceğiniz Google hizmet hesaplarını destekler. Kodu yerel olarak geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerini yetkilendirmek için bu hizmet hesabı üzerinden alınan kimlik bilgilerini kullanabilirsiniz.

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

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

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

  2. Yeni Özel Anahtar Oluştur'u tıklayın, 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ı üzerinden yetkilendirirken uygulamanıza kimlik bilgilerini sağlamak için iki seçeneğiniz vardır. GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayabilir veya hizmet hesabı anahtarının yolunu kodda açıkça iletebilirsiniz. İlk seçenek daha güvenlidir ve kesinlikle önerilir.

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. Bu nedenle, yeni bir oturum açarsanız değişkeni tekrar ayarlayın.

Linux veya macOS

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

Windows

PowerShell 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 örtülü olarak belirleyebilir. Bu sayede, Google dışı ortamlarda test yaparken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanabilirsiniz.

Erişim jetonları oluşturmak için kimlik bilgilerini kullanma

Yetkilendirmeyi otomatik olarak işleyen Firebase Admin SDK öğesini kullanmıyorsanız erişim jetonunu oluşturmanız ve istek göndermek için eklemeniz gerekir.

Kısa ömürlü bir OAuth 2.0 erişim jetonu almak için Firebase kimlik bilgilerinizi tercih ettiğiniz dildeki Google Auth Kitaplığı ile birlikte 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ği bir JSON web jetonu (JWT) ile doğrular. Daha fazla bilgi için JSON web jetonları konusuna bakın.

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, güncellenmiş bir erişim jetonu almak için jeton yenileme yöntemi otomatik olarak çağrılır.

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

Erişim jetonunu bir HTTP istek üstbilgisine eklemek için:

Jetonu, Authorization üstbilgisinin değeri olarak Authorization: Bearer <access_token> biçiminde ekleyin:

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;

Farklı bir projedeki hizmet hesabıyla yetkilendirme

Farklı bir projedeki ("gönderen projesi") bir hizmet hesabından oluşturulan OAuth 2.0 jetonunu kullanırken bir proje ("hedef proje") için mesaj gönderebilirsiniz. Bu sayede, hizmet hesabı yönetimini tek bir projede merkezileştirebilir ve diğerleri adına mesaj gönderebilirsiniz. Bunu nasıl yapacağınızı öğrenmek için aşağıdaki adımları uygulayın:

  1. API'yi etkinleştirin: Gönderen projesinde Firebase Cloud Messaging API'nin etkinleştirildiğinden emin olun.
  2. Hizmet hesabı oluşturma: Gönderen projesinde hizmet hesabı oluşturun.
  3. İzin verme: Hedef projede, hizmet hesabının e-posta adresine IAM sayfasında Firebase Cloud Messaging API Yöneticisi rolünü verin. Bu işlem, diğer projedeki hizmet hesabının hedef projeye ileti göndermesine olanak tanır.
  4. Jeton Alma: Gönderen projesindeki hizmet hesabı için bir OAuth 2.0 erişim jetonu oluşturun. Bu işlemi aşağıdaki yöntemlerden biriyle yapabilirsiniz:
    • Hizmet hesabı anahtarı JSON dosyasını indirme ve kullanma
    • Alternatif olarak, hizmetiniz Google Cloud'da çalışıyorsa Workload Identity'yi kullanabilirsiniz.
  5. İstek Gönderme: Elde edilen erişim jetonunu gönderme isteğinizin Authorization başlığında kullanın. İstek, hedef proje için HTTP v1 uç noktasına yapılmalıdır:
        POST https://fcm.googleapis.com/v1/TARGET_PROJECT_ID/messages:send

Belirli cihazlara mesaj gönderme

Tek bir cihaza göndermek için cihazın kayıt jetonunu gösterildiği gibi iletin.

REST

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

cURL komutu:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
   "notification":{
     "title":"FCM Message",
     "body":"This is an FCM Message"
   },
   "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

Başarılı olduğunda HTTP v1 API yanıtı, ileti kimliğini içeren bir JSON nesnesidir:

    {
      "name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96"
    }

FCM HTTP v1 API'yi kullanarak test bildirimi mesajı gönderme

Bu bölümde, FCM HTTP v1 API'yi kullanarak nasıl test bildirimi mesajı göndereceğiniz açıklanmaktadır.

HTTP isteği URL'si

İstek, aşağıdaki URL'de belirtilen hedefe (kayıt jetonu, konu veya koşul) yönelik bir HTTP POST'tan oluşur:

POST https://fcm.googleapis.com/v1/projectId/messages:send

Tam HTTP isteği JSON örneği

Aşağıda, bir HTTP POST isteği içinde bildirimin nasıl yayınlanacağını gösteren eksiksiz bir örnek verilmiştir:

{
  "message": {
    "token": REGISTRATION_TOKEN,
    "notification": {
      "title": "FCM API test",
      "body": "This is the body of the notification.",
      "image": "https://cat.10515.net/1.jpg"
    }
  }
}

Çalıştır

Örneği API Gezgini'nde denemek için Çalıştır'ı tıklayın.