কাস্টম টোকেন তৈরি করুন

Firebase আপনাকে নিরাপদ JSON ওয়েব টোকেন (JWTs) ব্যবহার করে ব্যবহারকারী বা ডিভাইস প্রমাণীকরণ করার অনুমতি দিয়ে প্রমাণীকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। আপনি আপনার সার্ভারে এই টোকেনগুলি তৈরি করেন, সেগুলিকে একটি ক্লায়েন্ট ডিভাইসে ফেরত পাঠান এবং তারপর signInWithCustomToken() পদ্ধতির মাধ্যমে প্রমাণীকরণ করতে ব্যবহার করুন৷

এটি অর্জন করতে, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন শংসাপত্র গ্রহণ করে—যেমন একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড—এবং, শংসাপত্রগুলি বৈধ হলে, একটি কাস্টম JWT প্রদান করে৷ আপনার সার্ভার থেকে ফিরে আসা কাস্টম JWT তারপর Firebase ( iOS+ , Android , web ) এর সাথে প্রমাণীকরণের জন্য একটি ক্লায়েন্ট ডিভাইস ব্যবহার করতে পারে। একবার প্রমাণীকরণ হয়ে গেলে, অন্যান্য ফায়ারবেস পরিষেবা যেমন Firebase Realtime Database এবং Cloud Storage অ্যাক্সেস করার সময় এই পরিচয়টি ব্যবহার করা হবে। অধিকন্তু, JWT-এর বিষয়বস্তুগুলি আপনার Realtime Database Security Rules auth অবজেক্টে এবং আপনার Cloud Storage Security Rules request.auth অবজেক্টে পাওয়া যাবে।

আপনি Firebase অ্যাডমিন SDK-এর সাহায্যে একটি কাস্টম টোকেন তৈরি করতে পারেন, অথবা আপনার সার্ভারটি এমন কোনো ভাষায় লেখা থাকলে আপনি তৃতীয় পক্ষের JWT লাইব্রেরি ব্যবহার করতে পারেন যা Firebase স্থানীয়ভাবে সমর্থন করে না।

আপনি শুরু করার আগে

কাস্টম টোকেনগুলি স্বাক্ষরিত JWT যেখানে স্বাক্ষর করার জন্য ব্যবহৃত ব্যক্তিগত কী একটি Google পরিষেবা অ্যাকাউন্টের অন্তর্গত। কাস্টম টোকেনগুলিতে স্বাক্ষর করার জন্য Firebase অ্যাডমিন SDK-এর দ্বারা Google পরিষেবা অ্যাকাউন্ট নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে:

  • একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করা -- এই পদ্ধতিটি যে কোনও পরিবেশে ব্যবহার করা যেতে পারে, তবে আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে৷ পরিষেবা অ্যাকাউন্ট JSON ফাইল যাতে বহিরাগত দলগুলির সংস্পর্শে না আসে তা নিশ্চিত করার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷
  • অ্যাডমিন SDK-কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া -- এই পদ্ধতিটি Google দ্বারা পরিচালিত পরিবেশে যেমন Google ক্লাউড ফাংশন এবং App Engine ব্যবহার করা যেতে পারে৷ আপনাকে Google Cloud কনসোলের মাধ্যমে কিছু অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।
  • একটি পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা -- যখন একটি Google-পরিচালিত পরিবেশে ব্যবহার করা হয় তখন এই পদ্ধতিটি নির্দিষ্ট পরিষেবা অ্যাকাউন্টের কী ব্যবহার করে টোকেনগুলিতে স্বাক্ষর করবে৷ যাইহোক, এটি একটি দূরবর্তী ওয়েব পরিষেবা ব্যবহার করে, এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতিগুলি কনফিগার করতে হতে পারে৷

একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করে৷

পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিতে পরিষেবা অ্যাকাউন্টগুলির সাথে সম্পর্কিত সমস্ত তথ্য থাকে (RSA ব্যক্তিগত কী সহ)। এগুলি Firebase কনসোল থেকে ডাউনলোড করা যেতে পারে৷ কীভাবে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের মাধ্যমে অ্যাডমিন SDK শুরু করবেন সে সম্পর্কে আরও তথ্যের জন্য অ্যাডমিন SDK সেট আপ নির্দেশাবলী অনুসরণ করুন৷

শুরুর এই পদ্ধতিটি প্রশাসক SDK স্থাপনার বিস্তৃত পরিসরের জন্য উপযুক্ত। এছাড়াও এটি প্রশাসক SDK কে কোনো দূরবর্তী API কল না করে স্থানীয়ভাবে কাস্টম টোকেন তৈরি করতে এবং স্বাক্ষর করতে সক্ষম করে৷ এই পদ্ধতির প্রধান অসুবিধা হল যে এটির জন্য আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে। এছাড়াও মনে রাখবেন যে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের ব্যক্তিগত কীটি সংবেদনশীল তথ্য, এবং এটি গোপনীয় রাখার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷ বিশেষত, পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিকে পাবলিক সংস্করণ নিয়ন্ত্রণে যোগ করা থেকে বিরত থাকুন৷

অ্যাডমিন SDK কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া৷

যদি আপনার কোডটি Google দ্বারা পরিচালিত পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেনগুলিতে স্বাক্ষর করার একটি উপায় স্বয়ংক্রিয়ভাবে আবিষ্কার করার চেষ্টা করতে পারে:

  • যদি আপনার কোড Java, Python বা Go-এর জন্য App Engine স্ট্যান্ডার্ড পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেন সাইন ইন করতে সেই পরিবেশে উপস্থিত অ্যাপ আইডেন্টিটি পরিষেবা ব্যবহার করতে পারে। অ্যাপ আইডেন্টিটি পরিষেবা Google অ্যাপ ইঞ্জিন দ্বারা আপনার অ্যাপের জন্য প্রবিধান করা একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করে ডেটা সাইন করে।

  • যদি আপনার কোড অন্য কোনো পরিচালিত পরিবেশে স্থাপন করা হয় (যেমন Google ক্লাউড ফাংশন, Google Compute Engine), Firebase Admin SDK স্থানীয় মেটাডেটা সার্ভার থেকে একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং স্বয়ংক্রিয়ভাবে আবিষ্কার করতে পারে। আবিষ্কৃত পরিষেবা অ্যাকাউন্ট আইডি তারপর IAM পরিষেবার সাথে টোকেনগুলিকে দূরবর্তীভাবে স্বাক্ষর করতে ব্যবহার করা হয়।

এই সাইনিং পদ্ধতিগুলি ব্যবহার করতে, Google অ্যাপ্লিকেশন ডিফল্ট শংসাপত্রগুলির সাথে SDK শুরু করুন এবং একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:

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 পরিবেশ পরিবর্তনশীল সেট করুন৷

যদি ফায়ারবেস অ্যাডমিন 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 শুরু করুন:

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

