আইডি টোকেন যাচাই করা

আপনার Firebase ক্লায়েন্ট অ্যাপ কাস্টম ব্যাকএন্ড সার্ভারের সাথে যোগাযোগ করলে, আপনাকে সেই সার্ভারে বর্তমানে সাইন-ইন করা ব্যবহারকারীকে শনাক্ত করতে হতে পারে। নিরাপদে এটি করতে, সফলভাবে সাইন-ইন করার পরে, HTTPS ব্যবহার করে আপনার সার্ভারে ব্যবহারকারীর আইডি টোকেন পাঠান। তারপর, সার্ভারে, ID টোকেনের ইন্টিগ্রিটি ও সত্যতা যাচাই করুন এবং সেখান থেকে uid ফিরিয়ে আনুন। আপনার সার্ভারে বর্তমানে সাইন-ইন করা ব্যবহারকারীকে নিরাপদে শনাক্ত করতে, আপনি এই উপায়ে ট্রান্সমিট করা uid ব্যবহার করতে পারবেন।

শুরু করার আগে

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

ক্লায়েন্টে আইডি টোকেন ফিরিয়ে আনা

কোনও ব্যবহারকারী বা ডিভাইস সফলভাবে সাইন-ইন করলে, Firebase একটি সংশ্লিষ্ট আইডি টোকেন তৈরি করে যা তাদের অনন্যভাবে শনাক্ত করে এবং Firebase Realtime Database ও Cloud Storage-এর মতো বিভিন্ন রিসোর্সে অ্যাক্সেস দেয়। আপনার কাস্টম ব্যাকএন্ড সার্ভারে ব্যবহারকারী বা ডিভাইস শনাক্ত করতে আপনি সেই আইডি টোকেনটি আবার ব্যবহার করতে পারবেন। ক্লায়েন্ট থেকে আইডি টোকেন পেতে, ব্যবহারকারী সাইন-ইন করেছেন কিনা তা নিশ্চিত করুন এবং তারপর সাইন-ইন করা ব্যবহারকারীর থেকে আইডি টোকেন পান:

iOS+

Objective-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
                           completion:^(NSString *_Nullable idToken,
                                        NSError *_Nullable error) {
          if (error) {
            // Handle error
            return;
          }

          // Send token to your backend via HTTPS
          // ...
}];
Swift
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
  if let error = error {
    // Handle error
    return;
  }

  // Send token to your backend via HTTPS
  // ...
}

Android

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            if (task.isSuccessful()) {
                String idToken = task.getResult().getToken();
                // Send token to your backend via HTTPS
                // ...
            } else {
                // Handle error -> task.getException();
            }
        }
    });

Unity

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("TokenAsync was canceled.");
   return;
  }

  if (task.IsFaulted) {
    Debug.LogError("TokenAsync encountered an error: " + task.Exception);
    return;
  }

  string idToken = task.Result;

  // Send token to your backend via HTTPS
  // ...
});

C++

firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
  firebase::Future<std::string> idToken = user.GetToken(true);

  // Send token to your backend via HTTPS
  // ...
}

ওয়েব

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

আপনার কাছে আইডি টোকেন থাকলে, আপনি সেটি JSON ওয়েব টোকেন (JWT) হিসেবে আপনার ব্যাকএন্ডে পাঠাতে এবং Firebase অ্যাডমিন SDK ব্যবহার করে সেটি যাচাই করতে পারবেন অথবা আপনার সার্ভার যদি এমন কোনও ভাষায় লেখা হয় যা Firebase-এ নেটিভ হিসেবে কাজ করে না, তাহলে থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করে যাচাই করতে পারবেন।

Firebase Admin SDK ব্যবহার করে আইডি টোকেন যাচাই করা

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

পরিষেবা অ্যাকাউন্টের সাথে Admin SDK চালু করতে, Admin SDK সেট-আপ সংক্রান্ত নির্দেশাবলী অনুসরণ করুন। তারপর, আইডি টোকেন যাচাই করতে verifyIdToken() পদ্ধতি ব্যবহার করুন:

Node.js

// idToken comes from the client app
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });

জাভা

// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

Python

# id_token comes from the client app (shown above)

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']

Go

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

