कस्टम टोकन बनाएं

फायरबेस आपको सुरक्षित JSON वेब टोकन (JWTs) का उपयोग करके उपयोगकर्ताओं या उपकरणों को प्रमाणित करने की अनुमति देकर प्रमाणीकरण पर पूर्ण नियंत्रण देता है। आप इन टोकन को अपने सर्वर पर जनरेट करते हैं, उन्हें क्लाइंट डिवाइस पर वापस पास करते हैं, और फिर signInWithCustomToken() विधि के माध्यम से प्रमाणित करने के लिए उनका उपयोग करते हैं।

इसे प्राप्त करने के लिए, आपको एक सर्वर एंडपॉइंट बनाना होगा जो साइन-इन क्रेडेंशियल्स को स्वीकार करता है - जैसे कि एक उपयोगकर्ता नाम और पासवर्ड - और, यदि क्रेडेंशियल्स मान्य हैं, तो एक कस्टम JWT लौटाता है। आपके सर्वर से लौटाए गए कस्टम जेडब्ल्यूटी का उपयोग क्लाइंट डिवाइस द्वारा फायरबेस ( आईओएस + , एंड्रॉइड , वेब ) के साथ प्रमाणित करने के लिए किया जा सकता है। एक बार प्रमाणित हो जाने के बाद, इस पहचान का उपयोग फायरबेस रियलटाइम डेटाबेस और क्लाउड स्टोरेज जैसी अन्य फायरबेस सेवाओं तक पहुँचने के लिए किया जाएगा। इसके अलावा, JWT की सामग्री आपके रीयलटाइम डेटाबेस सुरक्षा नियमों में auth ऑब्जेक्ट और आपके क्लाउड स्टोरेज सुरक्षा नियमों में request.auth ऑब्जेक्ट में उपलब्ध होगी।

आप फायरबेस एडमिन एसडीके के साथ एक कस्टम टोकन बना सकते हैं, या यदि आपका सर्वर ऐसी भाषा में लिखा गया है जो फायरबेस मूल रूप से समर्थन नहीं करता है, तो आप तीसरे पक्ष की जेडब्ल्यूटी लाइब्रेरी का उपयोग कर सकते हैं।

शुरू करने से पहले

कस्टम टोकन हस्ताक्षरित JWT होते हैं जहां हस्ताक्षर करने के लिए उपयोग की जाने वाली निजी कुंजी Google सेवा खाते से संबंधित होती है। कस्टम टोकन पर हस्ताक्षर करने के लिए Firebase व्यवस्थापक SDK द्वारा उपयोग किए जाने वाले Google सेवा खाते को निर्दिष्ट करने के कई तरीके हैं:

  • एक सेवा खाता JSON फ़ाइल का उपयोग करना -- इस विधि का उपयोग किसी भी वातावरण में किया जा सकता है, लेकिन आपको अपने कोड के साथ एक सेवा खाता JSON फ़ाइल पैकेज करने की आवश्यकता होती है। यह सुनिश्चित करने के लिए विशेष ध्यान रखा जाना चाहिए कि सेवा खाता JSON फ़ाइल बाहरी पक्षों के सामने न आए।
  • व्यवस्थापक SDK को एक सेवा खाता खोजने देना -- इस विधि का उपयोग Google द्वारा प्रबंधित वातावरण जैसे Google क्लाउड फ़ंक्शंस और ऐप इंजन में किया जा सकता है। आपको Google क्लाउड कंसोल के माध्यम से कुछ अतिरिक्त अनुमतियों को कॉन्फ़िगर करना पड़ सकता है।
  • सेवा खाता आईडी का उपयोग करना -- जब Google-प्रबंधित वातावरण में उपयोग किया जाता है तो यह विधि निर्दिष्ट सेवा खाते की कुंजी का उपयोग करके टोकन पर हस्ताक्षर करेगी। हालाँकि, यह एक दूरस्थ वेब सेवा का उपयोग करता है, और आपको Google क्लाउड कंसोल के माध्यम से इस सेवा खाते के लिए अतिरिक्त अनुमतियाँ कॉन्फ़िगर करनी पड़ सकती हैं।

एक सेवा खाता JSON फ़ाइल का उपयोग करना

