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

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

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

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

শুরু করার আগে

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

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

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

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

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

অ্যাডমিন এসডিকে-কে একটি পরিষেবা অ্যাকাউন্ট খুঁজে বের করতে দেওয়া

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

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

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

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

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

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

সার্ভিস অ্যাকাউন্ট আইডি Google Cloud কনসোলে , অথবা ডাউনলোড করা সার্ভিস অ্যাকাউন্ট JSON ফাইলের client_email ফিল্ডে পাওয়া যায়। সার্ভিস অ্যাকাউন্ট আইডি হলো ইমেল অ্যাড্রেস, যার ফরম্যাটটি হলো: <client-id>@<project-id>.iam.gserviceaccount.com । এগুলো ফায়ারবেস এবং 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 Admin SDK-কে অবশ্যই একটি রিমোট সার্ভিস কল করতে হবে। এছাড়াও, আপনাকে নিশ্চিত করতে হবে যে এই কলটি করার জন্য Admin SDK যে সার্ভিস অ্যাকাউন্টটি ব্যবহার করছে —সাধারণত {project-name}@appspot.gserviceaccount.com সেটির iam.serviceAccounts.signBlob পারমিশনটি আছে। আরও বিস্তারিত জানতে নিচের ট্রাবলশুটিং বিভাগটি দেখুন।

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

iOS+

উদ্দেশ্য-সি
[[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 লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন

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

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা
aud দর্শক "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat ইস্যু-সময় ইউনিক্স ইপক থেকে বর্তমান সময়, সেকেন্ডে।
exp মেয়াদ শেষ হওয়ার সময় ইউনিক্স ইপক থেকে সেকেন্ডে সেই সময়, যে সময়ে টোকেনটির মেয়াদ শেষ হয়। এটি 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

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

সমস্যা সমাধান

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

IAM API সক্রিয় করা হয়নি

আপনি যদি টোকেন স্বাক্ষর করার জন্য একটি পরিষেবা অ্যাকাউন্ট আইডি উল্লেখ করেন, তাহলে আপনি নিম্নলিখিতটির মতো একটি ত্রুটি পেতে পারেন:

Identity and Access Management (IAM) API has not been used in project
1234567890 before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=1234567890
then retry. If you enabled this API recently, wait a few minutes for the action
to propagate to our systems and retry.

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

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

যে সার্ভিস অ্যাকাউন্ট দিয়ে Firebase Admin SDK চলছে, সেই অ্যাকাউন্টের যদি iam.serviceAccounts.signBlob পারমিশন না থাকে, তাহলে আপনি নিচের মতো একটি এরর মেসেজ পেতে পারেন:

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

এর সমাধান করতে, উপযুক্ত সার্ভিস অ্যাকাউন্টকে সার্ভিস অ্যাকাউন্ট টোকেন ক্রিয়েটর আইএএম (IAM) রোলটি প্রদান করুন। ব্যবহৃত ডিফল্ট সার্ভিস অ্যাকাউন্টটি পরিবেশ এবং ক্লাউড ফাংশনস ভার্সনের উপর নির্ভর করে:

  • ক্লাউড ফাংশন (১ম প্রজন্ম): ডিফল্ট অ্যাপ ইঞ্জিন সার্ভিস অ্যাকাউন্ট ব্যবহার করে।
  • ক্লাউড ফাংশন (২য় প্রজন্ম): ডিফল্ট কম্পিউট ইঞ্জিন সার্ভিস অ্যাকাউন্ট ব্যবহার করে।
  1. Google Cloud কনসোলে IAM এবং অ্যাডমিন পেজটি খুলুন।
  2. আপনার প্রজেক্টটি নির্বাচন করুন এবং 'চালিয়ে যান'-এ ক্লিক করুন।
  3. যে সার্ভিস অ্যাকাউন্টটি আপনি আপডেট করতে চান, তার সংশ্লিষ্ট এডিট আইকনটিতে ক্লিক করুন।
  4. ‘Add Another Role’-এ ক্লিক করুন।
  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-এর উপর নির্ভর করেন, তাহলে নিশ্চিত করুন যে কোডটি একটি মেটাডেটা সার্ভারসহ গুগলের পরিচালিত পরিবেশে ডেপ্লয় করা হয়েছে। অন্যথায়, SDK চালু করার সময় সার্ভিস অ্যাকাউন্ট JSON ফাইল অথবা সার্ভিস অ্যাকাউন্ট আইডি উল্লেখ করতে ভুলবেন না।