Gönderme isteklerini yetkilendir

Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM'ye gönderilen istekler yetkilendirilmelidir. Eski HTTP ve 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 belirteci basmak için Google Uygulama Varsayılan Kimlik Bilgilerini (Google sunucu ortamlarında) kullanabilir ve/veya bir hizmet hesabı için oluşturulan bir JSON özel anahtar dosyasından gerekli kimlik bilgilerini manuel olarak alabilirsiniz. İleti göndermek için Firebase Admin SDK'sını kullanıyorsanız, belirteci sizin için kitaplık işler.
  • Eski protokoller yalnızca Firebase konsolundan alınan uzun ömürlü API anahtarlarını kullanabilir.

HTTP v1 gönderme isteklerini yetkilendir

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)
  • Bir hizmet hesabı JSON dosyası
  • Bir hizmet hesabından türetilen kısa ömürlü bir OAuth 2.0 erişim belirteci

Başvurunuz Compute Engine, Google Kubernetes Engine, App Engine veya Cloud (Firebase için Bulut Fonksiyonlar dahil) Fonksiyonlar, kullanım Uygulama Varsayılan kimlik bilgileri (ADC) üzerinde çalışıyorsa. ADC isteklerini yetkilendirmek için kimlik bilgilerini elde etmek mevcut varsayılan hizmet hesabını kullanır ve ADC ortam değişkeni aracılığıyla esnek yerel testini sağlayan GOOGLE_APPLICATION_CREDENTIALS . Yetkilendirme akışının tam otomasyonu için ADC'yi Yönetici SDK sunucu kitaplıkları ile birlikte kullanın.

Başvurunuz Google'a ait olmayan bir sunucu ortamı üzerinde çalışıyorsa, size Firebase projesinden bir hizmet hesabı JSON dosyasını indirmeniz gerekir. Sürece özel anahtar dosyasını içeren bir dosya sistemine erişim sahip olarak, ortam değişkeni kullanabilirsiniz GOOGLE_APPLICATION_CREDENTIALS bu elle elde kimlik bilgileriyle isteklerini yetkilendirmek. Bu tür bir dosya erişiminiz yoksa, kodunuzdaki hizmet hesabı dosyasına başvurmanız gerekir; bu, kimlik bilgilerinizin açığa çıkma riski nedeniyle çok dikkatli bir şekilde yapılmalıdır.

ADC kullanarak kimlik bilgilerini sağlayın

Google Application Default Credentials (ADC), kimlik bilgilerinizi aşağıdaki sırayla kontrol eder:

  1. Ortam değişkeni olsun ADC denetler GOOGLE_APPLICATION_CREDENTIALS ayarlanır. Değişken ayarlanmışsa, ADC, değişkenin işaret ettiği hizmet hesabı dosyasını kullanır.

  2. Ortam değişkeni ayarlanmazsa 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 bilgilerinin hiçbirini kullanamazsa, sistem bir hata verir.

Aşağıdaki Yönetici SDK kodu ö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 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);

piton

default_app = firebase_admin.initialize_app()

Git

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 projeler hakkında destekleyen hizmet hesaplarını uygulamanızın sunucu veya güvenilen ortamdan Firebase sunucu API'leri çağırmaya kullanabilirsiniz. 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 ona Firebase hizmetlerine erişim yetkisi vermek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir.

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

  1. Firebase konsolunda, açık Ayarlar> olarak hizmet hesapları .

  2. Yeni Özel Anahtar üret tıklayın ve ardından tıklayarak onaylayın Anahtarı oluşturun.

  3. Anahtarı içeren JSON dosyasını güvenli bir şekilde saklayın.

Bir hizmet hesabı aracılığıyla yetki verirken, uygulamanıza kimlik bilgilerini sağlamak için iki seçeneğiniz vardır. Ya ayarlayabilirsiniz GOOGLE_APPLICATION_CREDENTIALS ortam değişkeni veya açıkça kodunda Hizmet hesabı anahtarına yolunu iletebilirsiniz. İlk seçenek daha güvenlidir ve şiddetle tavsiye edilir.

Ortam değişkenini ayarlamak için:

Ortam değişkeni Set GOOGLE_APPLICATION_CREDENTIALS servis hesabı anahtarı 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 yeniden ayarlayın.

Linux veya macOS

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

pencereler

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 dolaylı olarak belirleyebilir ve Google dışı ortamlarda test ederken veya çalıştırırken hizmet hesabı kimlik bilgilerini kullanmanıza olanak tanır.

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

Kullandığınız sürece Yönetici SDK'yı kolu yetki otomatik olarak size darphaneye belirteç erişim ihtiyacı ve istekleri göndermek ekleriz.