token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
	log.Fatalf("error verifying ID token: %v\n", err)
}

log.Printf("Verified ID token: %v\n", token)

C#

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

আইডি টোকেন যাচাইকরণের জন্য প্রোজেক্ট আইডি প্রয়োজন। Firebase অ্যাডমিন SDK নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটির মাধ্যমে প্রোজেক্ট আইডি পাওয়ার চেষ্টা করে:

  • SDK যদি একটি স্পষ্ট projectId অ্যাপ বিকল্পের সাথে ইনিশিয়ালাইজ করা হয়, তাহলে SDK সেই বিকল্পের ভ্যালু ব্যবহার করে।
  • পরিষেবা অ্যাকাউন্টের ক্রেডেনশিয়াল দিয়ে SDK চালু করা হলে, SDK পরিষেবা অ্যাকাউন্টের JSON অবজেক্টের project_id ফিল্ড ব্যবহার করে।
  • GOOGLE_CLOUD_PROJECT এনভায়রনমেন্ট ভেরিয়েবল সেট করা থাকলে, SDK সেটির ভ্যালুকে প্রজেক্ট আইডি হিসেবে ব্যবহার করে। এই এনভায়রনমেন্ট ভেরিয়েবল App Engine এবং Compute Engine-এর মতো Google পরিকাঠামোয় রান করা কোডের জন্য উপলভ্য।

থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করে আইডি টোকেন যাচাই করা

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

আইডি টোকেনের হেডার নিম্নলিখিত সীমাবদ্ধতা মেনে চলছে কিনা তা যাচাই করুন:

ID টোকেন হেডার দাবি
alg অ্যালগরিদম "RS256"
kid কী আইডি এতে অবশ্যই https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com-এ তালিকাভুক্ত পাবলিক কীগুলির মধ্যে একটি থাকতে হবে

আইডি টোকেনের পেলোড নিম্নলিখিত সীমাবদ্ধতা মেনে চলছে কিনা তা যাচাই করুন:

ID টোকেন পেলোড দাবি
exp মেয়াদ শেষ হওয়ার সময় ভবিষ্যতের কোনও তারিখ হতে হবে। Unix epoch থেকে সময় সেকেন্ডে পরিমাপ করা হয়।
iat ইস্যু করার সময় অবশ্যই আগেকার কোনও তারিখ হতে হবে। Unix epoch থেকে সময় সেকেন্ডে পরিমাপ করা হয়।
aud দর্শক আপনার Firebase প্রোজেক্ট আইডি হতে হবে, এটি হল আপনার Firebase প্রোজেক্টের অনন্য শনাক্তকারী, যা সেই প্রোজেক্টের কনসোলের URL-এ পাওয়া যাবে।
iss ইস্যুকারী "https://securetoken.google.com/<projectId>" হতে হবে, যেখানে <projectId> হল সেই একই প্রোজেক্ট আইডি যা aud উপরে ব্যবহার করা হয়েছে।
sub বিষয় এটি অবশ্যই একটি খালি স্ট্রিং হবে না এবং এটি অবশ্যই ব্যবহারকারী বা ডিভাইসের uid হতে হবে।
auth_time যাচাইকরণের সময় অবশ্যই আগেকার কোনও তারিখ হতে হবে। ব্যবহারকারী যে সময়ে যাচাই করেছেন।

সবশেষে, নিশ্চিত করুন যে টোকেনের kid দাবি অনুযায়ী প্রাইভেট কী দিয়ে আইডি টোকেন সাইন করা হয়েছে। https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com থেকে পাবলিক কী সংগ্রহ করুন এবং স্বাক্ষর যাচাই করতে JWT লাইব্রেরি ব্যবহার করুন। পাবলিক কী কখন রিফ্রেশ করতে হবে তা জানতে, সেই এন্ডপয়েন্ট থেকে পাওয়া উত্তরের Cache-Control হেডারে max-age-এর ভ্যালু ব্যবহার করুন।

উপরে উল্লিখিত সব যাচাইকরণ সফল হলে, আপনি আইডি টোকেনের সাবজেক্ট (sub) কে সংশ্লিষ্ট ব্যবহারকারী বা ডিভাইসের uid হিসেবে ব্যবহার করতে পারবেন।