सेवा खाता JSON फ़ाइलों में सेवा खातों (RSA निजी कुंजी सहित) से संबंधित सभी जानकारी होती है। उन्हें फायरबेस कंसोल से डाउनलोड किया जा सकता है। सेवा खाता JSON फ़ाइल के साथ व्यवस्थापक SDK को प्रारंभ करने के तरीके के बारे में अधिक जानकारी के लिए व्यवस्थापक SDK सेट अप निर्देशों का पालन करें।

प्रारंभिकरण की यह विधि व्यवस्थापक एसडीके परिनियोजन की एक विस्तृत श्रृंखला के लिए उपयुक्त है। साथ ही यह व्यवस्थापक एसडीके को बिना किसी दूरस्थ एपीआई कॉल के स्थानीय रूप से कस्टम टोकन बनाने और हस्ताक्षर करने में सक्षम बनाता है। इस दृष्टिकोण का मुख्य दोष यह है कि इसके लिए आपको अपने कोड के साथ एक सेवा खाता JSON फ़ाइल पैकेज करने की आवश्यकता होती है। यह भी ध्यान रखें कि सेवा खाते की JSON फाइल में निजी कुंजी संवेदनशील जानकारी है, और इसे गोपनीय रखने के लिए विशेष ध्यान रखा जाना चाहिए। विशेष रूप से, सेवा खाता JSON फ़ाइलों को सार्वजनिक संस्करण नियंत्रण में जोड़ने से बचना चाहिए।

व्यवस्थापक SDK को एक सेवा खाता खोजने देना

यदि आपका कोड Google द्वारा प्रबंधित परिवेश में परिनियोजित किया गया है, तो व्यवस्थापक SDK कस्टम टोकन पर हस्ताक्षर करने के लिए स्वतः खोज करने का प्रयास कर सकता है:

  • यदि आपका कोड जावा, पायथन या गो के लिए ऐप इंजन मानक वातावरण में तैनात किया गया है, तो एडमिन एसडीके कस्टम टोकन पर हस्ताक्षर करने के लिए उस वातावरण में मौजूद ऐप आइडेंटिटी सेवा का उपयोग कर सकता है। ऐप पहचान सेवा Google ऐप इंजन द्वारा आपके ऐप के लिए प्रावधान किए गए सेवा खाते का उपयोग करके डेटा पर हस्ताक्षर करती है।

  • यदि आपका कोड किसी अन्य प्रबंधित वातावरण (जैसे Google क्लाउड फ़ंक्शंस, Google कंप्यूट इंजन) में तैनात किया गया है, तो फायरबेस एडमिन एसडीके स्थानीय मेटाडेटा सर्वर से एक सेवा खाता आईडी स्ट्रिंग को स्वतः खोज सकता है। खोजी गई सेवा खाता आईडी का उपयोग IAM सेवा के साथ दूर से टोकन पर हस्ताक्षर करने के लिए किया जाता है।

इन हस्ताक्षर विधियों का उपयोग करने के लिए, SDK को Google एप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल्स के साथ प्रारंभ करें और सेवा खाता आईडी स्ट्रिंग निर्दिष्ट न करें:

नोड.जेएस

initializeApp();

जावा

FirebaseApp.initializeApp();

अजगर

default_app = firebase_admin.initialize_app()

जाना

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

सी#

FirebaseApp.Create();

समान कोड का स्थानीय रूप से परीक्षण करने के लिए, एक सेवा खाता JSON फ़ाइल डाउनलोड करें और इसे इंगित करने के लिए GOOGLE_APPLICATION_CREDENTIALS परिवेश चर सेट करें.

अगर फायरबेस एडमिन एसडीके को सर्विस अकाउंट आईडी स्ट्रिंग की खोज करनी है, तो ऐसा तब होता है जब आपका कोड पहली बार कस्टम टोकन बनाता है। परिणाम को कैश किया जाता है और बाद के टोकन साइनिंग ऑपरेशंस के लिए पुन: उपयोग किया जाता है। स्वतः खोजी गई सेवा खाता आईडी आमतौर पर Google क्लाउड द्वारा प्रदान किए गए डिफ़ॉल्ट सेवा खातों में से एक है:

स्पष्ट रूप से निर्दिष्ट सेवा खाता आईडी की तरह ही, कस्टम टोकन निर्माण कार्य करने के लिए स्वतः खोज सेवा खाता आईडी में iam.serviceAccounts.signBlob अनुमति होनी चाहिए। डिफ़ॉल्ट सेवा खातों को आवश्यक अनुमतियाँ प्रदान करने के लिए आपको Google क्लाउड कंसोल के IAM और व्यवस्थापक अनुभाग का उपयोग करना पड़ सकता है। अधिक विवरण के लिए नीचे समस्या निवारण अनुभाग देखें।

