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

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

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

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

তুমি শুরু করার আগে

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

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

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

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

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

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

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

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

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

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

Node.js

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

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

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

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

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

একটি পৃথক পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করে কাস্টম টোকেন তৈরি করতে, নীচে দেখানো হিসাবে 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);

পাইথন

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 প্রদান করতে হবে, যা যেকোনো স্ট্রিং হতে পারে কিন্তু আপনি যে ব্যবহারকারী বা ডিভাইসটিকে প্রমাণীকরণ করছেন সেটিকে অনন্যভাবে সনাক্ত করতে হবে। এই টোকেন এক ঘন্টা পরে মেয়াদ শেষ হয়.

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

পাইথন

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

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

পাইথন

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);

ওয়েব নামস্থান API

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

ওয়েব মডুলার API

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() ) আপনার রিয়েলটাইম ডেটাবেস নিরাপত্তা নিয়মে auth অবজেক্ট এবং আপনার ক্লাউড স্টোরেজ সিকিউরিটি রুলসের 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 রিয়েলটাইম ডেটাবেস) বা request.auth.token (ক্লাউড স্টোরেজ) অবজেক্ট থেকে উল্লেখ করা যেতে পারে:

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

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