Gönderme isteklerini yetkilendir

Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM'ye gönderilen isteklerin yetkilendirilmesi gerekir. Kullanımdan kaldırılan eski HTTP API ile HTTP v1 API yetkilendirmesi arasındaki şu önemli farklara dikkat edin:

  • FCM HTTP v1 API, istekleri kısa ömürlü bir OAuth 2.0 erişim belirteciyle yetkilendirir. Bu jetonu oluşturmak için Google Uygulaması Varsayılan Kimlik Bilgilerini (Google sunucu ortamlarında) kullanabilir ve/veya gerekli kimlik bilgilerini bir hizmet hesabı için oluşturulan JSON özel anahtar dosyasından manuel olarak alabilirsiniz. Mesaj göndermek için Firebase Yönetici SDK'sını kullanıyorsanız kitaplık, belirteci sizin için yönetir.
  • Kullanımdan kaldırılan eski protokoller yalnızca Firebase konsolundan alınan uzun ömürlü API anahtarlarını kullanabilir.

HTTP v1 gönderme isteklerini yetkilendirin

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

Yetkilendirmeyi otomatik olarak gerçekleştiren Yönetici SDK'sını kullanmıyorsanız erişim belirtecini oluşturmanız ve istek göndermeye eklemeniz gerekir.

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;

Eski protokol gönderme isteklerini yetkilendirin

Eski HTTP protokolüyle her isteğin, Firebase konsolunun Ayarlar bölmesinin Bulut Mesajlaşma sekmesindeki sunucu anahtarını içermesi gerekir. XMPP'de bağlantı kurmak için aynı sunucu anahtarını kullanmanız gerekir.

Eski sunucu anahtarlarını taşıyın

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

Mevcut bir eski sunucu anahtarını silmek istiyorsanız bunu Google Cloud konsolunda yapabilirsiniz.

HTTP isteklerini yetkilendir

Bir mesaj isteği iki bölümden oluşur: HTTP başlığı ve HTTP gövdesi. HTTP başlığı aşağıdaki başlıkları içermelidir:

  • Authorization : anahtar=YOUR_SERVER_KEY
    Bunun, değeri Firebase konsolunun Ayarlar bölmesinin Bulut Mesajlaşma sekmesinde bulunan sunucu anahtarı olduğundan emin olun. 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 atlanırsa biçimin düz metin olduğu varsayılır.

Örneğin:

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

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

Gönderme istekleri oluşturmayla ilgili tüm ayrıntılar için Gönderme İstekleri Oluşturma konusuna bakın. Eski HTTP Protokol Referansı, mesajınızın içerebileceği tüm parametrelerin bir listesini sağlar.

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\"]}"

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

XMPP bağlantısını yetkilendirin

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 adresinde çalışır. Üretim dışı kullanıcılarla işlevselliği test ederken bunun yerine fcm-xmpp.googleapis.com:5236 adresindeki üretim öncesi sunucuya bağlanmalısınız (farklı bağlantı noktasına dikkat edin).

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

Bağlantının iki önemli gereksinimi vardır:

  • Bir Aktarım Katmanı Güvenliği (TLS) bağlantısı başlatmalısınız. 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ölmesinin Bulut Mesajlaşma sekmesinde mevcuttur.

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

Aşağıdaki kod parçacıkları, FCM'ye XMPP bağlantısı için kimlik doğrulama ve yetkilendirmenin nasıl gerçekleştirileceğini göstermektedir.

XMPP sunucusu

XMPP sunucusu FCM'ye bağlantı 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 sunucusunun, Firebase konsolunun Ayarlar bölmesinin Bulut Mesajlaşma sekmesinden sunucu anahtarını sağlayarak PLAIN kimlik doğrulama yöntemini kullanarak yanıt vermesi gerekir.

<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, mesajları yönlendirirken bağlı kaynağı kullanmaz.

Gönderme istekleri oluşturmaya ilişkin tüm ayrıntılar için Gönderme İstekleri Oluşturma konusuna bakın. Eski XMPP Protokol Referansı, mesajınızın içerebileceği tüm parametrelerin bir listesini sağlar.