পরিষেবা অ্যাকাউন্ট আইডিগুলি সংবেদনশীল তথ্য নয় এবং তাই তাদের এক্সপোজার অপ্রয়োজনীয়৷ যাইহোক, নির্দিষ্ট পরিষেবা অ্যাকাউন্টের সাথে কাস্টম টোকেন সাইন ইন করতে, Firebase অ্যাডমিন SDK-কে অবশ্যই একটি দূরবর্তী পরিষেবা চালু করতে হবে। তাছাড়া, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাডমিন SDK এই কল করার জন্য যে পরিষেবা অ্যাকাউন্টটি ব্যবহার করছে —সাধারণত {project-name}@appspot.gserviceaccount.com —-এর iam.serviceAccounts.signBlob অনুমতি রয়েছে৷ আরও বিশদ বিবরণের জন্য নীচের সমস্যা সমাধান বিভাগটি দেখুন।

Firebase অ্যাডমিন SDK ব্যবহার করে কাস্টম টোকেন তৈরি করুন

Firebase অ্যাডমিন SDK-তে কাস্টম টোকেন তৈরি করার জন্য একটি অন্তর্নির্মিত পদ্ধতি রয়েছে। সর্বনিম্নভাবে, আপনাকে একটি uid প্রদান করতে হবে, যা যেকোনো স্ট্রিং হতে পারে কিন্তু আপনি যে ব্যবহারকারী বা ডিভাইসটিকে প্রমাণীকরণ করছেন সেটিকে অনন্যভাবে সনাক্ত করতে হবে। এই টোকেন এক ঘন্টা পরে মেয়াদ শেষ হয়.

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 অবজেক্টে পাওয়া যাবে:

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() কল করে কাস্টম টোকেন দিয়ে প্রমাণীকরণ করে:

উদ্দেশ্য-C
[[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.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});
firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);
firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });
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 লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন

যদি আপনার ব্যাকএন্ড এমন কোনো ভাষায় হয় যেখানে কোনো অফিসিয়াল ফায়ারবেস অ্যাডমিন SDK নেই, আপনি এখনও ম্যানুয়ালি কাস্টম টোকেন তৈরি করতে পারেন। প্রথমে, আপনার ভাষার জন্য একটি তৃতীয় পক্ষের JWT লাইব্রেরি খুঁজুন । তারপরে, JWT লাইব্রেরি ব্যবহার করে একটি JWT মিন্ট করুন যাতে নিম্নলিখিত দাবিগুলি অন্তর্ভুক্ত থাকে:

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
aud শ্রোতা "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat ইস্যু করা সময়ে বর্তমান সময়, ইউনিক্স যুগের পর থেকে সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, UNIX যুগ থেকে সেকেন্ডে, যে সময়ে টোকেনের মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি শুধুমাত্র সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেনের মেয়াদ শেষ হয়ে যায়। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে কোনো ব্যবহারকারীকে সাইন ইন করলে, তাদের সেশন বাতিল না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
uid সাইন-ইন করা ব্যবহারকারীর অনন্য শনাক্তকারী অবশ্যই একটি স্ট্রিং হতে হবে, 1-128 অক্ষরের মধ্যে লম্বা, অন্তর্ভুক্ত। সংক্ষিপ্ত uid গুলি আরও ভাল কর্মক্ষমতা অফার করে।
claims (ঐচ্ছিক) নিরাপত্তা নিয়ম auth / request.auth ভেরিয়েবলে অন্তর্ভুক্ত করার জন্য ঐচ্ছিক কাস্টম দাবি

Firebase Admin SDK সমর্থন করে না এমন বিভিন্ন ভাষায় কীভাবে কাস্টম টোকেন তৈরি করতে হয় তার কিছু উদাহরণ বাস্তবায়ন এখানে দেওয়া হল:

পিএইচপি রুবি

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

আপনি কাস্টম টোকেন তৈরি করার পরে, 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 অ্যাডমিন SDK টোকেন সাইন করার জন্য IAM API ব্যবহার করে। এই ত্রুটিটি নির্দেশ করে যে IAM API বর্তমানে আপনার Firebase প্রকল্পের জন্য সক্ষম করা নেই। একটি ওয়েব ব্রাউজারে ত্রুটি বার্তার লিঙ্কটি খুলুন এবং আপনার প্রকল্পের জন্য এটি সক্ষম করতে "এপিআই সক্ষম করুন" বোতামে ক্লিক করুন৷

পরিষেবা অ্যাকাউন্টের প্রয়োজনীয় অনুমতি নেই

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 :

  1. Google Cloud কনসোলে IAM এবং অ্যাডমিন পৃষ্ঠা খুলুন।
  2. আপনার প্রকল্প নির্বাচন করুন এবং "চালিয়ে যান" ক্লিক করুন।
  3. আপনি যে পরিষেবা অ্যাকাউন্টটি আপডেট করতে চান তার সাথে সম্পর্কিত সম্পাদনা আইকনে ক্লিক করুন।
  4. "অন্য ভূমিকা যোগ করুন" এ ক্লিক করুন।
  5. সার্চ ফিল্টারে "পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর" টাইপ করুন এবং ফলাফল থেকে এটি নির্বাচন করুন।
  6. ভূমিকা অনুদান নিশ্চিত করতে "সংরক্ষণ করুন" এ ক্লিক করুন৷

এই প্রক্রিয়া সম্পর্কে আরো বিস্তারিত জানার জন্য 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 ফাইল বা পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে ভুলবেন না।

,

Firebase আপনাকে নিরাপদ JSON ওয়েব টোকেন (JWTs) ব্যবহার করে ব্যবহারকারী বা ডিভাইস প্রমাণীকরণ করার অনুমতি দিয়ে প্রমাণীকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। আপনি আপনার সার্ভারে এই টোকেনগুলি তৈরি করেন, সেগুলিকে একটি ক্লায়েন্ট ডিভাইসে ফেরত পাঠান এবং তারপর signInWithCustomToken() পদ্ধতির মাধ্যমে প্রমাণীকরণ করতে ব্যবহার করুন৷

এটি অর্জন করতে, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন শংসাপত্র গ্রহণ করে—যেমন একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড—এবং, শংসাপত্রগুলি বৈধ হলে, একটি কাস্টম JWT প্রদান করে৷ আপনার সার্ভার থেকে ফিরে আসা কাস্টম JWT তারপর Firebase ( iOS+ , Android , web ) এর সাথে প্রমাণীকরণের জন্য একটি ক্লায়েন্ট ডিভাইস ব্যবহার করতে পারে। একবার প্রমাণীকরণ হয়ে গেলে, অন্যান্য ফায়ারবেস পরিষেবা যেমন Firebase Realtime Database এবং Cloud Storage অ্যাক্সেস করার সময় এই পরিচয়টি ব্যবহার করা হবে। অধিকন্তু, JWT-এর বিষয়বস্তুগুলি আপনার Realtime Database Security Rules auth অবজেক্টে এবং আপনার Cloud Storage Security Rules request.auth অবজেক্টে পাওয়া যাবে।