सेवा खाता आईडी का उपयोग करना

अपने एप्लिकेशन के विभिन्न हिस्सों के बीच निरंतरता बनाए रखने के लिए, आप एक सेवा खाता आईडी निर्दिष्ट कर सकते हैं, जिसकी कुंजियों का उपयोग Google-प्रबंधित वातावरण में चलते समय टोकन पर हस्ताक्षर करने के लिए किया जाएगा। यह IAM नीतियों को सरल और अधिक सुरक्षित बना सकता है, और आपके कोड में सेवा खाता JSON फ़ाइल शामिल करने से बच सकता है।

सेवा खाता आईडी Google क्लाउड कंसोल में या डाउनलोड की गई सेवा खाता JSON फ़ाइल के client_email फ़ील्ड में मिल सकती है। सेवा खाता आईडी वे ईमेल पते होते हैं जिनका प्रारूप निम्न होता है: <client-id>@<project-id>.iam.gserviceaccount.com । वे विशिष्ट रूप से Firebase और Google क्लाउड प्रोजेक्ट में सेवा खातों की पहचान करते हैं।

एक अलग सेवा खाता आईडी का उपयोग करके कस्टम टोकन बनाने के लिए, एसडीके को नीचे दिखाए अनुसार प्रारंभ करें:

नोड.जेएस

initializeApp({
  serviceAccountId: 'my-client-id@my-project-id.iam.gserviceaccount.com',
});

जावा

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setServiceAccountId("my-client-id@my-project-id.iam.gserviceaccount.com")
    .build();
FirebaseApp.initializeApp(options);

अजगर

options = {
    'serviceAccountId': 'my-client-id@my-project-id.iam.gserviceaccount.com',
}
firebase_admin.initialize_app(options=options)

जाना

conf := &firebase.Config{
	ServiceAccountID: "my-client-id@my-project-id.iam.gserviceaccount.com",
}
app, err := firebase.NewApp(context.Background(), conf)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

सी#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ServiceAccountId = "my-client-id@my-project-id.iam.gserviceaccount.com",
});

सेवा खाता आईडी संवेदनशील जानकारी नहीं हैं और इसलिए उनका जोखिम अप्रासंगिक है। हालाँकि, निर्दिष्ट सेवा खाते के साथ कस्टम टोकन पर हस्ताक्षर करने के लिए, फायरबेस एडमिन एसडीके को एक दूरस्थ सेवा का आह्वान करना होगा। इसके अलावा, आपको यह भी सुनिश्चित करना होगा कि यह कॉल करने के लिए व्यवस्थापक SDK जिस सेवा खाते का उपयोग कर रहा है—आमतौर पर {project-name}@appspot.gserviceaccount.com — के पास iam.serviceAccounts.signBlob अनुमति है। अधिक विवरण के लिए नीचे समस्या निवारण अनुभाग देखें।

Firebase Admin SDK का उपयोग करके कस्टम टोकन बनाएं

कस्टम टोकन बनाने के लिए फायरबेस एडमिन एसडीके में एक अंतर्निहित विधि है। कम से कम, आपको एक uid प्रदान करने की आवश्यकता है, जो कोई भी स्ट्रिंग हो सकती है लेकिन उस उपयोगकर्ता या डिवाइस की विशिष्ट पहचान होनी चाहिए जिसे आप प्रमाणित कर रहे हैं। ये टोकन एक घंटे के बाद समाप्त हो जाते हैं।

नोड.जेएस

const uid = 'some-uid';

getAuth()
  .createCustomToken(uid)
  .then((customToken) => {
    // Send token back to client
  })
  .catch((error) => {
    console.log('Error creating custom token:', error);
  });

जावा

String uid = "some-uid";

String customToken = FirebaseAuth.getInstance().createCustomToken(uid);
// Send token back to client

अजगर

uid = 'some-uid'

custom_token = auth.create_custom_token(uid)

जाना

client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

token, err := client.CustomToken(ctx, "some-uid")
if err != nil {
	log.Fatalf("error minting custom token: %v\n", err)
}

log.Printf("Got custom token: %v\n", token)

सी#

var uid = "some-uid";

string customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid);
// Send token back to client

