Gönderme isteklerini yetkilendir

Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM'ye gönderilen istekler yetkilendirilmelidir. Kullanımdan kaldırılan eski HTTP API ile HTTP v1 API yetkilendirmesi arasındaki şu önemli farkları unutmayın:

  • FCM HTTP v1 API, istekleri kısa ömürlü OAuth 2.0 erişim jetonuyla yetkilendirir. Bu jetonu basmak için Google Uygulaması Varsayılan Kimlik Bilgilerini (Google sunucu ortamlarında) kullanabilir ve/veya bir hizmet hesabı için oluşturulmuş bir JSON özel anahtar dosyasından gerekli kimlik bilgilerini manuel olarak alabilirsiniz. Mesaj göndermek için Firebase Admin SDK'yı kullanıyorsanız kitaplık jetonu sizin yerinize işler.
  • Desteği sonlandırılan eski protokoller, yalnızca Firebase konsolundan alınan uzun ömürlü API anahtarlarını kullanabilir.

HTTP v1 gönderme isteklerini yetkilendirme

Sunucu ortamınızın ayrıntılarına bağlı olarak, Firebase hizmetlerine sunucu isteklerini yetkilendirmek için şu stratejileri bir arada kullanın:

  • 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, Google Kubernetes Engine, App Engine veya Cloud Functions'da çalışıyorsa (Firebase için Cloud Functions dahil) Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanın. ADC, istekleri yetkilendirmek üzere kimlik bilgilerini almak için mevcut varsayılan hizmet hesabınızı kullanır. ADC ise GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni üzerinden esnek yerel test yapılmasını sağlar. Yetkilendirme akışının tam otomasyonu 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. Özel anahtar dosyasını içeren bir dosya sistemine erişiminiz olduğu sürece, manuel olarak alınan bu kimlik bilgileriyle istekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini kullanabilirsiniz. Böyle bir dosyaya erişiminiz yoksa kodunuzda hizmet hesabı dosyasına referans vermeniz gerekir. Bu işlem, kimlik bilgilerinizin açığa çıkma riskinden dolayı son derece dikkatli bir şekilde yapılmalıdır.

ADC kullanarak kimlik bilgisi sağlama

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 ayarlanırsa ADC, değişkenin işaret ettiği hizmet hesabı dosyasını kullanır.

  2. Ortam değişkeni ayarlanmadıysa 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 Yönetici SDK'sı kod örneğinde bu strateji gösterilmektedir. Örnekte, uygulama kimlik bilgileri açık bir şekilde belirtilmemektedir. Ancak ADC, ortam değişkeni ayarlandığı veya uygulama Compute Engine, Google Kubernetes Engine, App Engine ya da Cloud Functions'da ç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 sağlayın

Firebase projeleri, Google hizmet hesaplarını destekler. Bu hesapları, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucusu API'lerini çağırmak için kullanabilirsiniz. Kodları yerel olarak geliştiriyor veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerini yetkilendirmek için bu hizmet hesabı aracılığıyla edinilen kimlik bilgilerini kullanabilirsiniz.

Bir hizmet hesabının kimliğini doğrulamak ve bu hesabı 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 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 kimlik bilgilerini uygulamanıza sağlamak için iki seçeneğiniz vardır. GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayabilir veya kodda hizmet hesabı anahtarına giden yolu açıkça geçirebilirsiniz. İ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

Powerpoint ile:

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

Yukarıdaki adımları tamamlamanızın ardından Uygulama Varsayılan Kimlik Bilgileri (ADC), kimlik bilgilerinizi dolaylı olarak belirleyebilir. Bu sayede, Google dışı ortamlarda test yaparken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanabilirsiniz.

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

Yetkilendirmeyi otomatik olarak işleyen Admin SDK'sını kullanmıyorsanız erişim jetonunu basmanı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 dilde Google Auth Kitaplığı ile birlikte kullanın:

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 bir JSON web jetonu veya JWT ile doğrular. Daha fazla bilgi için JSON web jetonları bölümüne 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 jeton yenileme yöntemi, güncellenmiş bir erişim jetonunu almak için otomatik olarak çağrılır.

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

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

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

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;

Eski protokol gönderme isteklerini yetkilendirin

Eski HTTP protokolüyle her istek, Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesindeki sunucu anahtarını içermelidir. XMPP'de bağlantı kurmak için aynı sunucu anahtarını kullanmanız gerekir.

Eski sunucu anahtarlarını taşıma

FCM, Mart 2020'den itibaren eski sunucu anahtarları oluşturmayı durdurdu. Mevcut eski sunucu anahtarları çalışmaya devam eder ancak bunun yerine Firebase konsolunda Sunucu anahtarı etiketli anahtarın yeni sürümünü kullanmanızı öneririz.

Mevcut bir eski sunucu anahtarını Google Cloud Console'da silebilirsiniz.

HTTP isteklerini yetkilendirin

