अगर आपका Firebase क्लाइंट ऐप्लिकेशन, किसी कस्टम बैकएंड सर्वर के साथ डेटा का लेन-देन करता है, तो हो सकता है कि आपको उस सर्वर पर ऐसे उपयोगकर्ता की पहचान करनी पड़े जिसने उस समय साइन इन किया हुआ हो. ऐसा सुरक्षित तरीके से करने के लिए, साइन-इन हो जाने के बाद, एचटीटीपीएस का इस्तेमाल करके, उपयोगकर्ता का आईडी टोकन अपने सर्वर पर भेजें. इसके बाद, सर्वर पर आईडी टोकन की पुष्टि करें कि वह मान्य है या नहीं. साथ ही, उसमें से uid वापस पाएं. इस तरीके से भेजे गए uid का इस्तेमाल करके, अपने सर्वर पर ऐसे उपयोगकर्ता की पहचान सुरक्षित तरीके से की जा सकती है जिसने उस समय साइन इन किया हुआ हो.
शुरू करने से पहले
Firebase Admin SDK टूल की मदद से आईडी टोकन की पुष्टि करने के लिए, आपके पास सेवा खाता होना चाहिए. सेवा खाते की मदद से Admin SDK टूल को शुरू करने के तरीके के बारे में ज़्यादा जानने के लिए, Admin SDK टूल को सेट अप करने के निर्देश देखें.
क्लाइंट पर आईडी टोकन वापस पाना
जब कोई उपयोगकर्ता या डिवाइस, सफलतापूर्वक साइन इन करता है, तो Firebase एक आईडी टोकन बनाता है. यह टोकन, उपयोगकर्ता या डिवाइस की यूनीक पहचान करता है. साथ ही, उन्हें Firebase Realtime Database और Cloud Storage जैसे कई संसाधनों का ऐक्सेस देता है. अपने कस्टम बैकएंड सर्वर पर, उपयोगकर्ता या डिवाइस की पहचान करने के लिए, उस आईडी टोकन का दोबारा इस्तेमाल किया जा सकता है. क्लाइंट से आईडी टोकन वापस पाने के लिए, पक्का करें कि उपयोगकर्ता ने साइन इन किया हो. इसके बाद, साइन-इन किए हुए उपयोगकर्ता से आईडी टोकन पाएं:
iOS+
Objective-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Swift
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Android
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Unity
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::Future<std::string> idToken = user.GetToken(true);
// Send token to your backend via HTTPS
// ...
}
वेब
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
आईडी टोकन मिलने के बाद, उस JSON Web Token (JWT) को अपने बैकएंड पर भेजा जा सकता है. साथ ही, Firebase Admin SDK टूल का इस्तेमाल करके उसकी पुष्टि की जा सकती है. अगर आपका सर्वर ऐसी भाषा में लिखा गया है जिसे Firebase मूल रूप से सपोर्ट नहीं करता है, तो तीसरे पक्ष की JWT लाइब्रेरी का इस्तेमाल करके भी पुष्टि की जा सकती है.
Firebase Admin SDK टूल का इस्तेमाल करके आईडी टोकन की पुष्टि करना
Firebase Admin SDK टूल में, आईडी टोकन की पुष्टि करने और उन्हें डिकोड करने का एक तरीका शामिल है. अगर दिया गया आईडी टोकन सही फ़ॉर्मैट में है, उसकी समयसीमा खत्म नहीं हुई है, और उस पर सही तरीके से हस्ताक्षर किए गए हैं, तो यह तरीका डिकोड किया गया आईडी टोकन दिखाता है. डिकोड किए गए टोकन से, उपयोगकर्ता या डिवाइस का uid पाया जा सकता है.
सेवा खाते की मदद से Admin SDK टूल को शुरू करने के लिए, Admin SDK टूल को सेट अप करने के निर्देश देखें. इसके बाद, किसी आईडी टोकन की पुष्टि करने के लिए, verifyIdToken() तरीके का इस्तेमाल करें:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Java
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
Go
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
आईडी टोकन की पुष्टि करने के लिए, प्रोजेक्ट आईडी की ज़रूरत होती है. Firebase Admin SDK टूल, इनमें से किसी एक तरीके से प्रोजेक्ट आईडी पाने की कोशिश करता है:
- अगर SDK टूल को
projectIdऐप्लिकेशन के विकल्प के साथ शुरू किया गया है, तो SDK टूल उस विकल्प की वैल्यू का इस्तेमाल करता है. - अगर SDK टूल को सेवा खाते के क्रेडेंशियल के साथ शुरू किया गया है, तो SDK टूल, सेवा खाते के JSON ऑब्जेक्ट के
project_idफ़ील्ड का इस्तेमाल करता है. - अगर
GOOGLE_CLOUD_PROJECTएनवायरमेंट वैरिएबल सेट है, तो SDK टूल इसकी वैल्यू को प्रोजेक्ट आईडी के तौर पर इस्तेमाल करता है. यह एनवायरमेंट वैरिएबल, Google के इन्फ़्रास्ट्रक्चर पर चलने वाले कोड के लिए उपलब्ध है. जैसे, App Engine और Compute Engine.
तीसरे पक्ष की JWT लाइब्रेरी का इस्तेमाल करके आईडी टोकन की पुष्टि करना
अगर आपका बैकएंड ऐसी भाषा में है जिसे Firebase Admin SDK टूल सपोर्ट नहीं करता है, तब भी आईडी टोकन की पुष्टि की जा सकती है. सबसे पहले, अपनी भाषा के लिए तीसरे पक्ष की JWT लाइब्रेरी ढूंढें. इसके बाद, आईडी टोकन के हेडर, पेलोड, और सिग्नेचर की पुष्टि करें.
पुष्टि करें कि आईडी टोकन का हेडर, इन शर्तों के मुताबिक है:
| आईडी टोकन के हेडर के दावे | ||
|---|---|---|
alg |
एल्गोरिदम | "RS256" |
kid |
'की' आईडी |
यह
पर दी गई सार्वजनिक कुंजियों में से किसी एक से मेल खानी चाहिएhttps://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
पुष्टि करें कि आईडी टोकन का पेलोड, इन शर्तों के मुताबिक है:
| आईडी टोकन के पेलोड के दावे | ||
|---|---|---|
exp |
समयसीमा खत्म होने का समय | यह समय, आने वाले समय में होना चाहिए. इस समय को, UNIX युग के बाद से सेकंड में मापा जाता है. |
iat |
जारी करने का समय | यह समय, बीते समय में होना चाहिए. इस समय को, UNIX युग के बाद से सेकंड में मापा जाता है. |
aud |
ऑडियंस | यह आपके Firebase प्रोजेक्ट का आईडी होना चाहिए. यह आपके Firebase प्रोजेक्ट का यूनीक आइडेंटिफ़ायर है. इसे उस प्रोजेक्ट के कंसोल के यूआरएल में देखा जा सकता है. |
iss |
जारी करने वाला |
यह "https://securetoken.google.com/<projectId>" होना चाहिए, जहाँ <projectId> वही प्रोजेक्ट आईडी है जिसका इस्तेमाल ऊपर aud के लिए किया गया है.
|
sub |
विषय |
यह खाली स्ट्रिंग नहीं होनी चाहिए. साथ ही, यह उपयोगकर्ता या
डिवाइस का uid होना चाहिए.
|
auth_time
|
पुष्टि करने का समय | यह समय, बीते समय में होना चाहिए. यह वह समय है जब उपयोगकर्ता ने पुष्टि की थी. |
आखिर में, पक्का करें कि आईडी टोकन पर, टोकन के kid दावे से जुड़ी निजी कुंजी से हस्ताक्षर किए गए हों. https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com से सार्वजनिक कुंजी पाएं और सिग्नेचर की पुष्टि करने के लिए, JWT लाइब्रेरी का इस्तेमाल करें. सार्वजनिक कुंजियों को कब रीफ़्रेश करना है, यह जानने के लिए, उस एंडपॉइंट से मिले जवाब के Cache-Control हेडर में मौजूद max-age की वैल्यू का इस्तेमाल करें.
अगर ऊपर दी गई सभी पुष्टि सही हैं, तो आईडी टोकन के विषय (sub) का इस्तेमाल, उससे जुड़े उपयोगकर्ता या डिवाइस के uid के तौर पर किया जा सकता है.