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

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

এটি করতে, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন ক্রেডেনশিয়াল—যেমন, ইউজারনেম ও পাসওয়ার্ড—গ্রহণ করে এবং ক্রেডেনশিয়াল সঠিক হলে, কাস্টম JWT রিটার্ন করে। আপনার সার্ভার থেকে পাওয়া কাস্টম JWT তারপরে ক্লায়েন্ট ডিভাইস Firebase-এর সাথে প্রমাণীকরণ করতে ব্যবহার করতে পারে (iOS+, Android, ওয়েব)। যাচাই করা হয়ে গেলে, এই পরিচয়টি অন্যান্য Firebase পরিষেবা অ্যাক্সেস করার সময় ব্যবহার করা হবে, যেমন Firebase Realtime Database এবং Cloud Storage। এছাড়াও, 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 ফাংশন ও App Engine। Google Cloud কনসোলের মাধ্যমে আপনাকে হয়ত কিছু অতিরিক্ত অনুমতি কনফিগার করতে হবে।
  • পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা -- Google-এর ম্যানেজ করা এনভায়রনমেন্টে ব্যবহার করা হলে, এই পদ্ধতিটি নির্দিষ্ট করা পরিষেবা অ্যাকাউন্টের কী ব্যবহার করে টোকেনে সাইন করবে। তবে, এটি একটি রিমোট ওয়েব পরিষেবা ব্যবহার করে এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।

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

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

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

Admin SDK-কে পরিষেবা অ্যাকাউন্ট খুঁজে পেতে দেওয়া

আপনার কোড যদি Google-এর ম্যানেজ করা কোনও এনভায়রনমেন্টে ডিপ্লয় করা হয়, তাহলে Admin SDK কাস্টম টোকেন সাইন করার একটি উপায় অটোমেটিক খুঁজে পাওয়ার চেষ্টা করতে পারে:

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

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

এইসব সাইন-ইন পদ্ধতি ব্যবহার করতে, Google Application Default ক্রেডেনশিয়াল দিয়ে SDK ইনিশিয়ালাইজ করুন এবং কোনও পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:

Node.js

initializeApp();

জাভা

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create();

একই কোড লোকালি পরীক্ষা করতে, একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ডাউনলোড করুন এবং GOOGLE_APPLICATION_CREDENTIALS এনভায়রনমেন্ট ভেরিয়েবল সেট করে সেটির দিকে পয়েন্ট করুন।

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

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

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

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

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

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

Node.js

initializeApp({
  serviceAccountId: 'my-client-id@my-project-id.iam.gserviceaccount.com',
});

জাভা

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setServiceAccountId("my-client-id@my-project-id.iam.gserviceaccount.com")
    .build();
FirebaseApp.initializeApp(options);

Python

options = {
    'serviceAccountId': 'my-client-id@my-project-id.iam.gserviceaccount.com',
}
firebase_admin.initialize_app(options=options)

Go

conf := &firebase.Config{
	ServiceAccountID: "my-client-id@my-project-id.iam.gserviceaccount.com",
}
app, err := firebase.NewApp(context.Background(), conf)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ServiceAccountId = "my-client-id@my-project-id.iam.gserviceaccount.com",
});

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

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

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

Node.js

const uid = 'some-uid';

getAuth()
  .createCustomToken(uid)
  .then((customToken) => {
    // Send token back to client
  })
  .catch((error) => {
    console.log('Error creating custom token:', error);
  });

জাভা

String uid = "some-uid";

String customToken = FirebaseAuth.getInstance().createCustomToken(uid);
// Send token back to client

Python

uid = 'some-uid'

custom_token = auth.create_custom_token(uid)

Go

client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

token, err := client.CustomToken(ctx, "some-uid")
if err != nil {
	log.Fatalf("error minting custom token: %v\n", err)
}

log.Printf("Got custom token: %v\n", token)

C#

var uid = "some-uid";

string customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid);
// Send token back to client

এছাড়াও, কাস্টম টোকেনে অন্তর্ভুক্ত করার জন্য অতিরিক্ত দাবি ঐচ্ছিকভাবে নির্দিষ্ট করতে পারেন। যেমন, নিচে, কাস্টম টোকেনে একটি premiumAccount ফিল্ড যোগ করা হয়েছে, যা আপনার নিরাপত্তা নিয়মের auth / request.auth অবজেক্টে উপলভ্য হবে:

Node.js

const userId = 'some-uid';
const additionalClaims = {
  premiumAccount: true,
};

getAuth()
  .createCustomToken(userId, additionalClaims)
  .then((customToken) => {
    // Send token back to client
  })
  .catch((error) => {
    console.log('Error creating custom token:', error);
  });

জাভা

String uid = "some-uid";
Map<String, Object> additionalClaims = new HashMap<String, Object>();
additionalClaims.put("premiumAccount", true);

String customToken = FirebaseAuth.getInstance()
    .createCustomToken(uid, additionalClaims);
// Send token back to client

Python

uid = 'some-uid'
additional_claims = {
    'premiumAccount': True
}

custom_token = auth.create_custom_token(uid, additional_claims)

Go

client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

claims := map[string]interface{}{
	"premiumAccount": true,
}

token, err := client.CustomTokenWithClaims(ctx, "some-uid", claims)
if err != nil {
	log.Fatalf("error minting custom token: %v\n", err)
}

log.Printf("Got custom token: %v\n", token)

C#

var uid = "some-uid";
var additionalClaims = new Dictionary<string, object>()
{
    { "premiumAccount", true },
};

