FCM HTTP v1 API'yi kullanarak mesaj gönderme

FCM HTTP v1 API'yi kullanarak mesaj istekleri oluşturabilir ve bunları şu tür hedeflere gönderebilirsiniz:

Önceden tanımlanmış alanlardan oluşan bir bildirim yükü, kullanıcı tarafından tanımlanan alanlarınızın veri yükü veya her iki yük türünü de içeren bir mesaj 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ı
  • Hizmet hesabından türetilmiş kısa ömürlü bir OAuth 2.0 erişim jetonu

Uygulamanız Compute Engine, Google Kubernetes Engine, App Engine veya Cloud Functions'ta çalışıyorsa (Cloud Functions for Firebase dahil) Uygulama Varsayılan Kimlik Bilgileri'ni (ADC) kullanın. ADC, istekleri yetkilendirmek için kimlik bilgilerini 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 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şebildiğiniz sürece, bu manuel olarak edinilmiş kimlik bilgilerini kullanarak istekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini kullanabilirsiniz. Bu tür bir dosya erişiminiz yoksa kodunuzda hizmet hesabı dosyasına referans vermeniz gerekir. Kimlik bilgilerinizin açığa çıkma riski nedeniyle bu işlem son derece dikkatli bir şekilde yapılmalıdır.

ADC kullanarak kimlik bilgilerini 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 belirtilmemiştir. Ancak ADC, ortam değişkeni ayarlandığı veya uygulama Compute Engine, Google Kubernetes Engine, App Engine ya da Cloud Functions üzerinde çalıştığı sürece kimlik bilgilerini dolaylı 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 girme

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. Kodu yerel olarak geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerini yetkilendirmek için bu hizmet hesabı kullanılarak elde edilen kimlik bilgilerini kullanabilirsiniz.

Firebase projenizin tüm hizmet hesaplarını Ayarlar > Hizmet hesapları sekmesinde görebilirsiniz.

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 anahtar dosyası oluşturmak istiyorsanız:

  1. Firebase konsolunda Ayarlar > Hizmet hesapları sekmesine gidin.

  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. 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. Böylece, 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 kullanmıyorsanız istek göndermek için erişim jetonunu oluşturmanız ve eklemeniz gerekir.

Kısa süreli bir OAuth 2.0 erişim jetonu almak için Firebase kimlik bilgilerinizi tercih ettiğiniz dildeki Google Auth Library 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ğin kimliğini bir JSON web jetonu (JWT) ile doğrular. Daha fazla bilgi için JSON web jetonları başlıklı makaleyi inceleyin.

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 başlığına 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 projeden hizmet hesabını yetkilendirme

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

  1. Gönderen projesinde Firebase Cloud Messaging API'nin etkinleştirildiğinden emin olun. Firebase konsolunda etkinleştirilip etkinleştirilmediğini kontrol etmek için Ayarlar > Genel'e gidin. Ardından Cloud Messaging sekmesini tıklayın.

  2. Gönderen projede bir hizmet hesabı oluşturun.

  3. Hedef projede, hizmet hesabının e-posta adresine Firebase Cloud Messaging API Yöneticisi rolünü atayın. Bu işlemi Google Cloud konsolunun IAM & Admin > IAM sayfasında yaparsınız. Bu rol, gönderen projesindeki hizmet hesabının hedef projeye mesaj göndermesine olanak tanır.

  4. Gönderen projedeki hizmet hesabı için OAuth 2.0 erişim jetonu oluşturun. Bunu aşağıdaki seçeneklerden birini kullanarak yapabilirsiniz:

    • Hizmet hesabı anahtarı JSON dosyasını indirme ve kullanma
    • Hizmetiniz Google Cloud üzerinde çalışıyorsa Workload Identity'yi kullanma
  5. Gönderme isteğinizin Authorization başlığında, aldığınız erişim jetonunu kullanın. İstek, hedef proje için HTTP v1 uç noktasına gönderilmelidir:

      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

İşlem başarılı olduğunda HTTP v1 API yanıtı, mesaj kimliğini içeren bir JSON nesnesi olur:

    {
      "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) gönderilen bir HTTP POST isteğinden oluşur:

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

Tam HTTP isteği JSON örneği

HTTP POST isteği içinde bildirim göndermenin nasıl yapılacağını gösteren eksiksiz bir örneği aşağıda bulabilirsiniz:

{
  "message": {
    "token": REGISTRATION_TOKEN,
    "notification": {
      "title": "FCM API test",
      "body": "This is the body of the notification.",
      "image": "https://firebase.google.com/static/images/products/cloud-messaging/cloud-messaging-hero_1x.png"
    }
  }
}

Koşu

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