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

Firebase আপনাকে যাচাইকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যার মাধ্যমে আপনি নিরাপদ JSON ওয়েব টোকেন (JWTs) ব্যবহার করে ব্যবহারকারী বা ডিভাইস যাচাই করতে পারেন। আপনি নিজের সার্ভারে এইসব টোকেন তৈরি করেন, সেগুলি ক্লায়েন্ট ডিভাইসে ফেরত পাঠান এবং তারপর 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 অ্যাডমিন SDK-এর মাধ্যমে কাস্টম টোকেন তৈরি করতে পারেন অথবা আপনার সার্ভার যদি এমন কোনও ভাষায় লেখা হয় যা Firebase নেটিভভাবে সাপোর্ট করে না, তাহলে আপনি থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করতে পারেন।

শুরু করার আগে

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

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

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

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

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

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

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

এইসব সাইন-ইন করার পদ্ধতি ব্যবহার করতে, Google অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল সহ 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();

পরিষেবা অ্যাকাউন্ট কী ডাউনলোড না করে স্থানীয়ভাবে একই কোড পরীক্ষা করতে, Google Cloud CLI ব্যবহার করে আপনার নিজের ব্যবহারকারীর ক্রেডেনশিয়াল দিয়ে সাইন-ইন করুন:

gcloud auth application-default login

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

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

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

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

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

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

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

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

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

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

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

Node.js

const uid = 'some-uid';

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

জাভা

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 অ্যাডমিন SDK-তে কাজ করে না এমন বিভিন্ন ভাষায় কীভাবে কাস্টম টোকেন তৈরি করতে হয় তার কিছু উদাহরণ এখানে দেওয়া হল। এই উদাহরণগুলি পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী দিয়ে স্থানীয়ভাবে টোকেন সাইন করে, তাই পরিষেবা অ্যাকাউন্টের কী ফাইলের জন্য নিরাপত্তা সংক্রান্ত নির্দেশিকা প্রযোজ্য হয়। ব্যক্তিগত কী ম্যানেজ করা এড়াতে, আপনি IAM পরিষেবা অ্যাকাউন্ট ক্রেডেনশিয়াল API-এর signJwt পদ্ধতি কল করে Google-কে রিমোটলি টোকেন পেলোড সাইন করতে দিতে পারেন। কলারের পরিষেবা অ্যাকাউন্টে পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর ভূমিকা থাকতে হবে।

PHP

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

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

// Placeholder values. In production, load your service account's email
// address and private key from a secure secret store. Never hard-code
// private keys in source code.
$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"

# Placeholder values. In production, load your service account's email
# address and private key from a secure secret store. Never hard-code
# private keys in source code.
$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 ব্যবহার করে। এই সমস্যার অর্থ হল, আপনার 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 ভার্সনের উপর:

  • Cloud Functions (ফার্স্ট জেনারেশন): ডিফল্ট App Engine পরিষেবা অ্যাকাউন্ট ব্যবহার করে।
  • Cloud Functions (২য় জেনারেশন): ডিফল্ট 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 ইনিশিয়ালাইজ করার সময় পরিষেবা অ্যাকাউন্ট আইডি উল্লেখ করতে ভুলবেন না অথবা Google-এর নয় এমন পরিবেশে, পরিষেবা অ্যাকাউন্ট কী ফাইল-এর মাধ্যমে SDK ইনিশিয়ালাইজ করুন।