আপনি Firebase অ্যাডমিন SDK-এর সাহায্যে একটি কাস্টম টোকেন তৈরি করতে পারেন, অথবা আপনার সার্ভারটি এমন কোনো ভাষায় লেখা থাকলে আপনি তৃতীয় পক্ষের JWT লাইব্রেরি ব্যবহার করতে পারেন যা Firebase স্থানীয়ভাবে সমর্থন করে না।

আপনি শুরু করার আগে

কাস্টম টোকেনগুলি স্বাক্ষরিত JWT যেখানে স্বাক্ষর করার জন্য ব্যবহৃত ব্যক্তিগত কী একটি Google পরিষেবা অ্যাকাউন্টের অন্তর্গত। কাস্টম টোকেনগুলিতে স্বাক্ষর করার জন্য Firebase অ্যাডমিন SDK-এর দ্বারা Google পরিষেবা অ্যাকাউন্ট নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে:

  • একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করা -- এই পদ্ধতিটি যে কোনও পরিবেশে ব্যবহার করা যেতে পারে, তবে আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে৷ পরিষেবা অ্যাকাউন্ট JSON ফাইল যাতে বহিরাগত দলগুলির সংস্পর্শে না আসে তা নিশ্চিত করার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷
  • অ্যাডমিন SDK-কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া -- এই পদ্ধতিটি Google দ্বারা পরিচালিত পরিবেশে যেমন Google ক্লাউড ফাংশন এবং App Engine ব্যবহার করা যেতে পারে৷ আপনাকে Google Cloud কনসোলের মাধ্যমে কিছু অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।
  • একটি পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা -- যখন একটি Google-পরিচালিত পরিবেশে ব্যবহার করা হয় তখন এই পদ্ধতিটি নির্দিষ্ট পরিষেবা অ্যাকাউন্টের কী ব্যবহার করে টোকেনগুলিতে স্বাক্ষর করবে৷ যাইহোক, এটি একটি দূরবর্তী ওয়েব পরিষেবা ব্যবহার করে, এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতিগুলি কনফিগার করতে হতে পারে৷

একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করে৷

পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিতে পরিষেবা অ্যাকাউন্টগুলির সাথে সম্পর্কিত সমস্ত তথ্য থাকে (RSA ব্যক্তিগত কী সহ)। এগুলি Firebase কনসোল থেকে ডাউনলোড করা যেতে পারে৷ কীভাবে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের মাধ্যমে অ্যাডমিন SDK শুরু করবেন সে সম্পর্কে আরও তথ্যের জন্য অ্যাডমিন SDK সেট আপ নির্দেশাবলী অনুসরণ করুন৷

শুরুর এই পদ্ধতিটি প্রশাসক SDK স্থাপনার বিস্তৃত পরিসরের জন্য উপযুক্ত। এছাড়াও এটি প্রশাসক SDK কে কোনো দূরবর্তী API কল না করে স্থানীয়ভাবে কাস্টম টোকেন তৈরি করতে এবং স্বাক্ষর করতে সক্ষম করে৷ এই পদ্ধতির প্রধান অসুবিধা হল যে এটির জন্য আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে। এছাড়াও মনে রাখবেন যে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের ব্যক্তিগত কীটি সংবেদনশীল তথ্য, এবং এটি গোপনীয় রাখার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷ বিশেষত, পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিকে পাবলিক সংস্করণ নিয়ন্ত্রণে যোগ করা থেকে বিরত থাকুন৷

অ্যাডমিন SDK কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া৷

যদি আপনার কোডটি Google দ্বারা পরিচালিত পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেনগুলিতে স্বাক্ষর করার একটি উপায় স্বয়ংক্রিয়ভাবে আবিষ্কার করার চেষ্টা করতে পারে:

  • যদি আপনার কোড Java, Python বা Go-এর জন্য App Engine স্ট্যান্ডার্ড পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেন সাইন ইন করতে সেই পরিবেশে উপস্থিত অ্যাপ আইডেন্টিটি পরিষেবা ব্যবহার করতে পারে। অ্যাপ আইডেন্টিটি পরিষেবা Google অ্যাপ ইঞ্জিন দ্বারা আপনার অ্যাপের জন্য প্রবিধান করা একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করে ডেটা সাইন করে।

  • যদি আপনার কোড অন্য কোনো পরিচালিত পরিবেশে স্থাপন করা হয় (যেমন Google ক্লাউড ফাংশন, Google Compute Engine), Firebase Admin SDK স্থানীয় মেটাডেটা সার্ভার থেকে একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং স্বয়ংক্রিয়ভাবে আবিষ্কার করতে পারে। আবিষ্কৃত পরিষেবা অ্যাকাউন্ট আইডি তারপর IAM পরিষেবার সাথে টোকেনগুলিকে দূরবর্তীভাবে স্বাক্ষর করতে ব্যবহার করা হয়।

এই সাইনিং পদ্ধতিগুলি ব্যবহার করতে, Google অ্যাপ্লিকেশন ডিফল্ট শংসাপত্রগুলির সাথে SDK শুরু করুন এবং একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:

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 পরিবেশ পরিবর্তনশীল সেট করুন৷

যদি ফায়ারবেস অ্যাডমিন 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 শুরু করুন:

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

পরিষেবা অ্যাকাউন্ট আইডিগুলি সংবেদনশীল তথ্য নয় এবং তাই তাদের এক্সপোজার অপ্রয়োজনীয়৷ যাইহোক, নির্দিষ্ট পরিষেবা অ্যাকাউন্টের সাথে কাস্টম টোকেন সাইন ইন করতে, Firebase অ্যাডমিন SDK-কে অবশ্যই একটি দূরবর্তী পরিষেবা চালু করতে হবে। তাছাড়া, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাডমিন SDK এই কল করার জন্য যে পরিষেবা অ্যাকাউন্টটি ব্যবহার করছে —সাধারণত {project-name}@appspot.gserviceaccount.com —-এর iam.serviceAccounts.signBlob অনুমতি রয়েছে৷ আরও বিশদ বিবরণের জন্য নীচের সমস্যা সমাধান বিভাগটি দেখুন।

Firebase অ্যাডমিন SDK ব্যবহার করে কাস্টম টোকেন তৈরি করুন

Firebase অ্যাডমিন SDK-তে কাস্টম টোকেন তৈরি করার জন্য একটি অন্তর্নির্মিত পদ্ধতি রয়েছে। সর্বনিম্নভাবে, আপনাকে একটি uid প্রদান করতে হবে, যা যেকোনো স্ট্রিং হতে পারে কিন্তু আপনি যে ব্যবহারকারী বা ডিভাইসটিকে প্রমাণীকরণ করছেন সেটিকে অনন্যভাবে সনাক্ত করতে হবে। এই টোকেন এক ঘন্টা পরে মেয়াদ শেষ হয়.

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 অবজেক্টে পাওয়া যাবে:

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() কল করে কাস্টম টোকেন দিয়ে প্রমাণীকরণ করে:

উদ্দেশ্য-C
[[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.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});
firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);
firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });
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 লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন

