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

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

ऐसा करने के लिए, आपको एक सर्वर एंडपॉइंट बनाना होगा, जो साइन इन करने के क्रेडेंशियल स्वीकार करता हो. जैसे, उपयोगकर्ता नाम और पासवर्ड. अगर क्रेडेंशियल मान्य हैं, तो यह पसंद के मुताबिक JWT दिखाता है. इसके बाद, आपके सर्वर से मिले कस्टम JWT का इस्तेमाल, क्लाइंट डिवाइस से Firebase (iOS+, Android, वेब) की पुष्टि करने के लिए किया जा सकता है. पुष्टि होने के बाद, इस पहचान का इस्तेमाल Firebase Realtime Database और Cloud Storage जैसी Firebase की अन्य सेवाओं को ऐक्सेस करते समय किया जाएगा. इसके अलावा, JWT का कॉन्टेंट आपके Realtime Database Security Rules में auth ऑब्जेक्ट और Cloud Storage Security Rules में request.auth ऑब्जेक्ट में उपलब्ध होगा.

Firebase Admin SDK टूल की मदद से कस्टम टोकन बनाया जा सकता है. इसके अलावा, अगर आपका सर्वर ऐसी भाषा में लिखा गया है जिसे Firebase में नेटिव तौर पर इस्तेमाल नहीं किया जा सकता, तो तीसरे पक्ष की JWT लाइब्रेरी का इस्तेमाल किया जा सकता है.

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

कस्टम टोकन, हस्ताक्षर किए गए JWT होते हैं. इनमें हस्ताक्षर करने के लिए इस्तेमाल की गई निजी कुंजी, Google के किसी सेवा खाते से जुड़ी होती है. कस्टम टोकन पर हस्ताक्षर करने के लिए, Firebase Admin SDK टूल को जिस Google सेवा खाते का इस्तेमाल करना चाहिए उसे बताने के कई तरीके हैं:

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

सेवा खाते की JSON फ़ाइल का इस्तेमाल करना

सेवा खाते की JSON फ़ाइलों में, सेवा खातों से जुड़ी सारी जानकारी होती है. इसमें आरएसए निजी कुंजी भी शामिल है. इन्हें Firebase कंसोल से डाउनलोड किया जा सकता है. सेवा खाते की JSON फ़ाइल की मदद से, Admin SDK को शुरू करने के तरीके के बारे में ज़्यादा जानने के लिए, Admin SDK टूल को सेट अप करने के निर्देश देखें.

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

Admin SDK को सेवा खाता खोजने की अनुमति देना

अगर आपका कोड, Google के मैनेज किए जा रहे किसी एनवायरमेंट में डिप्लॉय किया गया है, तो एडमिन SDK, कस्टम टोकन पर हस्ताक्षर करने का तरीका अपने-आप खोजने की कोशिश कर सकता है:

  • अगर आपका कोड, Java, Python या Go के लिए App Engine स्टैंडर्ड एनवायरमेंट में डिप्लॉय किया गया है, तो कस्टम टोकन पर हस्ताक्षर करने के लिए, Admin SDK उस एनवायरमेंट में मौजूद ऐप्लिकेशन आइडेंटिटी सेवा का इस्तेमाल कर सकता है. ऐप्लिकेशन आइडेंटिटी सेवा, Google App Engine की मदद से आपके ऐप्लिकेशन के लिए उपलब्ध कराए गए सेवा खाते का इस्तेमाल करके, डेटा पर हस्ताक्षर करती है.

  • अगर आपका कोड, मैनेज किए जा रहे किसी अन्य एनवायरमेंट (जैसे, Google Cloud Functions, Google Compute Engine) में डिप्लॉय किया गया है, तो Firebase Admin SDK टूल, लोकल मेटाडेटा सर्वर से सेवा खाते का आईडी अपने-आप ढूंढ सकता है. इसके बाद, ढूंढे गए सेवा खाते के आईडी का इस्तेमाल, टोकन पर रिमोट तौर पर हस्ताक्षर करने के लिए, IAM सेवा के साथ किया जाता है.

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

Node.js

initializeApp();

Java

FirebaseApp.initializeApp();

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();

उसी कोड की स्थानीय तौर पर जांच करने के लिए, सेवा खाते की JSON फ़ाइल डाउनलोड करें और उस पर ले जाने के लिए, GOOGLE_APPLICATION_CREDENTIALS एनवायरमेंट वैरिएबल सेट करें.

अगर Firebase Admin SDK टूल को सेवा खाते का आईडी स्ट्रिंग पता करना है, तो ऐसा तब होता है, जब आपका कोड पहली बार कस्टम टोकन बनाता है. नतीजे को कैश मेमोरी में सेव किया जाता है और टोकन साइन करने के बाद के ऑपरेशन के लिए फिर से इस्तेमाल किया जाता है. अपने-आप खोजे गए सेवा खाते का आईडी, आम तौर पर Google Cloud से मिलने वाले डिफ़ॉल्ट सेवा खातों में से एक होता है:

साफ़ तौर पर बताए गए सेवा खाता आईडी की तरह ही, अपने-आप खोजे गए सेवा खाता आईडी के पास, कस्टम टोकन बनाने की सुविधा के काम करने के लिए iam.serviceAccounts.signBlob अनुमति होनी चाहिए. डिफ़ॉल्ट सेवा खातों को ज़रूरी अनुमतियां देने के लिए, आपको Google Cloud कंसोल के IAM और एडमिन सेक्शन का इस्तेमाल करना पड़ सकता है. ज़्यादा जानकारी के लिए, समस्या हल करने का तरीका बताने वाला सेक्शन देखें.