आप कस्टम टोकन में शामिल किए जाने के लिए वैकल्पिक रूप से अतिरिक्त दावे भी निर्दिष्ट कर सकते हैं। उदाहरण के लिए, नीचे, premiumAccount फ़ील्ड को कस्टम टोकन में जोड़ा गया है, जो आपके सुरक्षा नियमों में auth / request.auth ऑब्जेक्ट में उपलब्ध होगा:

नोड.जेएस

const userId = 'some-uid';
const additionalClaims = {
  premiumAccount: true,
};

getAuth()
  .createCustomToken(userId, additionalClaims)
  .then((customToken) => {
    // Send token back to client
  })
  .catch((error) => {
    console.log('Error creating custom token:', error);
  });

जावा

String uid = "some-uid";
Map<String, Object> additionalClaims = new HashMap<String, Object>();
additionalClaims.put("premiumAccount", true);

String customToken = FirebaseAuth.getInstance()
    .createCustomToken(uid, additionalClaims);
// Send token back to client

अजगर

uid = 'some-uid'
additional_claims = {
    'premiumAccount': True
}

custom_token = auth.create_custom_token(uid, additional_claims)

जाना

client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

claims := map[string]interface{}{
	"premiumAccount": true,
}

token, err := client.CustomTokenWithClaims(ctx, "some-uid", claims)
if err != nil {
	log.Fatalf("error minting custom token: %v\n", err)
}

log.Printf("Got custom token: %v\n", token)

सी#

var uid = "some-uid";
var additionalClaims = new Dictionary<string, object>()
{
    { "premiumAccount", true },
};

string customToken = await FirebaseAuth.DefaultInstance
    .CreateCustomTokenAsync(uid, additionalClaims);
// Send token back to client

आरक्षित कस्टम टोकन नाम

ग्राहकों पर कस्टम टोकन का उपयोग करके साइन इन करें

कस्टम टोकन बनाने के बाद, आपको इसे अपने क्लाइंट ऐप पर भेजना चाहिए। क्लाइंट ऐप कस्टम टोकन के साथ signInWithCustomToken() को कॉल करके प्रमाणित करता है:

आईओएस+

उद्देश्य सी
[[FIRAuth auth] signInWithCustomToken:customToken
                           completion:^(FIRAuthDataResult * _Nullable authResult,
                                        NSError * _Nullable error) {
  // ...
}];
तीव्र
Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
  // ...
}

एंड्रॉयड

mAuth.signInWithCustomToken(mCustomToken)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCustomToken:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    updateUI(user);
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCustomToken:failure", task.getException());
                    Toast.makeText(CustomAuthActivity.this, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                    updateUI(null);
                }
            }
        });

एकता

auth.SignInWithCustomTokenAsync(custom_token).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("SignInWithCustomTokenAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("SignInWithCustomTokenAsync encountered an error: " + task.Exception);
    return;
  }

  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});

सी ++

firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);

वेब नेमस्पेस्ड एपीआई

firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });

वेब मॉड्यूलर एपीआई

import { getAuth, signInWithCustomToken } from "firebase/auth";

const auth = getAuth();
signInWithCustomToken(auth, token)
  .then((userCredential) => {
    // Signed in
    const user = userCredential.user;
    // ...
  })
  .catch((error) => {
    const errorCode = error.code;
    const errorMessage = error.message;
    // ...
  });

यदि प्रमाणीकरण सफल हो जाता है, तो आपका उपयोगकर्ता अब कस्टम टोकन में शामिल uid द्वारा निर्दिष्ट खाते के साथ आपके क्लाइंट ऐप में साइन इन हो जाएगा। यदि वह खाता पहले मौजूद नहीं था, तो उस उपयोगकर्ता के लिए एक रिकॉर्ड बनाया जाएगा।

उसी तरह जैसे अन्य साइन-इन विधियों (जैसे कि signInWithEmailAndPassword() और signInWithCredential() ) के साथ आपके रीयलटाइम डेटाबेस सुरक्षा नियमों में auth ऑब्जेक्ट और आपके क्लाउड स्टोरेज सुरक्षा नियमों में request.auth ऑब्जेक्ट उपयोगकर्ता के uid के साथ पॉप्युलेट किया जाएगा। . इस मामले में, uid वह होगी जिसे आपने कस्टम टोकन बनाते समय निर्दिष्ट किया था।

डेटाबेस नियम

{
  "rules": {
    "adminContent": {
      ".read": "auth.uid === 'some-uid'"
    }
  }
}