যদি আপনার ব্যাকএন্ড এমন কোনো ভাষায় হয় যেখানে কোনো অফিসিয়াল ফায়ারবেস অ্যাডমিন SDK নেই, আপনি এখনও ম্যানুয়ালি কাস্টম টোকেন তৈরি করতে পারেন। প্রথমে, আপনার ভাষার জন্য একটি তৃতীয় পক্ষের JWT লাইব্রেরি খুঁজুন । তারপরে, JWT লাইব্রেরি ব্যবহার করে একটি JWT মিন্ট করুন যাতে নিম্নলিখিত দাবিগুলি অন্তর্ভুক্ত থাকে:

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
aud শ্রোতা "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat ইস্যু করা সময়ে বর্তমান সময়, ইউনিক্স যুগের পর থেকে সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, UNIX যুগ থেকে সেকেন্ডে, যে সময়ে টোকেনের মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি শুধুমাত্র সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেনের মেয়াদ শেষ হয়ে যায়। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে কোনো ব্যবহারকারীকে সাইন ইন করলে, তাদের সেশন বাতিল না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
uid সাইন-ইন করা ব্যবহারকারীর অনন্য শনাক্তকারী অবশ্যই একটি স্ট্রিং হতে হবে, 1-128 অক্ষরের মধ্যে লম্বা, অন্তর্ভুক্ত। সংক্ষিপ্ত uid গুলি আরও ভাল কর্মক্ষমতা অফার করে।
claims (ঐচ্ছিক) নিরাপত্তা নিয়ম auth / request.auth ভেরিয়েবলে অন্তর্ভুক্ত করার জন্য ঐচ্ছিক কাস্টম দাবি

Firebase Admin SDK সমর্থন করে না এমন বিভিন্ন ভাষায় কীভাবে কাস্টম টোকেন তৈরি করতে হয় তার কিছু উদাহরণ বাস্তবায়ন এখানে দেওয়া হল:

পিএইচপি রুবি

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

আপনি কাস্টম টোকেন তৈরি করার পরে, 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 অ্যাডমিন SDK টোকেন সাইন করার জন্য IAM API ব্যবহার করে। এই ত্রুটিটি নির্দেশ করে যে IAM API বর্তমানে আপনার Firebase প্রকল্পের জন্য সক্ষম করা নেই। একটি ওয়েব ব্রাউজারে ত্রুটি বার্তার লিঙ্কটি খুলুন এবং আপনার প্রকল্পের জন্য এটি সক্ষম করতে "এপিআই সক্ষম করুন" বোতামে ক্লিক করুন৷

পরিষেবা অ্যাকাউন্টের প্রয়োজনীয় অনুমতি নেই

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 :

  1. Google Cloud কনসোলে IAM এবং অ্যাডমিন পৃষ্ঠা খুলুন।
  2. আপনার প্রকল্প নির্বাচন করুন এবং "চালিয়ে যান" ক্লিক করুন।
  3. আপনি যে পরিষেবা অ্যাকাউন্টটি আপডেট করতে চান তার সাথে সম্পর্কিত সম্পাদনা আইকনে ক্লিক করুন।
  4. "অন্য ভূমিকা যোগ করুন" এ ক্লিক করুন।
  5. সার্চ ফিল্টারে "পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর" টাইপ করুন এবং ফলাফল থেকে এটি নির্বাচন করুন।
  6. ভূমিকা অনুদান নিশ্চিত করতে "সংরক্ষণ করুন" এ ক্লিক করুন৷

এই প্রক্রিয়া সম্পর্কে আরো বিস্তারিত জানার জন্য 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 ফাইল বা পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে ভুলবেন না।

,

Firebase আপনাকে নিরাপদ JSON ওয়েব টোকেন (JWTs) ব্যবহার করে ব্যবহারকারী বা ডিভাইস প্রমাণীকরণ করার অনুমতি দিয়ে প্রমাণীকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। আপনি আপনার সার্ভারে এই টোকেনগুলি তৈরি করেন, সেগুলিকে একটি ক্লায়েন্ট ডিভাইসে ফেরত পাঠান এবং তারপর signInWithCustomToken() পদ্ধতির মাধ্যমে প্রমাণীকরণ করতে ব্যবহার করুন৷

এটি অর্জন করতে, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন শংসাপত্র গ্রহণ করে—যেমন একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড—এবং, শংসাপত্রগুলি বৈধ হলে, একটি কাস্টম JWT প্রদান করে৷ আপনার সার্ভার থেকে ফিরে আসা কাস্টম JWT তারপর Firebase ( iOS+ , Android , web ) এর সাথে প্রমাণীকরণের জন্য একটি ক্লায়েন্ট ডিভাইস ব্যবহার করতে পারে। একবার প্রমাণীকরণ হয়ে গেলে, অন্যান্য ফায়ারবেস পরিষেবা যেমন Firebase Realtime Database এবং Cloud Storage অ্যাক্সেস করার সময় এই পরিচয়টি ব্যবহার করা হবে। অধিকন্তু, JWT-এর বিষয়বস্তুগুলি আপনার Realtime Database Security Rules auth অবজেক্টে এবং আপনার Cloud Storage Security Rules request.auth অবজেক্টে পাওয়া যাবে।

আপনি Firebase অ্যাডমিন SDK-এর সাহায্যে একটি কাস্টম টোকেন তৈরি করতে পারেন, অথবা আপনার সার্ভারটি এমন কোনো ভাষায় লেখা থাকলে আপনি তৃতীয় পক্ষের JWT লাইব্রেরি ব্যবহার করতে পারেন যা Firebase স্থানীয়ভাবে সমর্থন করে না।

আপনি শুরু করার আগে

কাস্টম টোকেনগুলি স্বাক্ষরিত JWT যেখানে স্বাক্ষর করার জন্য ব্যবহৃত ব্যক্তিগত কী একটি Google পরিষেবা অ্যাকাউন্টের অন্তর্গত। কাস্টম টোকেনগুলিতে স্বাক্ষর করার জন্য Firebase অ্যাডমিন SDK-এর দ্বারা Google পরিষেবা অ্যাকাউন্ট নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে:

  • একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করা -- এই পদ্ধতিটি যে কোনও পরিবেশে ব্যবহার করা যেতে পারে, তবে আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে৷ পরিষেবা অ্যাকাউন্ট JSON ফাইল যাতে বহিরাগত দলগুলির সংস্পর্শে না আসে তা নিশ্চিত করার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷
  • অ্যাডমিন SDK-কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া -- এই পদ্ধতিটি Google দ্বারা পরিচালিত পরিবেশে যেমন Google ক্লাউড ফাংশন এবং App Engine ব্যবহার করা যেতে পারে৷ আপনাকে Google Cloud কনসোলের মাধ্যমে কিছু অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।
  • একটি পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা -- যখন একটি Google-পরিচালিত পরিবেশে ব্যবহার করা হয় তখন এই পদ্ধতিটি নির্দিষ্ট পরিষেবা অ্যাকাউন্টের কী ব্যবহার করে টোকেনগুলিতে স্বাক্ষর করবে৷ যাইহোক, এটি একটি দূরবর্তী ওয়েব পরিষেবা ব্যবহার করে, এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতিগুলি কনফিগার করতে হতে পারে৷

একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করে৷

পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিতে পরিষেবা অ্যাকাউন্টগুলির সাথে সম্পর্কিত সমস্ত তথ্য থাকে (RSA ব্যক্তিগত কী সহ)। এগুলি Firebase কনসোল থেকে ডাউনলোড করা যেতে পারে৷ কীভাবে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের মাধ্যমে অ্যাডমিন SDK শুরু করবেন সে সম্পর্কে আরও তথ্যের জন্য অ্যাডমিন SDK সেট আপ নির্দেশাবলী অনুসরণ করুন৷

শুরুর এই পদ্ধতিটি প্রশাসক SDK স্থাপনার বিস্তৃত পরিসরের জন্য উপযুক্ত। এছাড়াও এটি প্রশাসক SDK কে কোনো দূরবর্তী API কল না করে স্থানীয়ভাবে কাস্টম টোকেন তৈরি করতে এবং স্বাক্ষর করতে সক্ষম করে৷ এই পদ্ধতির প্রধান অসুবিধা হল যে এটির জন্য আপনাকে আপনার কোড সহ একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে। এছাড়াও মনে রাখবেন যে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইলের ব্যক্তিগত কীটি সংবেদনশীল তথ্য, এবং এটি গোপনীয় রাখার জন্য বিশেষ যত্ন নেওয়া আবশ্যক৷ বিশেষত, পরিষেবা অ্যাকাউন্ট JSON ফাইলগুলিকে পাবলিক সংস্করণ নিয়ন্ত্রণে যোগ করা থেকে বিরত থাকুন৷

অ্যাডমিন SDK কে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া৷

যদি আপনার কোডটি Google দ্বারা পরিচালিত পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেনগুলিতে স্বাক্ষর করার একটি উপায় স্বয়ংক্রিয়ভাবে আবিষ্কার করার চেষ্টা করতে পারে:

  • যদি আপনার কোড Java, Python বা Go-এর জন্য App Engine স্ট্যান্ডার্ড পরিবেশে স্থাপন করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেন সাইন ইন করতে সেই পরিবেশে উপস্থিত অ্যাপ আইডেন্টিটি পরিষেবা ব্যবহার করতে পারে। অ্যাপ আইডেন্টিটি পরিষেবা Google অ্যাপ ইঞ্জিন দ্বারা আপনার অ্যাপের জন্য প্রবিধান করা একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করে ডেটা সাইন করে।

  • যদি আপনার কোড অন্য কোনো পরিচালিত পরিবেশে স্থাপন করা হয় (যেমন Google ক্লাউড ফাংশন, Google Compute Engine), Firebase Admin SDK স্থানীয় মেটাডেটা সার্ভার থেকে একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং স্বয়ংক্রিয়ভাবে আবিষ্কার করতে পারে। আবিষ্কৃত পরিষেবা অ্যাকাউন্ট আইডি তারপর IAM পরিষেবার সাথে টোকেনগুলিকে দূরবর্তীভাবে স্বাক্ষর করতে ব্যবহার করা হয়।

এই সাইনিং পদ্ধতিগুলি ব্যবহার করতে, Google অ্যাপ্লিকেশন ডিফল্ট শংসাপত্রগুলির সাথে SDK শুরু করুন এবং একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:

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 পরিবেশ পরিবর্তনশীল সেট করুন৷

যদি ফায়ারবেস অ্যাডমিন 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 শুরু করুন:

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

পরিষেবা অ্যাকাউন্ট আইডিগুলি সংবেদনশীল তথ্য নয় এবং তাই তাদের এক্সপোজার অপ্রয়োজনীয়৷ যাইহোক, নির্দিষ্ট পরিষেবা অ্যাকাউন্টের সাথে কাস্টম টোকেন সাইন ইন করতে, Firebase অ্যাডমিন SDK-কে অবশ্যই একটি দূরবর্তী পরিষেবা চালু করতে হবে। তাছাড়া, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাডমিন SDK এই কল করার জন্য যে পরিষেবা অ্যাকাউন্টটি ব্যবহার করছে —সাধারণত {project-name}@appspot.gserviceaccount.com —-এর iam.serviceAccounts.signBlob অনুমতি রয়েছে৷ আরও বিশদ বিবরণের জন্য নীচের সমস্যা সমাধান বিভাগটি দেখুন।

Firebase অ্যাডমিন SDK ব্যবহার করে কাস্টম টোকেন তৈরি করুন

Firebase অ্যাডমিন SDK-তে কাস্টম টোকেন তৈরি করার জন্য একটি অন্তর্নির্মিত পদ্ধতি রয়েছে। সর্বনিম্নভাবে, আপনাকে একটি uid প্রদান করতে হবে, যা যেকোনো স্ট্রিং হতে পারে কিন্তু আপনি যে ব্যবহারকারী বা ডিভাইসটিকে প্রমাণীকরণ করছেন সেটিকে অনন্যভাবে সনাক্ত করতে হবে। এই টোকেন এক ঘন্টা পরে মেয়াদ শেষ হয়.

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 অবজেক্টে পাওয়া যাবে:

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() কল করে কাস্টম টোকেন দিয়ে প্রমাণীকরণ করে:

উদ্দেশ্য-C
[[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.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});
firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);
firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });
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 লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন

যদি আপনার ব্যাকএন্ডটি এমন কোনও ভাষায় থাকে যা অফিসিয়াল ফায়ারবেস অ্যাডমিন এসডিকে না থাকে তবে আপনি এখনও ম্যানুয়ালি কাস্টম টোকেন তৈরি করতে পারেন। প্রথমে আপনার ভাষার জন্য একটি তৃতীয় পক্ষের জেডাব্লুটি লাইব্রেরি সন্ধান করুন । তারপরে, জেডব্লিউটি লাইব্রেরিটি ব্যবহার করুন একটি জেডাব্লুটিকে পুদিনা করতে যা নিম্নলিখিত দাবিগুলি অন্তর্ভুক্ত করে:

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
aud শ্রোতা "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat জারি-সময় বর্তমান সময়, ইউনিক্স যুগের পরে কয়েক সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, ইউনিক্স যুগের পরে কয়েক সেকেন্ডের মধ্যে, যেখানে টোকেনের মেয়াদ শেষ হয়। এটি iat চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি কেবল সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেন নিজেই মেয়াদ শেষ হয়। তবে একবার আপনি কোনও ব্যবহারকারীকে signInWithCustomToken() ব্যবহার করতে স্বাক্ষর করলে তারা তাদের সেশনটি অবৈধ না হওয়া বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
uid স্বাক্ষরিত-ইন ব্যবহারকারীর অনন্য শনাক্তকারী অবশ্যই একটি স্ট্রিং হতে হবে, 1-128 অক্ষর দীর্ঘ, অন্তর্ভুক্ত। সংক্ষিপ্ত uid আরও ভাল পারফরম্যান্স অফার।
claims (al চ্ছিক) Security চ্ছিক কাস্টম দাবিগুলি সুরক্ষা বিধিগুলি অন্তর্ভুক্ত করার জন্য 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.

