Gönderme isteklerini yetkilendirme

Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM adresine gönderilen istekler yetkilendirilmelidir. Desteği sonlandırılan eski HTTP API ile HTTP v1 API yetkilendirmesi arasındaki önemli farklara dikkat edin:

  • FCM HTTP v1 API, istekleri kısa süreli bir OAuth 2.0 erişim jetonuyla yetkilendirir. Bu jetonu basmak için Google Uygulaması'nı kullanabilirsiniz Varsayılan Kimlik Bilgileri (Google sunucu ortamlarında) ve/veya manuel olarak alın gerekli kimlik bilgileri bir hizmet hesabı için oluşturulan JSON özel anahtar dosyasından. Mesaj göndermek için Firebase Admin SDK kullanıyorsunuzdur. Bu durumda kitaplık, jetonu sizin için yönetir.
  • Desteği sonlandırılan eski protokoller, yalnızca edinilen uzun ömürlü API anahtarlarını kullanabilir Firebase konsolundan kontrol edebilirsiniz.

HTTP v1 gönderme isteklerini yetkilendirme

Sunucu ortamınızın ayrıntılarına bağlı olarak, Firebase hizmetlerine yönelik sunucu isteklerine yetki vermek için aşağıdaki stratejilerin bir kombinasyonunu kullanın:

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

Uygulamanız Compute Engine işletim sisteminde çalışıyorsa Google Kubernetes Engine, App Engine veya Cloud Functions (Cloud Functions for Firebase dahil) Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanın. ADC, mevcut varsayılan hizmetinizi kullanır yetkilendirmek için kimlik bilgilerini alması gerektiğini varsayalım. ADC, ortam değişkeni aracılığıyla esnek yerel test GOOGLE_APPLICATION_CREDENTIALS Yetkilendirme akışının en üst düzeyde otomasyonu 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. Örneğin, özel anahtar dosyası oluşturmak için İstekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS bu bilgileri manuel olarak alabilirsiniz. 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'yi kullanarak kimlik bilgileri sağlama

Google Uygulaması Varsayılan Kimlik Bilgileri (ADC), kimlik bilgilerinizi kontrol eder şu sırada:

  1. ADC, ortam değişkeninin GOOGLE_APPLICATION_CREDENTIALS ayarlandı. 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 herhangi birini kullanamazsa sistem bir hata verir.

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

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, Google hizmet hesaplarını destekler. Bu hesapları, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucu API'lerini çağırmak için kullanabilirsiniz. Yerel olarak kod geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerine yetki vermek için bu hizmet hesabı aracılığıyla edinilen 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 Gizli 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ı aracılığıyla yetkilendirme yaparken, uygulamanıza kimlik bilgisi ekleyin. İsterseniz GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni kullanabilirsiniz. hizmet hesabı anahtarının yolunu kodda açıkça iletin. İlk seçenek daha güvenlidir ve kesinlikle önerilir.

Ortam değişkenini ayarlamak için:

GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini ayarlayın hizmet hesabı anahtarınızı içeren JSON dosyasının dosya yoluna. 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ı tamamladıktan sonra Uygulama Varsayılan Kimlik Bilgileri (ADC), kimlik bilgilerinizi dolaylı olarak belirleyebilir. Böylece, Google dışı ortamlarda test ederken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanabilirsiniz.

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

Yetkilendirmeyi otomatik olarak yöneten Yönetici SDK'sını kullanmıyorsanız erişim jetonunu oluşturmanız ve istek göndermek için eklemeniz gerekir.

Firebase kimlik bilgilerinizi Google Kimlik Doğrulama Kitaplığı kısa ömürlü bir OAuth 2.0 erişim jetonu almak için tercih ettiğiniz dilde iletişim kurun:

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 JSON web jetonu veya 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 jeton yenileme yöntemi çağrılır. otomatik olarak alır.

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

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

Jetonu, Authorization başlığının 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;

Eski protokol gönderme isteklerini yetkilendirme

Eski HTTP protokolünde her istek, Firebase konsolunun Ayarlar bölmesinde bulunan Cloud Messaging sekmesindeki sunucu anahtarını içermelidir. XMPP için bağlantı kurmak üzere 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 edecek ancak bunun yerine Firebase konsolunda Sunucu anahtarı olarak etiketlenen anahtarın daha yeni sürümünü kullanmanızı öneririz.

Mevcut bir eski sunucu anahtarını silmek istiyorsanız Google Cloud konsolu.

HTTP isteklerini yetkilendirme

Mesaj isteği iki bölümden oluşur: HTTP üstbilgisi ve HTTP gövdesi. HTTP üstbilgisinde aşağıdaki üstbilgiler bulunmalıdır:

  • Authorization: anahtar=SERVER_ANAHTARINIZ
    Bu anahtarın, değeri: server anahtarı ve içinde kullanılabilir Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesi. Android, Apple platformu ve tarayıcı anahtarları FCM tarafından reddediliyor.
  • 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çim düz metin olduğu varsayılır.

Örneğin:

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

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

Bkz. Gönderme istekleri oluşturma hakkında tüm ayrıntılar için Gönderme İstekleri oluşturun. Eski HTTP Protokolü Referansı, iletinizin içerebileceği tüm parametrelerin listesini sağlar.

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

İleti gönderirken kimlik doğrulama hataları alırsanı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ü bağlantı. Bağlantı, sunucunuz ile kullanıcılarınızın FCM bağlı cihazları arasında mesaj göndermek ve almak için kullanılabilir.

FCM ile uzun süreli bir bağlantıyı yönetmek için çoğu XMPP kitaplığını kullanabilirsiniz. XMPP uç noktası şurada çalışır: fcm-xmpp.googleapis.com:5235 Test sırasında üretim dışı kullanıcılarıyla ilgili işlevlere sahipseniz bunun yerine, fcm-xmpp.googleapis.com:5236 (farklı bağlantı noktasına dikkat edin).

Gerçek kullanıcıları test kodundan ayırmak için ön prodüksiyonda (en son FCM derlemelerinin çalıştırıldığı daha küçük bir ortam) düzenli test yapmak faydalıdır. Test cihazları ve şu ağa bağlanılan test kodu: fcm-xmpp.googleapis.com:5236, riskleri önlemek için farklı bir FCM gönderen kimliği kullanmalıdır. test mesajlarının üretim kullanıcılarına veya üretim trafiğinden üretim trafiğinden yukarı akış mesajlarının gönderilmesine test bağlantılarına yönelik değildir.

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

Herhangi bir noktada bağlantı başarısız olursa hemen yeniden bağlanmanız gerekir. Kimlik doğrulamadan sonra gerçekleşen bir bağlantı kesilmesinden sonra geri çekilmeniz gerekmez. FCM, her gönderen kimliği için paralel olarak 2.500 bağlantıya izin verir.

Aşağıdaki snippet'lerde, FCM ile XMPP bağlantısı için kimlik doğrulama ve yetkilendirmenin nasıl yapılacağı gösterilmektedir.

XMPP sunucusu

XMPP sunucusu FCM ile 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öntemi de dahil olmak üzere 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 konsolu Ayarlar bölmesinin Cloud Messaging sekmesindeki 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, mesajları yönlendirirken bağlı kaynağı kullanmaz.

Gönderme isteği oluşturma hakkında ayrıntılı bilgi için Gönderme İsteği Oluşturma başlıklı makaleyi inceleyin. Eski XMPP Protokol Referansı iletinizin içerebileceği tüm parametrelerin listesini sunar.