भंडारण नियम

service firebase.storage {
  match /b/<your-firebase-storage-bucket>/o {
    match /adminContent/{filename} {
      allow read, write: if request.auth != null && request.auth.uid == "some-uid";
    }
  }
}

यदि कस्टम टोकन में अतिरिक्त दावे हैं, तो उन्हें आपके नियमों में auth.token (Firebase Realtime Database) या request.auth.token (Cloud Storage) ऑब्जेक्ट से संदर्भित किया जा सकता है:

डेटाबेस नियम

{
  "rules": {
    "premiumContent": {
      ".read": "auth.token.premiumAccount === true"
    }
  }
}

भंडारण नियम

service firebase.storage {
  match /b/<your-firebase-storage-bucket>/o {
    match /premiumContent/{filename} {
      allow read, write: if request.auth.token.premiumAccount == true;
    }
  }
}

तृतीय-पक्ष JWT लाइब्रेरी का उपयोग करके कस्टम टोकन बनाएँ

यदि आपका बैकएंड ऐसी भाषा में है जिसमें आधिकारिक फायरबेस एडमिन एसडीके नहीं है, तो भी आप मैन्युअल रूप से कस्टम टोकन बना सकते हैं। सबसे पहले, अपनी भाषा के लिए एक तृतीय-पक्ष JWT लाइब्रेरी खोजें । फिर, उस JWT लाइब्रेरी का उपयोग JWT को मिन्ट करने के लिए करें जिसमें निम्नलिखित दावे शामिल हैं:

कस्टम टोकन का दावा
alg कलन विधि "RS256"
iss जारीकर्ता आपकी परियोजना का सेवा खाता ईमेल पता
sub विषय आपकी परियोजना का सेवा खाता ईमेल पता
aud श्रोता "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat जारी-समय पर यूनिक्स युग के बाद से सेकंड में वर्तमान समय
exp समय सीमा समाप्ति समय समय, UNIX युग के बाद से सेकंड में, जिस पर टोकन समाप्त हो जाता है। यह iat से अधिकतम 3600 सेकंड बाद में हो सकता है।
नोट: यह केवल उस समय को नियंत्रित करता है जब कस्टम टोकन स्वयं समाप्त हो जाता है। लेकिन एक बार जब आप किसी उपयोगकर्ता को साइन इन signInWithCustomToken() उपयोग करके साइन इन करते हैं, तो वे डिवाइस में तब तक साइन इन रहेंगे जब तक कि उनका सत्र अमान्य न हो जाए या उपयोगकर्ता साइन आउट न हो जाए।
uid साइन-इन किए गए उपयोगकर्ता का विशिष्ट पहचानकर्ता 1-128 वर्णों के बीच, समावेशी, एक स्ट्रिंग होना चाहिए। छोटे uid बेहतर प्रदर्शन प्रदान करते हैं।
claims (वैकल्पिक) सुरक्षा नियमों में शामिल करने के लिए वैकल्पिक कस्टम दावे auth / request.auth चर

फायरबेस एडमिन एसडीके द्वारा समर्थित नहीं होने वाली विभिन्न भाषाओं में कस्टम टोकन बनाने के तरीके के कुछ उदाहरण कार्यान्वयन यहां दिए गए हैं:

पीएचपी

php-jwt उपयोग करना:

// Requires: composer require firebase/php-jwt
use Firebase\JWT\JWT;

// Get your service account's email address and private key from the JSON key file
$service_account_email = "abc-123@a-b-c-123.iam.gserviceaccount.com";
$private_key = "-----BEGIN PRIVATE KEY-----...";

function create_custom_token($uid, $is_premium_account) {
  global $service_account_email, $private_key;

  $now_seconds = time();
  $payload = array(
    "iss" => $service_account_email,
    "sub" => $service_account_email,
    "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
    "iat" => $now_seconds,
    "exp" => $now_seconds+(60*60),  // Maximum expiration time is one hour
    "uid" => $uid,
    "claims" => array(
      "premium_account" => $is_premium_account
    )
  );
  return JWT::encode($payload, $private_key, "RS256");
}

माणिक

ruby-jwt उपयोग करना:

require "jwt"

# Get your service account's email address and private key from the JSON key file
$service_account_email = "service-account@my-project-abc123.iam.gserviceaccount.com"
$private_key = OpenSSL::PKey::RSA.new "-----BEGIN PRIVATE KEY-----\n..."