ফায়ারবেস অ্যাডমিন এসডিকে টোকেনগুলিতে সাইন করতে আইএএম এপিআই ব্যবহার করে। এই ত্রুটিটি ইঙ্গিত দেয় যে আইএএম এপিআই বর্তমানে আপনার ফায়ারবেস প্রকল্পের জন্য সক্ষম নয়। একটি ওয়েব ব্রাউজারে ত্রুটি বার্তায় লিঙ্কটি খুলুন এবং আপনার প্রকল্পের জন্য এটি সক্ষম করতে "এপিআই সক্ষম করুন" বোতামটি ক্লিক করুন।

পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় অনুমতি নেই

যদি সার্ভিস অ্যাকাউন্টটি ফায়ারবেস অ্যাডমিন এসডিকে চলছে যেমন 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 :

  1. Google Cloud কনসোলে আইএএম এবং অ্যাডমিন পৃষ্ঠা খুলুন।
  2. আপনার প্রকল্পটি নির্বাচন করুন এবং "চালিয়ে যান" ক্লিক করুন।
  3. আপনি আপডেট করতে চান পরিষেবা অ্যাকাউন্টের সাথে সম্পর্কিত সম্পাদনা আইকনটি ক্লিক করুন।
  4. "অন্য ভূমিকা যুক্ত করুন" এ ক্লিক করুন।
  5. অনুসন্ধান ফিল্টারটিতে "পরিষেবা অ্যাকাউন্ট টোকেন স্রষ্টা" টাইপ করুন এবং ফলাফলগুলি থেকে এটি নির্বাচন করুন।
  6. ভূমিকা অনুদান নিশ্চিত করতে "সংরক্ষণ করুন" ক্লিক করুন।

এই প্রক্রিয়া সম্পর্কে আরও তথ্যের জন্য আইএএম ডকুমেন্টেশন দেখুন, বা জিসিএলউড কমান্ড-লাইন সরঞ্জামগুলি ব্যবহার করে কীভাবে আপডেট ভূমিকাগুলি করবেন তা শিখুন।

পরিষেবা অ্যাকাউন্ট নির্ধারণ করতে ব্যর্থ

আপনি যদি নিম্নলিখিতগুলির মতো কোনও ত্রুটি বার্তা পান তবে ফায়ারবেস অ্যাডমিন এসডিকে সঠিকভাবে আরম্ভ করা হয়নি।

Failed to determine service account ID. Initialize the SDK with service account
credentials or specify a service account ID with iam.serviceAccounts.signBlob
permission.

আপনি যদি কোনও পরিষেবা অ্যাকাউন্ট আইডি অটো-আবিষ্কার করতে এসডিকে-র উপর নির্ভর করে থাকেন তবে নিশ্চিত করুন যে কোডটি একটি মেটাডেটা সার্ভারের সাথে পরিচালিত গুগল পরিবেশে মোতায়েন করা হয়েছে। অন্যথায়, এসডিকে সূচনায় পরিষেবা অ্যাকাউন্ট জেএসএন ফাইল বা পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে ভুলবেন না।

,

ফায়ারবেস আপনাকে সিকিউর জেএসএন ওয়েব টোকেন (জেডব্লিউটিএস) ব্যবহার করে ব্যবহারকারী বা ডিভাইসগুলিকে প্রমাণীকরণ করার অনুমতি দিয়ে প্রমাণীকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। আপনি আপনার সার্ভারে এই টোকেনগুলি তৈরি করেন, এগুলি কোনও ক্লায়েন্ট ডিভাইসে ফেরত দিন এবং তারপরে সেগুলি signInWithCustomToken() পদ্ধতির মাধ্যমে প্রমাণীকরণের জন্য ব্যবহার করুন।

এটি অর্জনের জন্য, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন শংসাপত্রগুলি গ্রহণ করে-যেমন ব্যবহারকারীর নাম এবং পাসওয়ার্ড-এবং যদি শংসাপত্রগুলি বৈধ হয় তবে একটি কাস্টম জেডব্লিউটি প্রদান করে। আপনার সার্ভার থেকে ফিরে আসা কাস্টম জেডাব্লুটিটি কোনও ক্লায়েন্ট ডিভাইস দ্বারা ফায়ারবেস ( আইওএস+ , অ্যান্ড্রয়েড , ওয়েব ) দিয়ে প্রমাণীকরণের জন্য ব্যবহার করা যেতে পারে। একবার প্রমাণিত হয়ে গেলে, অন্যান্য ফায়ারবেস পরিষেবাগুলি যেমন Firebase Realtime Database এবং Cloud Storage অ্যাক্সেস করার সময় এই পরিচয়টি ব্যবহার করা হবে। তদ্ব্যতীত, জেডাব্লুটিটির বিষয়বস্তুগুলি আপনার Realtime Database Security Rules এবং request.auth . আপনার Cloud Storage Security Rules auth অবজেক্টে উপলব্ধ থাকবে।

আপনি ফায়ারবেস অ্যাডমিন এসডিকে দিয়ে একটি কাস্টম টোকেন তৈরি করতে পারেন, বা যদি আপনার সার্ভারটি এমন কোনও ভাষায় লেখা হয় যা ফায়ারবেস স্থানীয়ভাবে সমর্থন করে না তবে আপনি তৃতীয় পক্ষের জেডাব্লুটি লাইব্রেরি ব্যবহার করতে পারেন।

আপনি শুরু করার আগে

কাস্টম টোকেনগুলি স্বাক্ষরিত জেডব্লিউটিএস যেখানে স্বাক্ষর করার জন্য ব্যবহৃত প্রাইভেট কীটি একটি গুগল পরিষেবা অ্যাকাউন্টের অন্তর্গত। গুগল পরিষেবা অ্যাকাউন্ট নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে যা কাস্টম টোকেন স্বাক্ষর করার জন্য ফায়ারবেস অ্যাডমিন এসডিকে ব্যবহার করা উচিত:

  • একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করে - এই পদ্ধতিটি যে কোনও পরিবেশে ব্যবহার করা যেতে পারে তবে আপনার কোড সহ কোনও পরিষেবা অ্যাকাউন্ট জেএসএন ফাইল প্যাকেজ করা প্রয়োজন। সার্ভিস অ্যাকাউন্ট জেএসএন ফাইলটি বাহ্যিক দলগুলির কাছে প্রকাশিত না হয় তা নিশ্চিত করার জন্য বিশেষ যত্ন নিতে হবে।
  • অ্যাডমিন এসডিকে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া - গুগল ক্লাউড ফাংশন এবং App Engine মতো গুগল দ্বারা পরিচালিত পরিবেশে এই পদ্ধতিটি ব্যবহার করা যেতে পারে। Google Cloud কনসোলের মাধ্যমে আপনাকে কিছু অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।
  • কোনও পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করে -যখন গুগল-ম্যানেজড পরিবেশে ব্যবহৃত হয় তখন এই পদ্ধতিটি নির্দিষ্ট পরিষেবা অ্যাকাউন্টের কীটি ব্যবহার করে টোকেনগুলিতে সাইন করবে। তবে এটি একটি দূরবর্তী ওয়েব পরিষেবা ব্যবহার করে এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতিগুলি কনফিগার করতে হতে পারে।