सेवा खाता आईडी का इस्तेमाल करना

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

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

किसी अलग सेवा खाते के आईडी का इस्तेमाल करके कस्टम टोकन बनाने के लिए, SDK को यहां दिखाए गए तरीके से शुरू करें:

Node.js

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

Java

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

Python

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)
}

C#

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

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

Firebase Admin SDK टूल का इस्तेमाल करके, कस्टम टोकन बनाना

Firebase Admin SDK टूल में, कस्टम टोकन बनाने का एक तरीका पहले से मौजूद होता है. आपको कम से कम एक uid देना होगा. यह कोई भी स्ट्रिंग हो सकती है, लेकिन यह उस उपयोगकर्ता या डिवाइस की खास पहचान करनी चाहिए जिसकी पुष्टि की जा रही है. ये टोकन एक घंटे बाद खत्म हो जाते हैं.

Node.js

const uid = 'some-uid';

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

Java

String uid = "some-uid";

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

Python

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)

C#

var uid = "some-uid";

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

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

Node.js

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);
  });

Java

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

Python

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)

C#

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() को कॉल करके कस्टम टोकन की पुष्टि करता है:

iOS+

Objective-C
[[FIRAuth auth] signInWithCustomToken:customToken
                           completion:^(FIRAuthDataResult * _Nullable authResult,
                                        NSError * _Nullable error) {
  // ...
}];
Swift
Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
  // ...
}

Android

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);
                }
            }
        });

Unity

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);
});

C++

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

Web

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

Web

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()) की तरह ही, आपके Realtime Database Security Rules में मौजूद auth ऑब्जेक्ट और Cloud Storage Security Rules में मौजूद 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 लाइब्रेरी का इस्तेमाल करके कस्टम टोकन बनाना

अगर आपका बैकएंड ऐसी भाषा में है जिसके लिए आधिकारिक Firebase Admin SDK टूल उपलब्ध नहीं है, तो भी कस्टम टोकन मैन्युअल तरीके से बनाए जा सकते हैं. सबसे पहले, अपनी भाषा के लिए तीसरे पक्ष की जेडब्लयूटी लाइब्रेरी ढूंढें. इसके बाद, उस JWT लाइब्रेरी का इस्तेमाल करके, JWT को माइन्ट करें. इसमें ये दावे शामिल होने चाहिए:

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

यहां कई भाषाओं में कस्टम टोकन बनाने के तरीके के कुछ उदाहरण दिए गए हैं. ये ऐसी भाषाएं हैं जिनमें Firebase Admin SDK टूल काम नहीं करता:

PHP

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

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

कस्टम टोकन बनाने के बाद, उसे अपने क्लाइंट ऐप्लिकेशन पर भेजें, ताकि Firebase के साथ पुष्टि करने के लिए उसका इस्तेमाल किया जा सके. ऐसा करने का तरीका जानने के लिए, ऊपर दिए गए कोड के सैंपल देखें.

समस्या का हल

इस सेक्शन में, कस्टम टोकन बनाते समय डेवलपर को होने वाली कुछ आम समस्याओं और उन्हें ठीक करने के तरीके के बारे में बताया गया है.

IAM API चालू नहीं है

अगर टोकन पर हस्ताक्षर करने के लिए सेवा खाते का आईडी दिया जा रहा है, तो आपको इस तरह की गड़बड़ी दिख सकती है:

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.

Firebase Admin SDK टूल, टोकन पर हस्ताक्षर करने के लिए IAM API का इस्तेमाल करता है. इस गड़बड़ी से पता चलता है कि फ़िलहाल, आपके Firebase प्रोजेक्ट के लिए IAM API चालू नहीं है. गड़बड़ी के मैसेज में मौजूद लिंक को वेब ब्राउज़र में खोलें. इसके बाद, अपने प्रोजेक्ट के लिए इसे चालू करने के लिए, "एपीआई चालू करें" बटन पर क्लिक करें.

सेवा खाते के पास ज़रूरी अनुमतियां नहीं हैं

अगर 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 Cloud console में, IAM और एडमिन पेज खोलें.
  2. अपना प्रोजेक्ट चुनें और "जारी रखें" पर क्लिक करें.
  3. आपको जिस सेवा खाते को अपडेट करना है उसके बगल में मौजूद, बदलाव करें आइकॉन पर क्लिक करें.
  4. "कोई और भूमिका जोड़ें" पर क्लिक करें.
  5. खोज फ़िल्टर में "सेवा खाता टोकन क्रिएटर" टाइप करें और नतीजों में से इसे चुनें.
  6. भूमिका देने की पुष्टि करने के लिए, "सेव करें" पर क्लिक करें.

इस प्रोसेस के बारे में ज़्यादा जानने के लिए, आईएएम दस्तावेज़ देखें या 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 के किसी एनवायरमेंट में डिप्लॉय किया गया हो. अगर ऐसा नहीं है, तो एसडीके शुरू करने के समय, सेवा खाते की JSON फ़ाइल या सेवा खाते का आईडी डालना न भूलें.