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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Node.js

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 Cloud प्रोजेक्ट में सेवा खातों की खास पहचान करते हैं.

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

Node.js

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 व्यवस्थापक 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);
  });

जावा

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 ऑब्जेक्ट में उपलब्ध होगा:

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

जावा

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.FirebaseUser newUser = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
});

सी++

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

Web version 8

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

Web version 9

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 द्वारा निर्दिष्ट खाते के साथ आपके क्लाइंट ऐप में साइन इन हो जाएगा। यदि वह खाता पहले मौजूद नहीं था, तो उस उपयोगकर्ता के लिए एक रिकॉर्ड बनाया जाएगा।

उसी तरह जैसे अन्य साइन-इन विधियों (जैसे auth signInWithEmailAndPassword() और signInWithCredential() ) के साथ आपके रीयलटाइम डेटाबेस नियमों में ऑथ ऑब्जेक्ट और आपके क्लाउड स्टोरेज सुरक्षा नियमों में 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 (क्लाउड स्टोरेज) ऑब्जेक्ट से संदर्भित किया जा सकता है:

डेटाबेस नियम

{
  "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 जारी-समय पर UNIX युग के बाद से वर्तमान समय, सेकंडों में
exp समय सीमा समाप्ति समय समय, सेकंड में UNIX युग के बाद से, जिस पर टोकन समाप्त हो जाता है। यह iat से अधिकतम 3600 सेकंड बाद में हो सकता है।
नोट: यह केवल उस समय को नियंत्रित करता है जब कस्टम टोकन स्वयं समाप्त हो जाता है। लेकिन एक बार जब आप signInWithCustomToken() का उपयोग करने के लिए किसी उपयोगकर्ता को साइन इन करते हैं, तो वे डिवाइस में तब तक साइन इन रहेंगे जब तक उनका सत्र अमान्य नहीं हो जाता या उपयोगकर्ता साइन आउट नहीं हो जाता।
uid साइन-इन किए गए उपयोगकर्ता का विशिष्ट पहचानकर्ता 1-36 वर्णों के बीच एक स्ट्रिंग होना चाहिए
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.

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

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

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