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

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

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

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

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

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

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

Admin SDK टूल को सेवा खाते की जानकारी अपने-आप ढूंढने देना

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

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

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

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

Node.js

initializeApp();

Java

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

Go

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)

Go

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 टूल, इस कॉल को करने के लिए जिस सेवा खाते का इस्तेमाल कर रहा है उसके पास iam.serviceAccounts.signBlob अनुमति हो. आम तौर पर, यह सेवा खाता {project-name}@appspot.gserviceaccount.com होता है. ज़्यादा जानकारी के लिए, नीचे दिया गया 'समस्या का हल' सेक्शन देखें.

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)

Go

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)

Go

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 के 3600 सेकंड बाद तक हो सकता है.
ध्यान दें: इससे सिर्फ़ कस्टम टोकन के काम करना बंद करने का समय कंट्रोल होता है. हालांकि, 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}.

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

  • Cloud Functions (पहली पीढ़ी): App Engine के डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है.
  • Cloud Functions (दूसरी पीढ़ी): Compute Engine के डिफ़ॉल्ट सेवा खाते का इस्तेमाल करता है.
  1. Google Cloud कंसोल में, 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 फ़ाइल या सेवा खाते का आईडी तय करना न भूलें.