def create_custom_token(uid, is_premium_account)
  now_seconds = Time.now.to_i
  payload = {:iss => $service_account_email,
             :sub => $service_account_email,
             :aud => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
             :iat => now_seconds,
             :exp => now_seconds+(60*60), # Maximum expiration time is one hour
             :uid => uid,
             :claims => {:premium_account => is_premium_account}}
  JWT.encode payload, $private_key, "RS256"
end

कस्टम टोकन बनाने के बाद, इसे फायरबेस के साथ प्रमाणित करने के लिए उपयोग करने के लिए अपने क्लाइंट ऐप पर भेजें। इसे कैसे करें इसके लिए उपरोक्त कोड नमूने देखें।

समस्या निवारण

यह खंड कुछ सामान्य समस्याओं की रूपरेखा देता है जो डेवलपर्स कस्टम टोकन बनाते समय सामना कर सकते हैं, और उन्हें कैसे हल करें।

आईएएम एपीआई सक्षम नहीं है

यदि आप टोकन पर हस्ताक्षर करने के लिए एक सेवा खाता आईडी निर्दिष्ट कर रहे हैं, तो आपको निम्न के समान त्रुटि मिल सकती है:

Identity and Access Management (IAM) API has not been used in project
1234567890 before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=1234567890
then retry. If you enabled this API recently, wait a few minutes for the action
to propagate to our systems and retry.

फायरबेस एडमिन एसडीके टोकन पर हस्ताक्षर करने के लिए आईएएम एपीआई का उपयोग करता है। यह त्रुटि इंगित करती है कि IAM API वर्तमान में आपके Firebase प्रोजेक्ट के लिए सक्षम नहीं है। एक वेब ब्राउज़र में त्रुटि संदेश में लिंक खोलें, और इसे अपने प्रोजेक्ट के लिए सक्षम करने के लिए "एपीआई सक्षम करें" बटन पर क्लिक करें।

सेवा खाते के लिए आवश्यक अनुमतियाँ नहीं हैं

यदि सेवा खाता Firebase Admin SDK चल रहा है क्योंकि उसके पास iam.serviceAccounts.signBlob अनुमति नहीं है, तो आपको निम्न जैसा त्रुटि संदेश मिल सकता है:

Permission iam.serviceAccounts.signBlob is required to perform this operation
on service account projects/-/serviceAccounts/{your-service-account-id}.

इसे हल करने का सबसे आसान तरीका है "सर्विस अकाउंट टोकन क्रिएटर" IAM भूमिका को संबंधित सर्विस अकाउंट को देना, आमतौर पर {project-name}@appspot.gserviceaccount.com :

  1. Google क्लाउड कंसोल में IAM और व्यवस्थापक पृष्ठ खोलें।
  2. अपनी परियोजना का चयन करें और "जारी रखें" पर क्लिक करें।
  3. आप जिस सेवा खाते को अपडेट करना चाहते हैं, उसके अनुरूप संपादित करें आइकन पर क्लिक करें।
  4. "एक और भूमिका जोड़ें" पर क्लिक करें।
  5. खोज फ़िल्टर में "सेवा खाता टोकन निर्माता" टाइप करें, और इसे परिणामों से चुनें।
  6. भूमिका अनुदान की पुष्टि करने के लिए "सहेजें" पर क्लिक करें।

इस प्रक्रिया के बारे में अधिक विवरण के लिए IAM दस्तावेज़ीकरण देखें, या gcloud कमांड-लाइन टूल का उपयोग करके भूमिकाओं को अपडेट करना सीखें।

सेवा खाता निर्धारित करने में विफल

यदि आपको निम्न के समान एक त्रुटि संदेश मिलता है, तो Firebase Admin SDK को ठीक से प्रारंभ नहीं किया गया है।

Failed to determine service account ID. Initialize the SDK with service account
credentials or specify a service account ID with iam.serviceAccounts.signBlob
permission.

यदि आप किसी सेवा खाता आईडी को स्वत: खोजने के लिए SDK पर निर्भर हैं, तो सुनिश्चित करें कि कोड मेटाडेटा सर्वर के साथ प्रबंधित Google परिवेश में परिनियोजित किया गया है. अन्यथा, SDK आरंभीकरण पर सेवा खाता JSON फ़ाइल या सेवा खाता ID निर्दिष्ट करना सुनिश्चित करें।