Gönderme isteklerini yetkilendirme

Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM'ye gönderilen istekler yetkilendirilmelidir. Kullanımdan kaldırılanlar arasındaki bu önemli farkları, eski HTTP API ve HTTP v1 API yetkilendirmesi:

  • FCM HTTP v1 API, kısa ömürlü bir OAuth 2.0 erişim jetonudur. 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. Firebase Admin SDK'yı kullanıyorsanız kitaplığınız, jetonu sizin yerinize işler.
  • Desteği sonlandırılan eski protokoller, yalnızca edinilen uzun ömürlü API anahtarlarını kullanabilir Firebase konsolundan yönetebilirsiniz.
ziyaret edin.

HTTP v1 gönderme isteklerini yetkilendirme

İş görüşmelerinizin ayrıntılarına kullanıyorsanız, sunucuyu yetkilendirmek için bu stratejilerin bir kombinasyonunu Firebase hizmetlerine gönderilen istekler:

  • 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 üzerinde çalışıyorsa Google Kubernetes Engine, App Engine veya Cloud Functions Cloud Functions for Firebase dahil olmak üzere, 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 Eksiksiz otomasyondan yararlanmak için Yetkilendirme akışı 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. Örneğin, özel anahtar dosyası oluşturmak için İstekleri yetkilendirmek için GOOGLE_APPLICATION_CREDENTIALS bu bilgileri manuel olarak alabilirsiniz. kodunuzda hizmet hesabı dosyasına referans vermeniz gerekir. kimlik bilgilerinizi ifşa etme riski taşıdığından son derece dikkatli bir şekilde yapılmalıdır.

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

  2. Ortam değişkeni belirlenmediyse ADC, varsayılan hizmet hesabını kullanır Google Kubernetes Engine, App Engine, ve Cloud Functions, bu hizmetlerde çalışan uygulamalar sunar.

  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. Örnek uygulama kimlik bilgilerini açık bir şekilde belirtmez. Ancak ADC, ortam değişkeni ayarlandığı sürece kimlik bilgilerini dolaylı olarak bulabilir veya uygulama Compute Engine'de ç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ğlayın

Firebase projeleri Google'ı destekler hizmet hesapları kullanıyorsanız Firebase'i çağırmak için kullanabileceğiniz uygulama sunucunuzdaki veya güvenilir ortamınızdaki sunucu API'leri Proje yöneticisi olarak yerel olarak kodlayın veya uygulamanızı şirket içine dağıtın edinilen kimlik bilgilerini kullanabilir bu hizmet hesabını kullanarak sunucu isteklerini yetkilendirebilir.

Bir hizmet hesabının kimliğini doğrulama ve hesabı yetkilendirme Firebase hizmetlerine erişmek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir biçimindedir.

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

  1. Firebase konsolunda şu dosyayı açın: Ayarlar > Hizmet Hesapları.

  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, 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çmak istiyorsanı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ı yoldan belirleyerek hesap kimlik bilgilerini ele alacağız.

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

Araç Çubuğu’nu kullanmıyorsanız Yönetici SDK'si Bu örnekte, yetkilendirmeyi otomatik olarak yapan bir şirket için erişim jetonunu, istek göndermek için ekleyin.

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 dile dokunun:

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. Daha fazla bilgi için bkz. JSON web jetonları.

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'ye erişimi 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 şu biçimde ekleyin: Authorization: Bearer <access_token>:

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 şuradan sunucu anahtarını içermelidir: Firebase konsolunun Ayarlar sayfasındaki Cloud Messaging sekmesi bölmesini de kullanabilirsiniz. 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 komut dosyasında Sunucu anahtarı etiketli anahtarın yeni sürümünü Firebase konsolu.

Mevcut bir eski sunucu anahtarını silmek istiyorsanız Google Cloud konsolunuza giriş yapın.

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: anahtar=SERVER_ANAHTARINIZ
    Bu anahtarın, değeri: server anahtarı ve içinde kullanılabilir Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinden. 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ç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 sunar.

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

Mesaj gönderirken kimlik doğrulama hataları alıyorsanız doğrulama işlemini bir posta kodu içerir. Ö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ı. İlgili içeriği oluşturmak için kullanılan bağlantı, sunucunuz ile arasında mesaj alışverişi yapmak için kullanılabilir kullanıcılarınızın FCM'ye bağlı cihazlar.

En fazla FCM ile uzun süreli bağlantıyı yönetmek için XMPP kitaplıkları. 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).

Üretim öncesi düzenli testler (en son FCM derlemelerinin çalıştırıldığı daha küçük bir ortam) gerçek kullanıcıların test kodundan izole edilmesi açısından yararlı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 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. Bağlantı kesildikten sonra yeniden bağlantı kesmenize gerek yoktur: kimlik doğrulama. Her bir gönderen kimliği için FCM, paralel olarak 2.500 bağlantıya izin verir.

Aşağıdaki snippet'ler kimlik doğrulamasının nasıl gerçekleştirileceğini FCM'ye XMPP bağlantısı için yetkilendirme.

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 çağırın.

<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 PLAIN yetkilendirme yöntemini kullanarak yanıt vermeli ve Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinden.

<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. Gönderme istekleri oluşturma hakkında tüm ayrıntılar için Gönderme İstekleri oluşturun. Eski XMPP Protokol Referansı iletinizin içerebileceği tüm parametrelerin listesini sunar.