string customToken = await FirebaseAuth.DefaultInstance
    .CreateCustomTokenAsync(uid, additionalClaims);
// Send token back to client

সংরক্ষিত কাস্টম টোকেনের নাম

ক্লায়েন্টে কাস্টম টোকেন ব্যবহার করে সাইন-ইন করা

কাস্টম টোকেন তৈরি করার পরে, সেটি আপনার ক্লায়েন্ট অ্যাপে পাঠাতে হবে। ক্লায়েন্ট অ্যাপ signInWithCustomToken() কল করে কাস্টম টোকেন দিয়ে যাচাই করে:

iOS+

Objective-C
[[FIRAuth auth] signInWithCustomToken:customToken
                           completion:^(FIRAuthDataResult * _Nullable authResult,
                                        NSError * _Nullable error) {
  // ...
}];
Swift
Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
  // ...
}

Android

mAuth.signInWithCustomToken(mCustomToken)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCustomToken:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    updateUI(user);
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCustomToken:failure", task.getException());
                    Toast.makeText(CustomAuthActivity.this, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                    updateUI(null);
                }
            }
        });

Unity

auth.SignInWithCustomTokenAsync(custom_token).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("SignInWithCustomTokenAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("SignInWithCustomTokenAsync encountered an error: " + task.Exception);
    return;
  }

  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});

C++

firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithCustomToken(custom_token);

Web

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

Web

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

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

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

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

ডেটাবেস সংক্রান্ত নিয়ম

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

স্টোরেজ সংক্রান্ত নিয়ম

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

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

ডেটাবেস সংক্রান্ত নিয়ম

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

স্টোরেজ সংক্রান্ত নিয়ম

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

থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করা

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

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

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

PHP

php-jwt ব্যবহার করা:

// Requires: composer require firebase/php-jwt
use Firebase\JWT\JWT;

// Get your service account's email address and private key from the JSON key file
$service_account_email = "abc-123@a-b-c-123.iam.gserviceaccount.com";
$private_key = "-----BEGIN PRIVATE KEY-----...";

function create_custom_token($uid, $is_premium_account) {
  global $service_account_email, $private_key;

  $now_seconds = time();
  $payload = array(
    "iss" => $service_account_email,
    "sub" => $service_account_email,
    "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
    "iat" => $now_seconds,
    "exp" => $now_seconds+(60*60),  // Maximum expiration time is one hour
    "uid" => $uid,
    "claims" => array(
      "premium_account" => $is_premium_account
    )
  );
  return JWT::encode($payload, $private_key, "RS256");
}

Ruby

ruby-jwt ব্যবহার করা:

require "jwt"

# Get your service account's email address and private key from the JSON key file
$service_account_email = "service-account@my-project-abc123.iam.gserviceaccount.com"
$private_key = OpenSSL::PKey::RSA.new "-----BEGIN PRIVATE KEY-----\n..."

def create_custom_token(uid, is_premium_account)
  now_seconds = Time.now.to_i
  payload = {:iss => $service_account_email,
             :sub => $service_account_email,
             :aud => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
             :iat => now_seconds,
             :exp => now_seconds+(60*60), # Maximum expiration time is one hour
             :uid => uid,
             :claims => {:premium_account => is_premium_account}}
  JWT.encode payload, $private_key, "RS256"
end

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

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

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

IAM API চালু করা নেই

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

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

Firebase Admin SDK টোকেনে সই করার জন্য IAM API ব্যবহার করে। এই সমস্যার অর্থ হল, আপনার Firebase প্রোজেক্টের জন্য IAM API বর্তমানে চালু করা নেই। ওয়েব ব্রাউজারে গিয়ে ত্রুটি মেসেজে দেখানো লিঙ্কটি খুলুন এবং আপনার প্রোজেক্টের জন্য এটি চালু করতে "API চালু করুন" বোতামে ক্লিক করুন।

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

Firebase Admin SDK যে পরিষেবা অ্যাকাউন্টের মাধ্যমে চলছে সেটির কাছে iam.serviceAccounts.signBlob অনুমতি না থাকলে, আপনি এই ধরনের সমস্যার মেসেজ পেতে পারেন:

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

এটি সমাধান করতে, উপযুক্ত পরিষেবা অ্যাকাউন্টে পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর IAM ভূমিকা দিন। কোন ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করা হবে তা পরিবেশ ও Cloud Functions ভার্সনের উপর নির্ভর করে:

  • ক্লাউড ফাংশন (১ম জেনারেশন): ডিফল্ট App Engine পরিষেবা অ্যাকাউন্ট ব্যবহার করে।
  • Cloud Functions (2nd gen): ডিফল্ট Compute Engine পরিষেবা অ্যাকাউন্ট ব্যবহার করে।
  1. Google Cloud কনসোলে গিয়ে IAM ও অ্যাডমিন বিকল্পে যান।

  2. আপনি যে পরিষেবা অ্যাকাউন্ট আপডেট করতে চান সেটির সংশ্লিষ্ট 'এডিট করুন' আইকনে ক্লিক করুন।

  3. অন্য ভূমিকা যোগ করুন বিকল্পে ক্লিক করুন।

  4. সার্চ ফিল্টারে "Service Account Token Creator" টাইপ করুন এবং ফলাফল থেকে এটি বেছে নিন।

  5. ভূমিকা গ্র্যান্ট কনফার্ম করতে সেভ করুন বিকল্পে ক্লিক করুন।

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