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

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

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

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

শুরু করার আগে

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

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

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

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

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

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

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

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

  • যদি আপনার কোড অন্য কোনও পরিচালিত পরিবেশে (যেমন গুগল ক্লাউড ফাংশন, গুগল কম্পিউট ইঞ্জিন) স্থাপন করা হয়, তাহলে ফায়ারবেস অ্যাডমিন 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 পরিবেশ ভেরিয়েবলটিকে এটি নির্দেশ করার জন্য সেট করুন।

যদি Firebase Admin SDK-কে একটি পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং আবিষ্কার করতে হয়, তাহলে এটি তখনই ঘটে যখন আপনার কোড প্রথমবারের জন্য একটি কাস্টম টোকেন তৈরি করে। ফলাফলটি ক্যাশে করা হয় এবং পরবর্তী টোকেন সাইনিং অপারেশনের জন্য পুনরায় ব্যবহার করা হয়। স্বয়ংক্রিয়ভাবে আবিষ্কার করা পরিষেবা অ্যাকাউন্ট আইডি সাধারণত Google Cloud দ্বারা সরবরাহিত ডিফল্ট পরিষেবা অ্যাকাউন্টগুলির মধ্যে একটি:

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

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

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

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

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

নোড.জেএস

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 Admin SDK ব্যবহার করে কাস্টম টোকেন তৈরি করুন

Firebase Admin 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() কল করে কাস্টম টোকেনের সাথে প্রমাণীকরণ করে:

আইওএস+

অবজেক্টিভ-সি
[[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);

Web

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

Web

import { getAuth, signInWithCustomToken } from "firebase/auth";

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

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

অন্যান্য সাইন-ইন পদ্ধতির মতো (যেমন signInWithEmailAndPassword() এবং signInWithCredential() ) আপনার Realtime Database Security Rules -এ auth অবজেক্ট এবং আপনার Cloud Storage Security Rules -এ request.auth অবজেক্ট ব্যবহারকারীর uid দিয়ে পূর্ণ হবে। এই ক্ষেত্রে, uid হবে সেইটি যা আপনি কাস্টম টোকেন তৈরি করার সময় নির্দিষ্ট করেছিলেন।

ডাটাবেস নিয়ম

{
  "rules": {
    "adminContent": {
      ".read": "auth.uid === 'some-uid'"
    }
  }
}

স্টোরেজ নিয়ম

service firebase.storage {
  match /b/<your-firebase-storage-bucket>/o {
    match /adminContent/{filename} {
      allow read, write: if request.auth != null && request.auth.uid == "some-uid";
    }
  }
}

যদি কাস্টম টোকেনে অতিরিক্ত দাবি থাকে, তাহলে সেগুলি আপনার নিয়মের auth.token ( Firebase Realtime Database ) অথবা request.auth.token ( Cloud Storage ) অবজেক্ট থেকে উল্লেখ করা যেতে পারে:

ডাটাবেস নিয়ম

{
  "rules": {
    "premiumContent": {
      ".read": "auth.token.premiumAccount === true"
    }
  }
}

স্টোরেজ নিয়ম

service firebase.storage {
  match /b/<your-firebase-storage-bucket>/o {
    match /premiumContent/{filename} {
      allow read, write: if request.auth.token.premiumAccount == true;
    }
  }
}

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

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

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

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

যদি Firebase Admin SDK-এর পরিষেবা অ্যাকাউন্টটি iam.serviceAccounts.signBlob এর অনুমতি না থাকে, তাহলে আপনি নিম্নলিখিত ত্রুটির বার্তা পেতে পারেন:

Permission iam.serviceAccounts.signBlob is required to perform this operation
on service account projects/-/serviceAccounts/{your-service-account-id}.

এই সমস্যা সমাধানের সবচেয়ে সহজ উপায় হল "সার্ভিস অ্যাকাউন্ট টোকেন ক্রিয়েটর" IAM ভূমিকাটি প্রশ্নবিদ্ধ পরিষেবা অ্যাকাউন্টকে প্রদান করা, সাধারণত {project-name}@appspot.gserviceaccount.com :

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

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

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

যদি আপনি নিচের মতো একটি ত্রুটির বার্তা পান, তাহলে বুঝতে হবে Firebase Admin SDK সঠিকভাবে শুরু করা হয়নি।

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

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