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

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

इसके लिए, आपको एक सर्वर एंडपॉइंट बनाना होगा, जो साइन-इन क्रेडेंशियल स्वीकार करता हो. जैसे, उपयोगकर्ता नाम और पासवर्ड. साथ ही, अगर क्रेडेंशियल मान्य हैं, तो कस्टम JWT दिखाता हो. इसके बाद, आपके सर्वर से मिले कस्टम JWT का इस्तेमाल, क्लाइंट डिवाइस Firebase से पुष्टि करने के लिए कर सकता है (iOS+, Android, वेब). पुष्टि होने के बाद, इस आइडेंटिटी का इस्तेमाल Firebase की अन्य सेवाओं को ऐक्सेस करने के लिए किया जाएगा. जैसे, Firebase Realtime Database और Cloud Storage. इसके अलावा, 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 को सेट अप करने के निर्देश देखें.

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

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

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

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

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

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

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 कंसोल के आईएएम और एडमिन सेक्शन का इस्तेमाल करना पड़ सकता है. ज़्यादा जानकारी के लिए, नीचे दिया गया 'समस्या का हल' सेक्शन देखें.

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

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

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

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

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 लाइब्रेरी का इस्तेमाल करके एक JWT बनाएं, जिसमें ये दावे शामिल हों:

कस्टम टोकन के दावे
alg एल्‍गोरि‍दम "RS256"
iss जारी करने वाला आपके प्रोजेक्ट के सेवा खाते का ईमेल पता
sub विषय आपके प्रोजेक्ट के सेवा खाते का ईमेल पता
aud ऑडियंस "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat जारी करने का समय Unix epoch के बाद से, मौजूदा समय सेकंड में दिखता है
exp समाप्ति समय UNIX epoch के बाद से सेकंड में वह समय जब टोकन की समयसीमा खत्म हो जाती है. यह iat के ज़्यादा से ज़्यादा 3,600 सेकंड बाद हो सकता है.
ध्यान दें: इससे सिर्फ़ यह कंट्रोल किया जाता है कि कस्टम टोकन की समयसीमा कब खत्म होगी. हालांकि, अगर आपने किसी उपयोगकर्ता को signInWithCustomToken() का इस्तेमाल करके साइन इन किया है, तो वह डिवाइस में तब तक साइन इन रहेगा, जब तक उसका सेशन अमान्य नहीं हो जाता या वह साइन आउट नहीं कर देता.
uid साइन इन किए हुए उपयोगकर्ता का यूनीक आइडेंटिफ़ायर, एक स्ट्रिंग होनी चाहिए. इसमें 1 से 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}.

इस समस्या को हल करने के लिए, सही सेवा खाते को सेवा खाता टोकन क्रिएटर की आईएएम भूमिका असाइन करें. इस्तेमाल किया जाने वाला डिफ़ॉल्ट सेवा खाता, एनवायरमेंट और Cloud Functions के वर्शन पर निर्भर करता है:

  • Cloud Functions (पहली जनरेशन): यह डिफ़ॉल्ट रूप से App Engine के सेवा खाते का इस्तेमाल करता है.
  • Cloud Functions (दूसरी जनरेशन): यह Compute Engine के डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है.
  1. Google Cloud कंसोल में, IAM और एडमिन पर जाएं.

  2. आपको जिस सेवा खाते को अपडेट करना है उसके बगल में मौजूद, 'बदलाव करें' आइकॉन पर क्लिक करें.

  3. कोई अन्य भूमिका जोड़ें पर क्लिक करें.

  4. खोज फ़िल्टर में "Service Account Token Creator" टाइप करें और नतीजों में से इसे चुनें

  5. भूमिका असाइन करने की पुष्टि करने के लिए, सेव करें पर क्लिक करें.

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