Uygulama sunucunuzdan veya güvenilir ortamınızdan FCM ürününe 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, aşağıdakileri içeren istekleri yetkilendirir: 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 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 kontrol edebilirsiniz.
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 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 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:
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.
Ortam değişkeni belirlenmediyse ADC, varsayılan hizmet hesabını kullanır bu Compute Engine, Google Kubernetes Engine, App Engine, ve Cloud Functions, bu hizmetlerde çalışan uygulamalar sunar.
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 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ğ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:
Firebase konsolunda şu uygulamayı açın: Ayarlar > Hizmet Hesapları.
Yeni Özel Anahtar Oluştur'u tıklayın ve ardından Anahtar Oluştur'u tıklayarak onaylayın.
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 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 ş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 bölümünde 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 konsolu.
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 sekmesi. Android, Apple platformu ve tarayıcı anahtarları FCM tarafından reddedildi.Content-Type
: JSON içinapplication/json
; Düz metin içinapplication/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 bağlı cihaz.
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:
- Taşıma Katmanı Güvenliği (TLS) bağlantısı başlatmanız gerekir. Lütfen FCM şu anda STARTTLS uzantısını desteklemiyor.
- FCM,
<your_FCM_Sender_Id>@fcm.googleapis.com
(FCM gönderen kimliği) ve sunucu anahtarını kullanın. Bu değerler, Firebase konsolunun Ayarlar bölmesindeki Cloud Messaging sekmesinden.
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 ana makinesine XMPP bağlantısı için yetkilendirme.
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 şu bilgiler de dahil olmak üzere bir kimlik doğrulama mekanizması ister:
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.