İle birlikte Firebase kimlik bilgilerini kullan Google Kimlik Doğrulama Kütüphanesi belirteç kısa ömürlü OAuth 2.0 erişimini almak için tercih ettiğiniz dil için:

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ği bir JSON web belirteci veya JWT ile doğrular. Daha fazla bilgi için, bkz JSON web belirteçleri .

piton

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

Erişim belirtecinizin süresi dolduktan sonra, güncelleştirilmiş bir erişim belirtecini almak için belirteç yenileme yöntemi otomatik olarak çağrılır.

FCM yetkisi erişmek için, kapsamını talep https://www.googleapis.com/auth/firebase.messaging .

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

Değeri olarak belirteç ekle Authorization formatında başlığındaki Authorization: Bearer <access_token> :

düğüm.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

piton

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 " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Eski protokol gönderme isteklerini yetkilendir

HTTP eski protokol ile, her isteği sunucu anahtar içermelidir Bulut Mesajlaşma Firebase konsol Ayarları bölmesinin sekme. XMPP için, bağlantı kurmak için aynı sunucu anahtarını kullanmanız gerekir.

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

Mart 2020'den itibaren FCM, eski sunucu anahtarları oluşturmayı durdurdu. Mevcut Eski sunucu tuşları çalışmalarına devam edecek, ancak bunun yerine anahtar etiketli Sunucu anahtarın yeni bir sürümünü kullanmanız önerilir Firebase konsoluna .

Varolan eski sunucunun anahtarını silmek istiyorsanız, bunu yapabilirsiniz Google Bulut Konsolundan .

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
    Yap emin bu değeri mevcuttur sunucu anahtarı olan Bulut Mesajlaşma Firebase konsol Ayarları bölmesinin sekme. Android, iOS ve tarayıcı anahtarları FCM tarafından reddedilir.
  • Content-Type : application/json JSON için; application/x-www-form-urlencoded;charset=UTF-8 düz metin için.
    Eğer Content-Type atlanırsa, biçim düz metin olarak kabul edilir.

Örneğin:

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

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

Bkz Yapı Gönder İstekleri göndermesini ister oluşturma konusunda tam ayrıntı için. Eski HTTP Protokolü Referans mesajınız içerebilir tüm parametrelerin bir listesini sağlar.

Bir sunucu anahtarının geçerliliğini kontrol etme

Mesaj 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.

Bir 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 ve kullanıcılarınızın FCM'ye 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 de ishal son nokta fcm-xmpp.googleapis.com:5235 . Üretime yönelik olmayan kullanıcılar ile işlevsellik test ederken, bunun yerine de üretim öncesi sunucusuna bağlanmak gerekir fcm-xmpp.googleapis.com:5236 (farklı port dikkat edin).

Ön üretimde düzenli testler (en son FCM derlemelerinin çalıştığı daha küçük bir ortam), gerçek kullanıcıları test kodundan izole etmek için faydalıdır. Deney cihazları ve bağlanma testi kodu fcm-xmpp.googleapis.com:5236 üretim kullanıcılara testi mesaj göndermek veya test bağlantıları üzerinden üretim trafiğinden memba mesaj gönderme herhangi riskleri önlemek için farklı bir FCM gönderen kimliğini kullanmalıdır.

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

  • Bir Aktarım Katmanı Güvenliği (TLS) bağlantısı başlatmanız gerekir. FCM şu anda desteklemediği Not STARTTLS uzantısı .
  • FCM kullanarak SASL DÜZ kimlik doğrulama mekanizması gerektirir <your_FCM_Sender_Id>@fcm.googleapis.com (FCM kopya numarası ) ve şifre olarak sunucu anahtarı. Bu değerler mevcuttur Bulut Mesajlaşma Firebase konsol Ayarları bölmesinin sekme.

Herhangi bir noktada bağlantı başarısız olursa, hemen yeniden bağlanmalısınız. Kimlik doğrulamadan sonra gerçekleşen bir bağlantı kesilmesinden sonra geri çekilmeye gerek yoktur. Her biri için kopya numarası , FCM paralel 2500 bağlantı sağlar.

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

XMPP sunucusu

XMPP sunucusu, FCM'ye bağlantı ister

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

FCM

FCM bağlantısı açar ve içeren bir kimlik denetimi mekanizmasını, istekleri PLAIN yöntemle.

<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 kullanarak yanıt vermelidir PLAIN sunucu anahtarını sağlayarak, yetkilendirme yöntemi Bulut Mesajlaşma Firebase konsol Ayarları bölmesinin sekme.

<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.

Bkz Yapı Gönder İstekleri göndermesini ister oluşturma konusunda tam ayrıntı için. Eski XMPP Protokol Referansı mesajınız içerebilir tüm parametrelerin bir listesini sağlar.