Firebase आपको सुरक्षित JSON वेब टोकन (JWT) का इस्तेमाल करके उपयोगकर्ताओं या डिवाइस की पुष्टि करने की अनुमति देता है. इससे आपको पुष्टि करने पर पूरा कंट्रोल मिलता है. आप इन टोकन को अपने सर्वर पर जनरेट करते हैं, उन्हें वापस किसी क्लाइंट डिवाइस पर पास करते हैं, और फिर signInWithCustomToken()
तरीके से पुष्टि करने के लिए उनका इस्तेमाल करते हैं.
इसे पाने के लिए, आपको एक ऐसा सर्वर एंडपॉइंट बनाना होगा जो साइन-इन क्रेडेंशियल, जैसे कि उपयोगकर्ता नाम और पासवर्ड स्वीकार करता हो. अगर क्रेडेंशियल मान्य हैं, तो यह कस्टम JWT दिखाता है. इसके बाद, आपके सर्वर से लौटाए गए कस्टम JWT का इस्तेमाल, क्लाइंट डिवाइस से Firebase की पुष्टि करने के लिए किया जा सकता है. (iOS+, Android,
वेब). पुष्टि होने के बाद, इस पहचान का इस्तेमाल Firebase रीयल टाइम डेटाबेस और Cloud Storage जैसी अन्य Firebase सेवाओं को ऐक्सेस करते समय किया जाएगा. इसके अलावा, JWT का कॉन्टेंट आपके रीयलटाइम डेटाबेस के सुरक्षा नियमों में auth
ऑब्जेक्ट में और Cloud Storage सुरक्षा नियमों में request.auth
ऑब्जेक्ट में उपलब्ध रहेगा.
Firebase एडमिन SDK टूल की मदद से, पसंद के मुताबिक टोकन बनाया जा सकता है. इसके अलावा, अगर आपका सर्वर किसी ऐसी भाषा में है जिसमें Firebase मूल रूप से काम नहीं करता, तो तीसरे पक्ष की JWT लाइब्रेरी का इस्तेमाल किया जा सकता है.
शुरू करने से पहले
कस्टम टोकन, साइन किए गए JWT होते हैं. इनमें साइन करने के लिए इस्तेमाल की जाने वाली निजी कुंजी, Google के सेवा खाते से जुड़ी होती है. Google सेवा खाते के बारे में बताने के कई तरीके हैं. Firebase एडमिन SDK, कस्टम टोकन पर हस्ताक्षर करने के लिए इनका इस्तेमाल कर सकता है:
- सेवा खाते की JSON फ़ाइल का इस्तेमाल करना -- इस तरीके का इस्तेमाल किसी भी एनवायरमेंट में किया जा सकता है. हालांकि, आपको अपने कोड के साथ सेवा खाते की JSON फ़ाइल का पैकेज बनाना होगा. इस बात का खास ध्यान रखना चाहिए कि सेवा खाते की JSON फ़ाइल, बाहरी पक्षों को न दिखे.
- एडमिन SDK को सेवा खाता खोजने देना -- इस तरीके का इस्तेमाल Google Cloud के फ़ंक्शन और App Engine जैसे उन एनवायरमेंट में किया जा सकता है जिन्हें Google मैनेज करता है. ऐसा हो सकता है कि आपको Google Cloud Console के ज़रिए, कुछ अतिरिक्त अनुमतियां कॉन्फ़िगर करनी पड़ें.
- सेवा खाता आईडी का इस्तेमाल करना -- जब इसे Google की ओर से मैनेज किए जाने वाले एनवायरमेंट में इस्तेमाल किया जाता है, तब यह तरीका बताए गए सेवा खाते की कुंजी का इस्तेमाल करके, टोकन पर साइन करेगा. हालांकि, यह रिमोट वेब सेवा का इस्तेमाल करती है. इस वजह से, आपको Google Cloud कंसोल के ज़रिए इस सेवा खाते के लिए, अतिरिक्त अनुमतियां कॉन्फ़िगर करनी पड़ सकती हैं.
सेवा खाते की JSON फ़ाइल का इस्तेमाल करना
सेवा खाते की JSON फ़ाइलों में, सेवा खातों से जुड़ी सभी जानकारी होती है. इनमें आरएसए निजी कुंजी भी शामिल है. इन्हें Firebase कंसोल से डाउनलोड किया जा सकता है. सेवा खाते की JSON फ़ाइल का इस्तेमाल करके, एडमिन SDK टूल को शुरू करने के तरीके के बारे में ज़्यादा जानकारी के लिए, एडमिन SDK टूल को सेट अप करने से जुड़े निर्देशों का पालन करें.
शुरू करने का यह तरीका, एडमिन SDK टूल के कई तरह के डिप्लॉयमेंट के लिए सही है. साथ ही, इससे एडमिन SDK टूल को स्थानीय तौर पर कस्टम टोकन बनाने और उन पर साइन करने की सुविधा मिलती है. इसके लिए, किसी रिमोट एपीआई कॉल की ज़रूरत नहीं होती. इस तरीके की सबसे बड़ी कमी यह है कि इसमें आपको अपने कोड के साथ, सेवा खाते की JSON फ़ाइल को पैकेज करना होता है. यह भी ध्यान रखें कि सेवा खाते की JSON फ़ाइल में मौजूद निजी पासकोड, एक संवेदनशील जानकारी होती है. इसे गोपनीय रखने के लिए, खास सावधानी बरतनी चाहिए. खास तौर पर, सेवा खाते की JSON फ़ाइलों को पब्लिक वर्शन कंट्रोल में जोड़ने से बचें.
एडमिन SDK को सेवा खाता खोजने देना
अगर आपके कोड को Google की ओर से मैनेज किए जाने वाले एनवायरमेंट में डिप्लॉय किया जाता है, तो एडमिन SDK कस्टम टोकन पर हस्ताक्षर करने का तरीका अपने-आप खोजने की कोशिश कर सकता है:
अगर आपके कोड को Java, Python या Go के लिए App Engine स्टैंडर्ड एनवायरमेंट में डिप्लॉय किया जाता है, तो एडमिन SDK उस एनवायरमेंट में मौजूद App Identity सेवा का इस्तेमाल करके कस्टम टोकन साइन कर सकता है. ऐप्लिकेशन पहचान सेवा उस सेवा खाते का इस्तेमाल करके डेटा साइन करती है जिसे Google App Engine ने आपके ऐप्लिकेशन के लिए प्रावधान किया है.
अगर आपके कोड को मैनेज किए जा रहे किसी दूसरे प्लैटफ़ॉर्म (जैसे, Google CloudFunctions, Google Compute Engine) में डिप्लॉय किया गया है, तो Firebase एडमिन SDK टूल, स्थानीय मेटाडेटा सर्वर से सेवा खाता आईडी की स्ट्रिंग को अपने-आप खोज सकता है. इसके बाद, खोजे गए सेवा खाता आईडी को IAM सेवा के साथ इस्तेमाल करके, कहीं से भी टोकन पर साइन किया जाता है.
हस्ताक्षर करने के इन तरीकों का इस्तेमाल करने के लिए, SDK टूल को 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 एडमिन SDK को सेवा खाते की आईडी स्ट्रिंग को खोजना है, तो ऐसा तब होता है, जब आपका कोड पहली बार कस्टम टोकन बनाता है. नतीजे को कैश मेमोरी में सेव किया जाता है और टोकन पर हस्ताक्षर करने की बाद की कार्रवाइयों के लिए, इसका फिर से इस्तेमाल किया जाता है. अपने-आप खोजा जाने वाला सेवा खाता आईडी, आम तौर पर Google Cloud से मिलने वाले डिफ़ॉल्ट सेवा खातों में से एक होता है:
खास तौर पर बताए गए सेवा खाता आईडी की तरह ही, अपने-आप खोजे गए सेवा खाता आईडी के पास भी iam.serviceAccounts.signBlob
की अनुमति होनी चाहिए, ताकि कस्टम टोकन काम कर सके. डिफ़ॉल्ट सेवा खातों को ज़रूरी अनुमतियां देने के लिए, आपको Google Cloud Console के आईएएम और एडमिन सेक्शन का इस्तेमाल करना पड़ सकता है. ज़्यादा जानकारी के लिए, समस्या हल करने वाला सेक्शन देखें.
सेवा खाता आईडी का इस्तेमाल करना
अपने ऐप्लिकेशन के अलग-अलग हिस्सों को एक जैसा बनाए रखने के लिए, उस सेवा खाते का आईडी तय किया जा सकता है जिसकी कुंजियों का इस्तेमाल, Google की ओर से मैनेज किए जाने वाले एनवायरमेंट में, टोकन पर हस्ताक्षर करने के लिए किया जाएगा. इससे IAM नीतियों को ज़्यादा आसान और ज़्यादा सुरक्षित बनाया जा सकता है. साथ ही, अपने कोड में सेवा खाते की JSON फ़ाइल शामिल करने की ज़रूरत नहीं पड़ती.
सेवा खाते का आईडी, Google Cloud Console या डाउनलोड किए गए सेवा खाते की 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 एडमिन SDK को रिमोट सेवा शुरू करनी होगी.
इसके अलावा, आपको यह भी पक्का करना होगा कि यह कॉल करने के लिए, एडमिन SDK टूल जिस सेवा खाते का इस्तेमाल कर रहा है वह आम तौर पर {project-name}@appspot.gserviceaccount.com
हो सकता है. इसके लिए, उस खाते के पास iam.serviceAccounts.signBlob
की अनुमति है.
ज़्यादा जानकारी के लिए, समस्या हल करने वाला सेक्शन देखें.
Firebase एडमिन SDK टूल का इस्तेमाल करके कस्टम टोकन बनाएं
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);
});
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()
) की तरह ही, आपके रीयलटाइम डेटाबेस सुरक्षा नियमों में मौजूद auth
ऑब्जेक्ट और Cloud Storage सुरक्षा के नियमों में मौजूद 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 रीयल टाइम डेटाबेस) या 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 एडमिन 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 एडमिन 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 एपीआई चालू नहीं है
अगर आपने साइनिंग टोकन के लिए सेवा खाता आईडी तय किया है, तो आपको इस तरह की गड़बड़ी मिल सकती है:
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 एडमिन SDK, टोकन पर साइन करने के लिए IAM API का इस्तेमाल करता है. इस गड़बड़ी से पता चलता है कि फ़िलहाल आपके Firebase प्रोजेक्ट के लिए IAM API चालू नहीं है. गड़बड़ी के मैसेज में दिए गए लिंक को किसी वेब ब्राउज़र में खोलें और उसे अपने प्रोजेक्ट के लिए चालू करने के लिए, "एपीआई चालू करें" बटन पर क्लिक करें.
सेवा खाते के पास ज़रूरी अनुमतियां नहीं हैं
अगर Firebase एडमिन SDK टूल चलाया जा रहा है और उसके पास iam.serviceAccounts.signBlob
की अनुमति नहीं है, तो आपको गड़बड़ी का इस तरह का मैसेज दिख सकता है:
Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/-/serviceAccounts/{your-service-account-id}.
इसे आसानी से ठीक करने का सबसे आसान तरीका है कि जिस सेवा खाते की शिकायत की गई है उसे "सेवा खाता टोकन क्रिएटर"
आईएएम की भूमिका दें. आम तौर पर, {project-name}@appspot.gserviceaccount.com
:
- Google Cloud Console में आईएएम और एडमिन पेज खोलें.
- अपना प्रोजेक्ट चुनें और "जारी रखें" पर क्लिक करें.
- आपको जिस सेवा खाते को अपडेट करना है उसके आगे दिए गए 'बदलाव करें' आइकॉन पर क्लिक करें.
- "एक और भूमिका जोड़ें" पर क्लिक करें.
- खोज फ़िल्टर में "सेवा खाता टोकन क्रिएटर" टाइप करें और उसे नतीजों में से चुनें.
- भूमिका देने की पुष्टि करने के लिए, "सेव करें" पर क्लिक करें.
इस प्रोसेस के बारे में ज़्यादा जानकारी के लिए, IAM दस्तावेज़ देखें या gcloud कमांड-लाइन टूल का इस्तेमाल करके, भूमिकाएं अपडेट करने का तरीका जानें.
सेवा खाते का पता नहीं लगाया जा सका
अगर आपको नीचे दिया गया गड़बड़ी का कोई मैसेज मिलता है, तो इसका मतलब है कि Firebase एडमिन 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 फ़ाइल या सेवा खाता आईडी की जानकारी ज़रूर दें.