একটি পরিষেবা অ্যাকাউন্ট json ফাইল ব্যবহার করে

পরিষেবা অ্যাকাউন্ট জেএসএন ফাইলগুলিতে পরিষেবা অ্যাকাউন্টগুলির সাথে সম্পর্কিত সমস্ত তথ্য রয়েছে (আরএসএ প্রাইভেট কী সহ)। এগুলি Firebase কনসোল থেকে ডাউনলোড করা যায়। অ্যাডমিন এসডিকে কীভাবে কোনও পরিষেবা অ্যাকাউন্ট জেএসএন ফাইল দিয়ে অ্যাডমিন এসডিকে আরম্ভ করতে হয় সে সম্পর্কে আরও তথ্যের জন্য অ্যাডমিন এসডিকে সেট আপ নির্দেশাবলী অনুসরণ করুন।

আরম্ভের এই পদ্ধতিটি অ্যাডমিন এসডিকে মোতায়েনের বিস্তৃত পরিসরের জন্য উপযুক্ত। এছাড়াও এটি কোনও দূরবর্তী এপিআই কল না করে স্থানীয়ভাবে কাস্টম টোকেন তৈরি এবং সাইন করতে অ্যাডমিন এসডিকে সক্ষম করে। এই পদ্ধতির মূল অপূর্ণতা হ'ল এটি আপনার কোড সহ কোনও পরিষেবা অ্যাকাউন্ট জেএসএন ফাইল প্যাকেজ করা প্রয়োজন। এছাড়াও নোট করুন যে কোনও পরিষেবা অ্যাকাউন্ট জেএসএন ফাইলের ব্যক্তিগত কী সংবেদনশীল তথ্য এবং এটি গোপনীয় রাখার জন্য বিশেষ যত্ন নেওয়া উচিত। বিশেষত, পাবলিক সংস্করণ নিয়ন্ত্রণে পরিষেবা অ্যাকাউন্ট জেএসএন ফাইলগুলি যুক্ত করা থেকে বিরত থাকুন।

অ্যাডমিন এসডিকে একটি পরিষেবা অ্যাকাউন্ট আবিষ্কার করতে দেওয়া

যদি আপনার কোডটি গুগল দ্বারা পরিচালিত পরিবেশে মোতায়েন করা হয় তবে অ্যাডমিন এসডিকে কাস্টম টোকেনগুলিতে স্বাক্ষর করার উপায়কে স্বয়ংক্রিয়ভাবে আবিষ্কার করার চেষ্টা করতে পারে:

  • যদি আপনার কোডটি জাভা, পাইথন বা জিও এর জন্য App Engine স্ট্যান্ডার্ড পরিবেশে মোতায়েন করা হয় তবে অ্যাডমিন এসডিকে কাস্টম টোকেনগুলিতে স্বাক্ষর করতে সেই পরিবেশে উপস্থিত অ্যাপ পরিচয় পরিষেবাটি ব্যবহার করতে পারে। অ্যাপ্লিকেশন পরিচয় পরিষেবা গুগল অ্যাপ ইঞ্জিন দ্বারা আপনার অ্যাপের জন্য বিধানের জন্য একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করে ডেটা স্বাক্ষর করে।

  • যদি আপনার কোডটি অন্য কোনও পরিচালিত পরিবেশে মোতায়েন করা হয় (যেমন গুগল ক্লাউড ফাংশন, গুগল কমপুট ইঞ্জিন), ফায়ারবেস অ্যাডমিন এসডিকে স্থানীয় মেটাডেটা সার্ভার থেকে কোনও পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিংটি স্বয়ংক্রিয়ভাবে আবিষ্কার করতে পারে। আবিষ্কার করা পরিষেবা অ্যাকাউন্ট আইডিটি তখন আইএএম পরিষেবার সাথে মিলে টোকেনগুলি দূর থেকে সাইন ইন করতে ব্যবহৃত হয়।

এই স্বাক্ষর পদ্ধতিগুলি ব্যবহার করতে, গুগল অ্যাপ্লিকেশন ডিফল্ট শংসাপত্রগুলির সাথে এসডিকে আরম্ভ করুন এবং কোনও পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:

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 Cloud দ্বারা সরবরাহিত ডিফল্ট পরিষেবা অ্যাকাউন্টগুলির মধ্যে একটি:

সুস্পষ্টভাবে নির্দিষ্ট পরিষেবা অ্যাকাউন্ট আইডিগুলির মতোই, অটো-ডিসকভার্ড সার্ভিস অ্যাকাউন্ট আইডিগুলির অবশ্যই iam.serviceAccounts.signBlob অনুমতিটি কাস্টম টোকেন সৃষ্টির কাজ করার জন্য অবশ্যই থাকতে হবে। ডিফল্ট পরিষেবা অ্যাকাউন্টগুলিকে প্রয়োজনীয় অনুমতি দেওয়ার জন্য আপনাকে Google Cloud কনসোলের আইএএম এবং অ্যাডমিন বিভাগটি ব্যবহার করতে হতে পারে। আরও তথ্যের জন্য নীচের সমস্যা সমাধানের বিভাগটি দেখুন।

একটি পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করে

আপনার অ্যাপ্লিকেশনটির বিভিন্ন অংশের মধ্যে ধারাবাহিকতা বজায় রাখতে, আপনি এমন একটি পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে পারেন যার কীগুলি গুগল-পরিচালিত পরিবেশে চলাকালীন টোকেনগুলিতে সাইন ইন করতে ব্যবহৃত হবে। এটি আইএএম নীতিগুলি আরও সহজ এবং আরও সুরক্ষিত করতে পারে এবং আপনার কোডে পরিষেবা অ্যাকাউন্ট জেএসএন ফাইলটি অন্তর্ভুক্ত করা এড়াতে পারে।

পরিষেবা অ্যাকাউন্ট আইডি Google Cloud কনসোলে বা ডাউনলোড করা পরিষেবা অ্যাকাউন্ট জেএসএন ফাইলের client_email ক্ষেত্রে পাওয়া যাবে। সার্ভিস অ্যাকাউন্ট আইডিগুলি হ'ল ইমেল ঠিকানা যা নিম্নলিখিত ফর্ম্যাট রয়েছে: <client-id>@<project-id>.iam.gserviceaccount.com । তারা ফায়ারবেস এবং Google Cloud প্রকল্পগুলিতে পরিষেবা অ্যাকাউন্টগুলি অনন্যভাবে সনাক্ত করে।

একটি পৃথক পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করে কাস্টম টোকেন তৈরি করতে, নীচের মতো দেখানো এসডিকে আরম্ভ করুন:

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

