आपके ऐप्लिकेशन सर्वर या भरोसेमंद एनवायरमेंट से FCM को भेजे गए अनुरोधों के लिए अनुमति ज़रूरी है. अब काम नहीं करने वाले लेगसी एचटीटीपी एपीआई और एचटीटीपी v1 एपीआई की अनुमति के बीच के इन अहम अंतरों पर ध्यान दें:
- FCM एचटीटीपी v1 एपीआई, कुछ समय तक चलने वाले OAuth 2.0 ऐक्सेस टोकन की मदद से अनुरोधों को अनुमति देता है. इस टोकन को माइन करने के लिए, Google सर्वर एनवायरमेंट में Google ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल का इस्तेमाल किया जा सकता है. इसके अलावा, सेवा खाते के लिए जनरेट की गई JSON निजी कुंजी फ़ाइल से, मैन्युअल तरीके से ज़रूरी क्रेडेंशियल भी हासिल किए जा सकते हैं. अगर मैसेज भेजने के लिए Firebase Admin SDK का इस्तेमाल किया जा रहा है, तो लाइब्रेरी आपके लिए टोकन मैनेज करती है.
- अब काम न करने वाले लेगसी प्रोटोकॉल, Firebase कंसोल से मिली लंबी अवधि वाली एपीआई कुंजियों का ही इस्तेमाल कर सकते हैं.
एचटीटीपी v1 से अनुरोध भेजने की अनुमति देना
अपने सर्वर एनवायरमेंट की जानकारी के आधार पर, Firebase की सेवाओं के लिए सर्वर के अनुरोधों को अनुमति देने के लिए, इन रणनीतियों का इस्तेमाल करें:
- Google ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (एडीसी)
- सेवा खाते की JSON फ़ाइल
- सेवा खाते से मिला, कुछ समय के लिए उपलब्ध OAuth 2.0 ऐक्सेस टोकन
अगर आपका ऐप्लिकेशन Compute Engine, Google Kubernetes Engine, App Engine या Cloud Functions पर चल रहा है (Cloud Functions for Firebase के साथ), तो ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (ADC) का इस्तेमाल करें. अनुरोधों को अनुमति देने के लिए क्रेडेंशियल पाने के लिए, एडीसी आपके मौजूदा डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है. साथ ही, एडीसी, एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS की मदद से, लोकल टेस्टिंग की सुविधा देता है. अनुमति फ़्लो को पूरी तरह ऑटोमेट करने के लिए, एडमिन SDK टूल की सर्वर लाइब्रेरी के साथ-साथ ADC का इस्तेमाल करें.
अगर आपका ऐप्लिकेशन, Google के सर्वर एनवायरमेंट के बजाय किसी दूसरे सर्वर एनवायरमेंट पर चल रहा है, तो आपको अपने Firebase प्रोजेक्ट से सेवा खाते की JSON फ़ाइल डाउनलोड करनी होगी. जब तक आपके पास निजी पासकोड वाली फ़ाइल वाले फ़ाइल सिस्टम का ऐक्सेस है, तब तक मैन्युअल तरीके से हासिल किए गए इन क्रेडेंशियल का इस्तेमाल करके अनुरोधों को अनुमति देने के लिए, एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS का इस्तेमाल किया जा सकता है. अगर आपके पास ऐसी फ़ाइल का ऐक्सेस नहीं है, तो आपको अपने कोड में सेवा खाते की फ़ाइल का रेफ़रंस देना चाहिए. ऐसा करते समय बहुत सावधानी बरतें, क्योंकि आपके क्रेडेंशियल सार्वजनिक हो सकते हैं.
एडीसी का इस्तेमाल करके क्रेडेंशियल देना
Google ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (ADC), आपके क्रेडेंशियल की जांच इस क्रम में करते हैं:
एडीसी यह जांच करता है कि एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS सेट है या नहीं. अगर वैरिएबल सेट है, तो एडीसी उस सेवा खाते की फ़ाइल का इस्तेमाल करता है जिस पर वैरिएबल ले जाता है.
अगर एनवायरमेंट वैरिएबल सेट नहीं है, तो ADC उस डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है जो Compute Engine, Google Kubernetes Engine, App Engine, और Cloud Functions, उन सेवाओं पर चलने वाले ऐप्लिकेशन के लिए उपलब्ध कराते हैं.
अगर एडीसी ऊपर दिए गए किसी भी क्रेडेंशियल का इस्तेमाल नहीं कर पाता है, तो सिस्टम में गड़बड़ी का मैसेज दिखता है.
एडमिन SDK कोड के इस उदाहरण में, इस रणनीति के बारे में बताया गया है. उदाहरण में, ऐप्लिकेशन के क्रेडेंशियल के बारे में साफ़ तौर पर नहीं बताया गया है. हालांकि, जब तक एनवायरमेंट वैरिएबल सेट है या ऐप्लिकेशन Compute Engine, Google Kubernetes Engine, App Engine या 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()
शुरू करें
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(),
});
मैन्युअल तरीके से क्रेडेंशियल देना
Firebase प्रोजेक्ट में Google के सेवा खाते काम करते हैं. इनका इस्तेमाल, अपने ऐप्लिकेशन सर्वर या भरोसेमंद एनवायरमेंट से Firebase सर्वर एपीआई को कॉल करने के लिए किया जा सकता है. अगर स्थानीय तौर पर कोड डेवलप किया जा रहा है या अपने ऐप्लिकेशन को ऑन-प्राइमिस डिप्लॉय किया जा रहा है, तो सर्वर के अनुरोधों को अनुमति देने के लिए, इस सेवा खाते से मिले क्रेडेंशियल का इस्तेमाल किया जा सकता है.
किसी सेवा खाते की पुष्टि करने और उसे Firebase की सेवाओं को ऐक्सेस करने की अनुमति देने के लिए, आपको JSON फ़ॉर्मैट में निजी कुंजी फ़ाइल जनरेट करनी होगी.
अपने सेवा खाते के लिए, निजी पासकोड वाली फ़ाइल जनरेट करने के लिए:
Firebase कंसोल में, सेटिंग > सेवा खाते खोलें.
नई निजी कुंजी जनरेट करें पर क्लिक करें. इसके बाद, कुंजी जनरेट करें पर क्लिक करके पुष्टि करें.
कुंजी वाली JSON फ़ाइल को सुरक्षित तरीके से सेव करें.
सेवा खाते से अनुमति देते समय, आपके पास अपने ऐप्लिकेशन को क्रेडेंशियल देने के लिए दो विकल्प होते हैं. आपके पास GOOGLE_APPLICATION_CREDENTIALS एनवायरमेंट वैरिएबल को सेट करने का विकल्प है. इसके अलावा, कोड में सेवा खाता कुंजी के पाथ को साफ़ तौर पर पास किया जा सकता है. पहला विकल्प ज़्यादा सुरक्षित है और इसका सुझाव दिया जाता है.
एनवायरमेंट वैरिएबल सेट करने के लिए:
एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS को उस JSON फ़ाइल के फ़ाइल पाथ पर सेट करें जिसमें आपकी सेवा खाता कुंजी है. यह वैरिएबल सिर्फ़ आपके मौजूदा शेल सेशन पर लागू होता है. इसलिए, नया सेशन खोलने पर, वैरिएबल को फिर से सेट करें.
Linux या macOS
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
शीशा
PowerShell की मदद से:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
ऊपर दिए गए चरणों को पूरा करने के बाद, ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (एडीसी), आपके क्रेडेंशियल का पता लगा सकते हैं. इससे, Google से बाहर के एनवायरमेंट में टेस्ट करने या चलाने के दौरान, सेवा खाते के क्रेडेंशियल का इस्तेमाल किया जा सकता है.
ऐक्सेस टोकन बनाने के लिए क्रेडेंशियल का इस्तेमाल करना
अगर एडमिन SDK टूल का इस्तेमाल नहीं किया जा रहा है, तो आपको ऐक्सेस टोकन जनरेट करना होगा और अनुरोध भेजने के लिए उसे जोड़ना होगा. यह टूल, अनुमति को अपने-आप मैनेज करता है.
अपनी पसंदीदा भाषा के लिए, Google Auth Library के साथ अपने Firebase क्रेडेंशियल का इस्तेमाल करके, कुछ समय के लिए मान्य OAuth 2.0 ऐक्सेस टोकन पाएं:
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);
});
});
}
इस उदाहरण में, Google API क्लाइंट लाइब्रेरी, अनुरोध की पुष्टि JSON वेब टोकन या JWT की मदद से करती है. ज़्यादा जानकारी के लिए, JSON वेब टोकन देखें.
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();
}
ऐक्सेस टोकन की समयसीमा खत्म होने के बाद, अपडेट किया गया ऐक्सेस टोकन पाने के लिए, टोकन रीफ़्रेश करने का तरीका अपने-आप लागू हो जाता है.
FCM का ऐक्सेस पाने के लिए, दायरे का अनुरोध करें
https://www.googleapis.com/auth/firebase.messaging
.
एचटीटीपी अनुरोध हेडर में ऐक्सेस टोकन जोड़ने के लिए:
Authorization
हेडर की वैल्यू के तौर पर 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;
लेगसी प्रोटोकॉल से अनुरोध भेजने की अनुमति देना
एचटीटीपी लेगसी प्रोटोकॉल के साथ, हर अनुरोध में Firebase कंसोल के सेटिंग पैनल के क्लाउड मैसेजिंग टैब से मिली सर्वर कुंजी होनी चाहिए. XMPP के लिए, कनेक्शन स्थापित करने के लिए आपको एक ही सर्वर कुंजी का उपयोग करना होगा.
लेगसी सर्वर कुंजियों को माइग्रेट करना
मार्च 2020 से, FCM ने लेगसी सर्वर पासकोड बनाना बंद कर दिया है. मौजूदा पुरानी सर्वर कुंजियां काम करती रहेंगी. हालांकि, हमारा सुझाव है कि आप Firebase कंसोल में सर्वर कुंजी लेबल वाला नया वर्शन इस्तेमाल करें.
अगर आपको किसी मौजूदा पुराने सर्वर कुंजी को मिटाना है, तो Google Cloud कंसोल में जाएं.
एचटीटीपी अनुरोधों को अनुमति देना
मैसेज के अनुरोध में दो हिस्से होते हैं: एचटीटीपी हेडर और एचटीटीपी कोड. एचटीटीपी हेडर में ये हेडर होने चाहिए:
Authorization
: key=YOUR_SERVER_KEY
पक्का करें कि यह सर्वर कुंजी हो, जिसकी वैल्यू Firebase कंसोल के सेटिंग पैनल के Cloud Messaging टैब में उपलब्ध हो. FCM, Android, Apple प्लैटफ़ॉर्म, और ब्राउज़र की कुंजियों को स्वीकार नहीं करता.Content-Type
: JSON के लिएapplication/json
; सादे टेक्स्ट के लिएapplication/x-www-form-urlencoded;charset=UTF-8
.
अगरContent-Type
को शामिल नहीं किया जाता है, तो फ़ॉर्मैट को सादा टेक्स्ट माना जाता है.
उदाहरण के लिए:
Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "data" : { ... }, }
ईमेल भेजने के अनुरोध बनाने के बारे में पूरी जानकारी के लिए, ईमेल भेजने के अनुरोध बनाएं लेख पढ़ें. लेगसी एचटीटीपी प्रोटोकॉल रेफ़रंस में, उन सभी पैरामीटर की सूची होती है जो आपके मैसेज में शामिल हो सकते हैं.
सर्वर पासकोड की मान्यता की जांच करना
अगर आपको ईमेल भेजते समय पुष्टि करने से जुड़ी गड़बड़ियां मिलती हैं, तो देखें कि आपकी सर्वर कुंजी मान्य है या नहीं. उदाहरण के लिए, Linux पर यह कमांड चलाएं:
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 एचटीटीपी स्टेटस कोड मिलता है, तो इसका मतलब है कि आपकी सर्वर पासकोड अमान्य है.
XMPP कनेक्शन को अनुमति देना
XMPP की मदद से, FCM सर्वर से लगातार, असाइनोक्रोनस, और दोतरफ़ा कनेक्शन बनाए रखा जा सकता है. इस कनेक्शन का इस्तेमाल, आपके सर्वर और आपके उपयोगकर्ताओं के FCM से कनेक्ट किए गए डिवाइसों के बीच मैसेज भेजने और पाने के लिए किया जा सकता है.
FCM से लंबे समय तक जुड़े रहने वाले कनेक्शन को मैनेज करने के लिए, ज़्यादातर XMPP लाइब्रेरी का इस्तेमाल किया जा सकता है. XMPP एंडपॉइंट,
fcm-xmpp.googleapis.com:5235
पर चलता है. नॉन-प्रोडक्शन उपयोगकर्ताओं के साथ फ़ंक्शन की जांच करने के दौरान, आपको fcm-xmpp.googleapis.com:5236
पर प्री-प्रोडक्शन सर्वर से कनेक्ट करना चाहिए (अलग-अलग पोर्ट पर ध्यान दें).
प्री-प्रोडक्शन (ऐसा छोटा एनवायरमेंट जहां FCM के नए वर्शन के बिल्ड चलते हैं) पर नियमित तौर पर टेस्टिंग करने से, असल उपयोगकर्ताओं को टेस्ट कोड से अलग रखने में मदद मिलती है. fcm-xmpp.googleapis.com:5236
से कनेक्ट करने वाले टेस्ट डिवाइसों और टेस्ट कोड को, FCM के किसी दूसरे आईडी का इस्तेमाल करना चाहिए. इससे, प्रोडक्शन ट्रैफ़िक से टेस्ट कनेक्शन पर अपस्ट्रीम मैसेज भेजने या प्रोडक्शन उपयोगकर्ताओं को टेस्ट मैसेज भेजने से जुड़े जोखिम से बचा जा सकता है.
कनेक्शन के लिए दो ज़रूरी शर्तें हैं:
- आपको ट्रांसपोर्ट लेयर सिक्योरिटी (TLS) कनेक्शन शुरू करना होगा. ध्यान दें कि FCM में फ़िलहाल, STARTTLS एक्सटेंशन काम नहीं करता.
- FCM के लिए,
<your_FCM_Sender_Id>@fcm.googleapis.com
(FCM भेजने वाले का आईडी) और पासवर्ड के तौर पर सर्वर पासकोड का इस्तेमाल करके, एसएएसएल प्लेन ऑथेंटिकेशन का तरीका अपनाना ज़रूरी है. ये वैल्यू Firebase कंसोल के सेटिंग पैनल के क्लाउड से मैसेज टैब में उपलब्ध हैं.
अगर किसी भी समय कनेक्टिविटी में रुकावट आती है, तो आपको तुरंत कनेक्ट करना चाहिए. पुष्टि करने के बाद डिसकनेक्ट होने पर, आपको वापस आने की ज़रूरत नहीं है. हर भेजने वाले व्यक्ति के आईडी के लिए, FCM एक साथ 2,500 कनेक्शन की अनुमति देता है.
नीचे दिए गए स्निपेट में, FCM से XMPP कनेक्शन के लिए पुष्टि करने और अनुमति देने का तरीका बताया गया है.
XMPP सर्वर
XMPP सर्वर, FCM से कनेक्शन का अनुरोध करता है
<stream:stream to="fcm.googleapis.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">
FCM
FCM कनेक्शन खोलता है और पुष्टि करने के तरीके का अनुरोध करता है. इसमें PLAIN
तरीका भी शामिल है.
<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 सर्वर
XMPP सर्वर को PLAIN
पुष्टि करने के तरीके का इस्तेमाल करके जवाब देना होगा. इसके लिए, Firebase कंसोल के सेटिंग पैनल के
क्लाउड से मैसेज करने की सेवा टैब से सर्वर कुंजी दें.
<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 सर्वर
<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 सर्वर
<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>
ध्यान दें: FCM, मैसेज को रूट करते समय बाउंड किए गए रिसॉर्स का इस्तेमाल नहीं करता.
ईमेल भेजने के अनुरोध बनाने के बारे में पूरी जानकारी के लिए, ईमेल भेजने के अनुरोध बनाएं लेख पढ़ें. लेगसी XMPP प्रोटोकॉल रेफ़रंस में, उन सभी पैरामीटर की सूची होती है जो आपके मैसेज में शामिल हो सकते हैं.