Mesaj isteği iki bölümden oluşur: HTTP üstbilgisi ve HTTP gövdesi. HTTP üstbilgisi aşağıdaki üstbilgileri içermelidir:

  • Authorization: key=SERVER_ANAHTARINIZ
    Bu anahtarın server anahtarı olduğundan emin olun. Bu anahtarın değeri, Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinde yer alır. Android, Apple platformu ve tarayıcı anahtarları FCM tarafından reddedilir.
  • Content-Type: JSON için application/json; düz metin için application/x-www-form-urlencoded;charset=UTF-8.
    Content-Type çıkarılırsa biçimin düz metin olduğu varsayılır.

Örnek:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

Gönderme istekleri oluşturma hakkında tüm ayrıntılar için Derleme İstekleri Oluşturma bölümüne bakın. Eski HTTP Protokol Referansı, mesajınızın içerebileceği tüm parametrelerin listesini sunar.

Sunucu anahtarının geçerliliğini kontrol etme

Mesaj gönderirken kimlik doğrulama hataları alıyorsanız Sunucu anahtarınızın geçerliliğini kontrol edin. Örneğin, Linux'ta aşağıdaki komutu çalıştırın:

api_key=YOUR_SERVER_KEY

curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

Bir 401 HTTP durum kodu alırsanız Sunucu anahtarınız geçerli değildir.

XMPP bağlantısını yetkilendirme

XMPP ile FCM sunucularına kalıcı, eşzamansız, çift yönlü bir bağlantı sağlayabilirsiniz. Bağlantı, sunucunuz ile kullanıcılarınızın FCM'ye bağlı cihazları arasında mesaj gönderip almak için kullanılabilir.

FCM ile uzun ömürlü bir bağlantıyı yönetmek için çoğu XMPP kitaplığını kullanabilirsiniz. XMPP uç noktası fcm-xmpp.googleapis.com:5235 saatinde çalışır. Üretim dışı kullanıcılarla işlevselliği test ederken bunun yerine fcm-xmpp.googleapis.com:5236 adresindeki üretim öncesi sunucuya bağlanmanız gerekir (farklı bağlantı noktasına dikkat edin).

Üretim öncesi düzenli testler (en yeni FCM derlemelerinin çalıştırıldığı daha küçük bir ortam), gerçek kullanıcıları test kodundan ayırmak açısından faydalıdır. Test mesajlarını üretim kullanıcılarına gönderme veya test bağlantıları üzerinden üretim trafiğinden yukarı akış mesajları gönderme risklerini önlemek için fcm-xmpp.googleapis.com:5236 bağlantısına bağlanan test cihazları ve test kodunda farklı bir FCM gönderen kimliği kullanılmalıdır.

Bağlantının iki önemli koşulu vardır:

  • Taşıma Katmanı Güvenliği (TLS) bağlantısı başlatmanız gerekir. FCM'nin şu anda STARTTLS uzantısını desteklemediğini unutmayın.
  • FCM, şifre olarak <your_FCM_Sender_Id>@fcm.googleapis.com (FCM gönderen kimliği) ve Sunucu anahtarını kullanan bir SASL PLAIN kimlik doğrulama mekanizması gerektirir. Bu değerler, Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinde bulunur.

Herhangi bir noktada bağlantı başarısız olursa hemen yeniden bağlanmanız gerekir. Kimlik doğrulama sonrasında, bağlantı kesildikten sonra da bağlantı kesmeye gerek yoktur. FCM, her gönderen kimliği için paralel olarak 2.500 bağlantıya izin verir.

Aşağıdaki snippet'ler, FCM'ye XMPP bağlantısı için kimlik doğrulama ve yetkilendirmenin nasıl gerçekleştirileceğini gösterir.

XMPP sunucusu

XMPP sunucusu, FCM ile bağlantı kurmak istiyor

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

FCM, bağlantıyı açar ve PLAIN yöntemini de içeren bir kimlik doğrulama mekanizması ister.

<stream:features>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>X-OAUTH2</mechanism>
    <mechanism>X-GOOGLE-TOKEN</mechanism>
    <mechanism>PLAIN</mechanism>
  </mechanisms>
</stream:features>

XMPP sunucusu

XMPP sunucusu, Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinden sunucu anahtarını sağlayarak PLAIN kimlik doğrulama yöntemini kullanarak yanıt vermelidir.

<auth mechanism="PLAIN"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb
mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth>

FCM

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

XMPP sunucusu

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

<stream:features>
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>

XMPP sunucusu

<iq type="set">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind>
</iq>

FCM

<iq type="result">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>SENDER_ID@fcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

Not: FCM, iletileri yönlendirirken bağlı kaynağı kullanmaz.

Gönderme istekleri oluşturma hakkında tüm ayrıntılar için Derleme İstekleri Oluşturma bölümüne bakın. Eski XMPP Protokol Referansı, mesajınızın içerebileceği tüm parametrelerin listesini sağlar.