পরিষেবা অ্যাকাউন্ট আইডিগুলি সংবেদনশীল তথ্য নয় এবং তাই তাদের এক্সপোজারটি অনিবার্য। তবে, নির্দিষ্ট পরিষেবা অ্যাকাউন্টের সাথে কাস্টম টোকেনগুলিতে স্বাক্ষর করতে, ফায়ারবেস অ্যাডমিন এসডিকে অবশ্যই একটি দূরবর্তী পরিষেবা প্রার্থনা করতে হবে। তদুপরি, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাডমিন এসডিকে এই কলটি এই কলটি ব্যবহার করার জন্য যে পরিষেবা অ্যাকাউন্টটি ব্যবহার করছে {সাধারণভাবে {project-name}@appspot.gserviceaccount.com এর iam.serviceAccounts.signBlob অনুমতি রয়েছে। আরও তথ্যের জন্য নীচের সমস্যা সমাধানের বিভাগটি দেখুন।

ফায়ারবেস অ্যাডমিন এসডিকে ব্যবহার করে কাস্টম টোকেন তৈরি করুন

ফায়ারবেস অ্যাডমিন এসডিকে কাস্টম টোকেন তৈরির জন্য একটি অন্তর্নির্মিত পদ্ধতি রয়েছে। সর্বনিম্ন, আপনাকে একটি uid সরবরাহ করতে হবে, যা কোনও স্ট্রিং হতে পারে তবে আপনি যে ব্যবহারকারী বা ডিভাইসটি প্রমাণীকরণ করছেন তা অনন্যভাবে সনাক্ত করা উচিত। এই টোকেনগুলি এক ঘন্টা পরে শেষ হয়।

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 উপলব্ধ হবে uth

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() কল করে কাস্টম টোকেন দিয়ে প্রমাণীকরণ করে:

উদ্দেশ্য-C
[[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.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});
firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);
firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });
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 এবং request.auth auth অবজেক্ট এবং আপনার Cloud Storage Security Rules মধ্যে একটি অবজেক্ট ব্যবহারকারীর 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;
    }
  }
}

তৃতীয় পক্ষের জেডাব্লুটি লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন

যদি আপনার ব্যাকএন্ডটি এমন কোনও ভাষায় থাকে যা অফিসিয়াল ফায়ারবেস অ্যাডমিন এসডিকে না থাকে তবে আপনি এখনও ম্যানুয়ালি কাস্টম টোকেন তৈরি করতে পারেন। প্রথমে আপনার ভাষার জন্য একটি তৃতীয় পক্ষের জেডাব্লুটি লাইব্রেরি সন্ধান করুন । তারপরে, জেডব্লিউটি লাইব্রেরিটি ব্যবহার করুন একটি জেডাব্লুটিকে পুদিনা করতে যা নিম্নলিখিত দাবিগুলি অন্তর্ভুক্ত করে:

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
aud শ্রোতা "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat জারি-সময় বর্তমান সময়, ইউনিক্স যুগের পরে কয়েক সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, ইউনিক্স যুগের পরে কয়েক সেকেন্ডের মধ্যে, যেখানে টোকেনের মেয়াদ শেষ হয়। এটি iat চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি কেবল সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেন নিজেই মেয়াদ শেষ হয়। তবে একবার আপনি কোনও ব্যবহারকারীকে signInWithCustomToken() ব্যবহার করতে স্বাক্ষর করলে তারা তাদের সেশনটি অবৈধ না হওয়া বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
uid স্বাক্ষরিত-ইন ব্যবহারকারীর অনন্য শনাক্তকারী অবশ্যই একটি স্ট্রিং হতে হবে, 1-128 অক্ষর দীর্ঘ, অন্তর্ভুক্ত। সংক্ষিপ্ত uid আরও ভাল পারফরম্যান্স অফার।
claims (al চ্ছিক) Security চ্ছিক কাস্টম দাবিগুলি সুরক্ষা বিধিগুলি অন্তর্ভুক্ত করার জন্য 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.

ফায়ারবেস অ্যাডমিন এসডিকে টোকেনগুলিতে সাইন করতে আইএএম এপিআই ব্যবহার করে। এই ত্রুটিটি ইঙ্গিত দেয় যে আইএএম এপিআই বর্তমানে আপনার ফায়ারবেস প্রকল্পের জন্য সক্ষম নয়। একটি ওয়েব ব্রাউজারে ত্রুটি বার্তায় লিঙ্কটি খুলুন এবং আপনার প্রকল্পের জন্য এটি সক্ষম করতে "এপিআই সক্ষম করুন" বোতামটি ক্লিক করুন।

পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় অনুমতি নেই

যদি সার্ভিস অ্যাকাউন্টটি ফায়ারবেস অ্যাডমিন এসডিকে চলছে যেমন 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 :

  1. Google Cloud কনসোলে আইএএম এবং অ্যাডমিন পৃষ্ঠা খুলুন।
  2. আপনার প্রকল্পটি নির্বাচন করুন এবং "চালিয়ে যান" ক্লিক করুন।
  3. আপনি আপডেট করতে চান পরিষেবা অ্যাকাউন্টের সাথে সম্পর্কিত সম্পাদনা আইকনটি ক্লিক করুন।
  4. "অন্য ভূমিকা যুক্ত করুন" এ ক্লিক করুন।
  5. অনুসন্ধান ফিল্টারটিতে "পরিষেবা অ্যাকাউন্ট টোকেন স্রষ্টা" টাইপ করুন এবং ফলাফলগুলি থেকে এটি নির্বাচন করুন।
  6. ভূমিকা অনুদান নিশ্চিত করতে "সংরক্ষণ করুন" ক্লিক করুন।

এই প্রক্রিয়া সম্পর্কে আরও তথ্যের জন্য আইএএম ডকুমেন্টেশন দেখুন, বা জিসিএলউড কমান্ড-লাইন সরঞ্জামগুলি ব্যবহার করে কীভাবে আপডেট ভূমিকাগুলি করবেন তা শিখুন।

পরিষেবা অ্যাকাউন্ট নির্ধারণ করতে ব্যর্থ

আপনি যদি নিম্নলিখিতগুলির মতো কোনও ত্রুটি বার্তা পান তবে ফায়ারবেস অ্যাডমিন এসডিকে সঠিকভাবে আরম্ভ করা হয়নি।

Failed to determine service account ID. Initialize the SDK with service account
credentials or specify a service account ID with iam.serviceAccounts.signBlob
permission.

আপনি যদি কোনও পরিষেবা অ্যাকাউন্ট আইডি অটো-আবিষ্কার করতে এসডিকে-র উপর নির্ভর করে থাকেন তবে নিশ্চিত করুন যে কোডটি একটি মেটাডেটা সার্ভারের সাথে পরিচালিত গুগল পরিবেশে মোতায়েন করা হয়েছে। অন্যথায়, এসডিকে সূচনায় পরিষেবা অ্যাকাউন্ট জেএসএন ফাইল বা পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে ভুলবেন না।