প্রমাণীকরণ ব্লকিং ট্রিগার (প্রথম প্রজন্ম)

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

শুরু করার আগে

ব্লকিং ফাংশন ব্যবহার করার জন্য আপনাকে আপনার Firebase প্রজেক্টটিকে Firebase Authentication with Identity Platform এ আপগ্রেড করতে হবে। যদি আপনি ইতিমধ্যে আপগ্রেড না করে থাকেন, তাহলে প্রথমে তা করুন।

ব্লকিং ফাংশন বোঝা

আপনি এই ইভেন্টগুলির জন্য ব্লকিং ফাংশন নিবন্ধন করতে পারেন:

  • beforeCreate : নতুন ব্যবহারকারীকে Firebase Authentication ডাটাবেসে সংরক্ষণ করার আগে এবং আপনার ক্লায়েন্ট অ্যাপে একটি টোকেন ফেরত দেওয়ার আগে ট্রিগার করে।

  • beforeSignIn : ব্যবহারকারীর শংসাপত্র যাচাই করার পরে ট্রিগার হয়, কিন্তু Firebase Authentication আপনার ক্লায়েন্ট অ্যাপে একটি ID টোকেন ফেরত দেওয়ার আগে। যদি আপনার অ্যাপ মাল্টি-ফ্যাক্টর প্রমাণীকরণ ব্যবহার করে, তাহলে ব্যবহারকারী তাদের দ্বিতীয় ফ্যাক্টর যাচাই করার পরে ফাংশনটি ট্রিগার হয়। মনে রাখবেন যে একটি নতুন ব্যবহারকারী তৈরি করা beforeCreate ছাড়াও beforeSignIn ট্রিগার করে।

  • beforeEmail (শুধুমাত্র Node.js) : একটি ইমেলের আগে ট্রিগার করে (উদাহরণস্বরূপ,
    (একটি সাইন-ইন বা পাসওয়ার্ড রিসেট ইমেল) একজন ব্যবহারকারীকে পাঠানো হয়।

  • beforeSms (শুধুমাত্র Node.js) : মাল্টিফ্যাক্টর প্রমাণীকরণের মতো ক্ষেত্রে, ব্যবহারকারীর কাছে একটি SMS বার্তা পাঠানোর আগে ট্রিগার করে।

ব্লকিং ফাংশন ব্যবহার করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • আপনার ফাংশনটি ৭ সেকেন্ডের মধ্যে সাড়া দিতে হবে। ৭ সেকেন্ড পরে, Firebase Authentication একটি ত্রুটি ফেরত দেয় এবং ক্লায়েন্ট অপারেশন ব্যর্থ হয়।

  • 200 ছাড়া অন্য HTTP রেসপন্স কোডগুলি আপনার ক্লায়েন্ট অ্যাপগুলিতে পাঠানো হয়। নিশ্চিত করুন যে আপনার ফাংশন যে কোনও ত্রুটি দেখা দিতে পারে তা আপনার ক্লায়েন্ট কোড পরিচালনা করে।

  • ফাংশনগুলি আপনার প্রকল্পের সকল ব্যবহারকারীর জন্য প্রযোজ্য, যার মধ্যে ভাড়াটে অন্তর্ভুক্ত যেকোনো ব্যবহারকারীও অন্তর্ভুক্ত। Firebase Authentication আপনার ফাংশনের ব্যবহারকারীদের সম্পর্কে তথ্য প্রদান করে, যার মধ্যে তারা যে কোনও ভাড়াটে অন্তর্ভুক্ত, যাতে আপনি সেই অনুযায়ী প্রতিক্রিয়া জানাতে পারেন।

  • অন্য কোনও পরিচয় প্রদানকারীকে একটি অ্যাকাউন্টের সাথে লিঙ্ক করলে beforeSignIn নিবন্ধিত যেকোনো ফাংশন পুনরায় চালু হয়।

  • বেনামী এবং কাস্টম প্রমাণীকরণ ব্লকিং ফাংশনগুলিকে ট্রিগার করে না।

একটি ব্লকিং ফাংশন স্থাপন করুন

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

আপনি যে কোনও ফাংশন স্থাপন করেন ঠিক একইভাবে একটি ব্লকিং ফাংশন স্থাপন করেন। (বিস্তারিত জানার জন্য Cloud Functions শুরু করার পৃষ্ঠাটি দেখুন)। সংক্ষেপে:

  1. লক্ষ্যবস্তু ইভেন্ট পরিচালনা করে এমন একটি ফাংশন লিখুন।

    উদাহরণস্বরূপ, শুরু করার জন্য, আপনি index.js এ নিচের মতো একটি no-op ফাংশন যোগ করতে পারেন:

    const functions = require('firebase-functions/v1');
    
    exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
      // TODO
    });
    
    The above example has omitted the implementation of custom auth logic. See
    the following sections to learn how to implement your blocking functions and
    [Common scenarios](#common-scenarios) for specific examples.
    
  1. Firebase CLI ব্যবহার করে আপনার ফাংশন স্থাপন করুন:

    firebase deploy --only functions
    

    প্রতিবার আপডেট করার সময় আপনার ফাংশনগুলি পুনরায় স্থাপন করতে হবে।

ব্যবহারকারী এবং প্রসঙ্গ তথ্য পাওয়া

beforeSignIn এবং beforeCreate ইভেন্টগুলি User এবং EventContext অবজেক্ট প্রদান করে যাতে ব্যবহারকারীর সাইন ইন সম্পর্কে তথ্য থাকে। কোনও অপারেশনকে এগিয়ে যাওয়ার অনুমতি দেওয়া হবে কিনা তা নির্ধারণ করতে আপনার কোডে এই মানগুলি ব্যবহার করুন।

User অবজেক্টে উপলব্ধ বৈশিষ্ট্যের তালিকার জন্য, UserRecord API রেফারেন্স দেখুন।

EventContext অবজেক্টে নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

নাম বিবরণ উদাহরণ
locale অ্যাপ্লিকেশন লোকেল। আপনি ক্লায়েন্ট SDK ব্যবহার করে অথবা REST API-তে লোকেল হেডারটি পাস করে লোকেল সেট করতে পারেন। fr অথবা sv-SE
ipAddress ব্যবহারকারী যে ডিভাইস থেকে নিবন্ধন করছেন বা সাইন ইন করছেন তার IP ঠিকানা। 114.14.200.1
userAgent ব্লকিং ফাংশনটি ট্রিগার করছে ব্যবহারকারী এজেন্ট। Mozilla/5.0 (X11; Linux x86_64)
eventId ইভেন্টের অনন্য শনাক্তকারী। rWsyPtolplG2TBFoOkkgyg
eventType ইভেন্টের ধরণ। এটি ইভেন্টের নাম, যেমন beforeSignIn বা beforeCreate , এবং ব্যবহৃত সংশ্লিষ্ট সাইন-ইন পদ্ধতি, যেমন Google বা ইমেল/পাসওয়ার্ড সম্পর্কিত তথ্য প্রদান করে। providers/cloud.auth/eventTypes/user.beforeSignIn:password
authType সর্বদা USER USER
resource Firebase Authentication প্রকল্প বা ভাড়াটে। projects/ project-id /tenants/ tenant-id
timestamp যে সময় ইভেন্টটি ট্রিগার করা হয়েছিল, সেটি RFC 3339 স্ট্রিং হিসেবে ফর্ম্যাট করা হয়েছিল। Tue, 23 Jul 2019 21:10:57 GMT
additionalUserInfo ব্যবহারকারী সম্পর্কে তথ্য সম্বলিত একটি বস্তু। AdditionalUserInfo
credential ব্যবহারকারীর শংসাপত্র সম্পর্কে তথ্য সম্বলিত একটি বস্তু। AuthCredential

নিবন্ধন বা সাইন-ইন ব্লক করা

রেজিস্ট্রেশন বা সাইন-ইন প্রচেষ্টা ব্লক করতে, আপনার ফাংশনে একটি HttpsError দিন। উদাহরণস্বরূপ:

নোড.জেএস

throw new functions.auth.HttpsError('permission-denied');

নিম্নলিখিত টেবিলে আপনি যে ত্রুটিগুলি উত্থাপন করতে পারেন তার তালিকা রয়েছে, এবং তাদের ডিফল্ট ত্রুটি বার্তাও রয়েছে:

নাম কোড বার্তা
invalid-argument 400 ক্লায়েন্ট একটি অবৈধ যুক্তি উল্লেখ করেছে।
failed-precondition 400 বর্তমান সিস্টেম অবস্থায় অনুরোধটি কার্যকর করা যাবে না।
out-of-range 400 ক্লায়েন্ট একটি অবৈধ পরিসর নির্দিষ্ট করেছে।
unauthenticated 401 OAuth টোকেন অনুপস্থিত, অবৈধ, অথবা মেয়াদোত্তীর্ণ।
permission-denied 403 ক্লায়েন্টের পর্যাপ্ত অনুমতি নেই।
not-found 404 নির্দিষ্ট রিসোর্স পাওয়া যায়নি।
aborted 409 সমকালীন দ্বন্দ্ব, যেমন পঠন-পরিবর্তন-লেখার দ্বন্দ্ব।
already-exists 409 একজন ক্লায়েন্ট যে রিসোর্সটি তৈরি করার চেষ্টা করেছিলেন তা ইতিমধ্যেই বিদ্যমান।
resource-exhausted 429 হয় রিসোর্স কোটার বাইরে অথবা হারের সীমায় পৌঁছেছে।
cancelled 499 ক্লায়েন্ট অনুরোধ বাতিল করেছেন।
data-loss 500 অপ্রত্যাশিত ডেটা ক্ষতি বা ডেটা দুর্নীতি।
unknown 500 অজানা সার্ভার ত্রুটি।
internal 500 অভ্যন্তরীণ সার্ভার ত্রুটি।
not-implemented 501 সার্ভার দ্বারা API পদ্ধতি বাস্তবায়িত হয়নি।
unavailable 503 পরিষেবা অনুপলব্ধ।
deadline-exceeded 504 অনুরোধের সময়সীমা পেরিয়ে গেছে।

আপনি একটি কাস্টম ত্রুটি বার্তাও নির্দিষ্ট করতে পারেন:

নোড.জেএস

throw new functions.auth.HttpsError('permission-denied', 'Unauthorized request origin!');

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে নির্দিষ্ট ডোমেনের মধ্যে নেই এমন ব্যবহারকারীদের আপনার অ্যাপে নিবন্ধন করা থেকে ব্লক করবেন:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  // (If the user is authenticating within a tenant context, the tenant ID can be determined from
  // user.tenantId or from context.resource, e.g. 'projects/project-id/tenant/tenant-id-1')

  // Only users of a specific domain can sign up.
  if (user.email.indexOf('@acme.com') === -1) {
    throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

আপনি ডিফল্ট বা কাস্টম বার্তা ব্যবহার করুন না কেন, ক্লাউড ফাংশন ত্রুটিটি মোড়ানো এবং ক্লায়েন্টকে একটি অভ্যন্তরীণ ত্রুটি হিসাবে ফেরত পাঠায়। উদাহরণস্বরূপ:

throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email user@evil.com}`);

আপনার অ্যাপটি ত্রুটিটি ধরবে এবং সেই অনুযায়ী এটি পরিচালনা করবে। উদাহরণস্বরূপ:

জাভাস্ক্রিপ্ট

// Blocking functions can also be triggered in a multi-tenant context before user creation.
// firebase.auth().tenantId = 'tenant-id-1';
firebase.auth().createUserWithEmailAndPassword('johndoe@example.com', 'password')
  .then((result) => {
    result.user.getIdTokenResult()
  })
  .then((idTokenResult) => {
    console.log(idTokenResult.claim.admin);
  })
  .catch((error) => {
    if (error.code !== 'auth/internal-error' && error.message.indexOf('Cloud Function') !== -1) {
      // Display error.
    } else {
      // Registration succeeds.
    }
  });

একজন ব্যবহারকারী পরিবর্তন করা হচ্ছে

নিবন্ধন বা সাইন-ইন প্রচেষ্টা ব্লক করার পরিবর্তে, আপনি অপারেশনটি চালিয়ে যাওয়ার অনুমতি দিতে পারেন, তবে Firebase Authentication এর ডাটাবেসে সংরক্ষিত এবং ক্লায়েন্টে ফেরত পাঠানো User অবজেক্টটি পরিবর্তন করতে পারেন।

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

  • displayName
  • disabled
  • emailVerified
  • photoUrl
  • customClaims
  • sessionClaims (শুধুমাত্র beforeSignIn )

sessionClaims বাদে, সমস্ত পরিবর্তিত ক্ষেত্র Firebase Authentication এর ডাটাবেসে সংরক্ষিত হয়, যার অর্থ এগুলি প্রতিক্রিয়া টোকেনে অন্তর্ভুক্ত থাকে এবং ব্যবহারকারীর সেশনের মধ্যে স্থায়ী হয়।

নিম্নলিখিত উদাহরণে ডিফল্ট ডিসপ্লে নাম কীভাবে সেট করতে হয় তা দেখানো হয়েছে:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  return {
    // If no display name is provided, set it to "Guest".
    displayName: user.displayName || 'Guest';
  };
});

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

উদাহরণস্বরূপ, যদি কোনও sessionClaims সেট করা থাকে, তাহলে beforeSignIn সেগুলিকে যেকোনো beforeCreate দাবির সাথে ফিরিয়ে দেবে এবং সেগুলিকে একত্রিত করা হবে। যখন সেগুলিকে একত্রিত করা হয়, যদি কোনও sessionClaims কী customClaims এর একটি কী এর সাথে মিলে যায়, তাহলে sessionClaims কী দ্বারা টোকেন দাবিতে মিলিত customClaims ওভাররাইট করা হবে। তবে, ভবিষ্যতের অনুরোধের জন্য ওভারউইটেন customClaims কী এখনও ডাটাবেসে স্থায়ী থাকবে।

সমর্থিত OAuth শংসাপত্র এবং ডেটা

আপনি বিভিন্ন পরিচয় প্রদানকারীর ব্লকিং ফাংশনে OAuth শংসাপত্র এবং ডেটা প্রেরণ করতে পারেন। নিম্নলিখিত টেবিলটি দেখায় যে প্রতিটি পরিচয় প্রদানকারীর জন্য কোন শংসাপত্র এবং ডেটা সমর্থিত:

পরিচয় প্রদানকারী আইডি টোকেন অ্যাক্সেস টোকেন মেয়াদ শেষ হওয়ার সময় টোকেন সিক্রেট টোকেন রিফ্রেশ করুন সাইন-ইন দাবি
গুগল হাঁ হাঁ হাঁ না হাঁ না
ফেসবুক না হাঁ হাঁ না না না
টুইটার না হাঁ না হাঁ না না
গিটহাব না হাঁ না না না না
মাইক্রোসফট হাঁ হাঁ হাঁ না হাঁ না
লিঙ্কডইন না হাঁ হাঁ না না না
ইয়াহু হাঁ হাঁ হাঁ না হাঁ না
আপেল হাঁ হাঁ হাঁ না হাঁ না
এসএএমএল না না না না না হাঁ
ওআইডিসি হাঁ হাঁ হাঁ না হাঁ হাঁ

টোকেন রিফ্রেশ করুন

ব্লকিং ফাংশনে রিফ্রেশ টোকেন ব্যবহার করতে, আপনাকে প্রথমে Firebase কনসোলের ব্লকিং ফাংশন পৃষ্ঠায় চেকবক্সটি নির্বাচন করতে হবে।

OAuth শংসাপত্র, যেমন ID টোকেন বা অ্যাক্সেস টোকেন দিয়ে সরাসরি সাইন ইন করার সময় কোনও পরিচয় প্রদানকারী রিফ্রেশ টোকেন ফেরত দেবে না। এই পরিস্থিতিতে, একই ক্লায়েন্ট-সাইড OAuth শংসাপত্র ব্লকিং ফাংশনে প্রেরণ করা হবে।

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

জেনেরিক OIDC প্রদানকারীরা

যখন একজন ব্যবহারকারী একটি জেনেরিক OIDC প্রদানকারীর সাথে সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি পাস করা হবে:

  • আইডি টোকেন : যদি id_token ফ্লো নির্বাচন করা হয় তবে প্রদান করা হবে।
  • অ্যাক্সেস টোকেন : কোড ফ্লো নির্বাচিত থাকলে প্রদান করা হবে। মনে রাখবেন যে কোড ফ্লো বর্তমানে শুধুমাত্র REST API এর মাধ্যমে সমর্থিত।
  • রিফ্রেশ টোকেন : যদি offline_access স্কোপ নির্বাচন করা হয় তবে প্রদান করা হবে।

উদাহরণ:

const provider = new firebase.auth.OAuthProvider('oidc.my-provider');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

গুগল

যখন একজন ব্যবহারকারী Google-এ সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি পাস করা হবে:

  • আইডি টোকেন
  • অ্যাক্সেস টোকেন
  • রিফ্রেশ টোকেন : শুধুমাত্র নিম্নলিখিত কাস্টম প্যারামিটারগুলি অনুরোধ করা হলেই প্রদান করা হবে:
    • access_type=offline
    • prompt=consent , যদি ব্যবহারকারী পূর্বে সম্মতি দিয়ে থাকেন এবং কোনও নতুন সুযোগের অনুরোধ করা না হয়

উদাহরণ:

const provider = new firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({
  'access_type': 'offline',
  'prompt': 'consent'
});
firebase.auth().signInWithPopup(provider);

গুগল রিফ্রেশ টোকেন সম্পর্কে আরও জানুন।

ফেসবুক

যখন একজন ব্যবহারকারী ফেসবুকে সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি পাস করা হবে:

  • অ্যাক্সেস টোকেন : একটি অ্যাক্সেস টোকেন ফেরত দেওয়া হয় যা অন্য একটি অ্যাক্সেস টোকেনের সাথে বিনিময় করা যেতে পারে। Facebook দ্বারা সমর্থিত বিভিন্ন ধরণের অ্যাক্সেস টোকেন সম্পর্কে আরও জানুন এবং কীভাবে আপনি দীর্ঘস্থায়ী টোকেনের জন্য সেগুলি বিনিময় করতে পারেন সে সম্পর্কে আরও জানুন।

গিটহাব

যখন একজন ব্যবহারকারী GitHub-এ সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রটি পাস করা হবে:

  • অ্যাক্সেস টোকেন : বাতিল না করা পর্যন্ত মেয়াদ শেষ হয় না।

মাইক্রোসফট

যখন একজন ব্যবহারকারী মাইক্রোসফটে সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি পাস করা হবে:

  • আইডি টোকেন
  • অ্যাক্সেস টোকেন
  • রিফ্রেশ টোকেন : offline_access স্কোপ নির্বাচন করা থাকলে ব্লকিং ফাংশনে পাস করা হয়।

উদাহরণ:

const provider = new firebase.auth.OAuthProvider('microsoft.com');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

ইয়াহু

যখন একজন ব্যবহারকারী Yahoo-এর সাথে সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি কোনও কাস্টম প্যারামিটার বা স্কোপ ছাড়াই পাস করা হবে:

  • আইডি টোকেন
  • অ্যাক্সেস টোকেন
  • টোকেন রিফ্রেশ করুন

লিঙ্কডইন

যখন একজন ব্যবহারকারী LinkedIn-এ সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি পাস করা হবে:

  • অ্যাক্সেস টোকেন

আপেল

যখন একজন ব্যবহারকারী অ্যাপলের সাথে সাইন ইন করেন, তখন নিম্নলিখিত শংসাপত্রগুলি কোনও কাস্টম প্যারামিটার বা স্কোপ ছাড়াই পাস করা হবে:

  • আইডি টোকেন
  • অ্যাক্সেস টোকেন
  • টোকেন রিফ্রেশ করুন

সাধারণ পরিস্থিতি

নিম্নলিখিত উদাহরণগুলি ব্লকিং ফাংশনগুলির জন্য কিছু সাধারণ ব্যবহারের উদাহরণ প্রদর্শন করে:

শুধুমাত্র একটি নির্দিষ্ট ডোমেন থেকে নিবন্ধনের অনুমতি দেওয়া হচ্ছে

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে example.com ডোমেনের অংশ নয় এমন ব্যবহারকারীদের আপনার অ্যাপে নিবন্ধন করা থেকে বিরত রাখা যায়:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (!user.email || user.email.indexOf('@example.com') === -1) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

যাচাই না করা ইমেল ব্যবহারকারীদের নিবন্ধন থেকে ব্লক করা

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে যাচাই না করা ইমেল ব্যবহারকারীদের আপনার অ্যাপে নিবন্ধন করা থেকে বিরত রাখা যায়:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unverified email "${user.email}"`);
  }
});

নিবন্ধনের সময় ইমেল যাচাইকরণ প্রয়োজন

নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে একজন ব্যবহারকারীকে নিবন্ধনের পর তাদের ইমেল যাচাই করতে হবে:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  const locale = context.locale;
  if (user.email && !user.emailVerified) {
    // Send custom email verification on sign-up.
    return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
      return sendCustomVerificationEmail(user.email, link, locale);
    });
  }
});

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
 if (user.email && !user.emailVerified) {
   throw new functions.auth.HttpsError(
     'invalid-argument', `"${user.email}" needs to be verified before access is granted.`);
  }
});

নির্দিষ্ট কিছু পরিচয় প্রদানকারীর ইমেল যাচাইকৃত হিসেবে গণ্য করা

নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে নির্দিষ্ট পরিচয় প্রদানকারীর কাছ থেকে আসা ব্যবহারকারীর ইমেলগুলিকে যাচাইকৃত হিসেবে বিবেচনা করা যায়:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified && context.eventType.indexOf(':facebook.com') !== -1) {
    return {
      emailVerified: true,
    };
  }
});

নির্দিষ্ট IP ঠিকানা থেকে সাইন-ইন ব্লক করা হচ্ছে

নির্দিষ্ট IP ঠিকানার রেঞ্জ থেকে সাইন-ইন ব্লক করার উদাহরণ নিম্নরূপ:

নোড.জেএস

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
  if (isSuspiciousIpAddress(context.ipAddress)) {
    throw new functions.auth.HttpsError(
      'permission-denied', 'Unauthorized access!');
  }
});

কাস্টম এবং সেশন দাবি সেট করা

নিম্নলিখিত উদাহরণে কাস্টম এবং সেশন দাবি কীভাবে সেট করতে হয় তা দেখানো হয়েছে:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'saml.my-provider-id') {
    return {
      // Employee ID does not change so save in persistent claims (stored in
      // Auth DB).
      customClaims: {
        eid: context.credential.claims.employeeid,
      },
      // Copy role and groups to token claims. These will not be persisted.
      sessionClaims: {
        role: context.credential.claims.role,
        groups: context.credential.claims.groups,
      }
    }
  }
});

সন্দেহজনক কার্যকলাপ পর্যবেক্ষণের জন্য আইপি ঠিকানা ট্র্যাক করা

ব্যবহারকারী যে আইপি অ্যাড্রেস থেকে সাইন ইন করেন তা ট্র্যাক করে এবং পরবর্তী অনুরোধগুলিতে আইপি অ্যাড্রেসের সাথে তুলনা করে আপনি টোকেন চুরি রোধ করতে পারেন। যদি অনুরোধটি সন্দেহজনক বলে মনে হয় - উদাহরণস্বরূপ, আইপিগুলি বিভিন্ন ভৌগোলিক অঞ্চল থেকে এসেছে - তাহলে আপনি ব্যবহারকারীকে আবার সাইন ইন করতে বলতে পারেন।

  1. ব্যবহারকারী যে IP ঠিকানা দিয়ে সাইন ইন করেন তা ট্র্যাক করতে সেশন দাবি ব্যবহার করুন:

    নোড.জেএস

    exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
      return {
        sessionClaims: {
          signInIpAddress: context.ipAddress,
        },
      };
    });
    
  2. যখন কোনও ব্যবহারকারী Firebase Authentication ব্যবহার করে প্রমাণীকরণের প্রয়োজন এমন সংস্থানগুলি অ্যাক্সেস করার চেষ্টা করেন, তখন অনুরোধে থাকা IP ঠিকানাটি সাইন ইন করার জন্য ব্যবহৃত IP ঠিকানার সাথে তুলনা করুন:

    নোড.জেএস

    app.post('/getRestrictedData', (req, res) => {
      // Get the ID token passed.
      const idToken = req.body.idToken;
      // Verify the ID token, check if revoked and decode its payload.
      admin.auth().verifyIdToken(idToken, true).then((claims) => {
        // Get request IP address
        const requestIpAddress = req.connection.remoteAddress;
        // Get sign-in IP address.
        const signInIpAddress = claims.signInIpAddress;
        // Check if the request IP address origin is suspicious relative to
        // the session IP addresses. The current request timestamp and the
        // auth_time of the ID token can provide additional signals of abuse,
        // especially if the IP address suddenly changed. If there was a sudden
        // geographical change in a short period of time, then it will give
        // stronger signals of possible abuse.
        if (!isSuspiciousIpAddressChange(signInIpAddress, requestIpAddress)) {
          // Suspicious IP address change. Require re-authentication.
          // You can also revoke all user sessions by calling:
          // admin.auth().revokeRefreshTokens(claims.sub).
          res.status(401).send({error: 'Unauthorized access. Please login again!'});
        } else {
          // Access is valid. Try to return data.
          getData(claims).then(data => {
            res.end(JSON.stringify(data);
          }, error => {
            res.status(500).send({ error: 'Server error!' })
          });
        }
      });
    });
    

ব্যবহারকারীর ছবি স্ক্রিন করা হচ্ছে

নিম্নলিখিত উদাহরণে ব্যবহারকারীদের প্রোফাইল ছবি কীভাবে স্যানিটাইজ করতে হয় তা দেখানো হয়েছে:

নোড.জেএস

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.photoURL) {
    return isPhotoAppropriate(user.photoURL)
      .then((status) => {
        if (!status) {
          // Sanitize inappropriate photos by replacing them with guest photos.
          // Users could also be blocked from sign-up, disabled, etc.
          return {
            photoUrl: PLACEHOLDER_GUEST_PHOTO_URL,
          };
        }
      });
});

ছবিগুলি কীভাবে সনাক্ত এবং জীবাণুমুক্ত করতে হয় সে সম্পর্কে আরও জানতে, ক্লাউড ভিশন ডকুমেন্টেশন দেখুন।

ব্যবহারকারীর পরিচয় প্রদানকারীর OAuth শংসাপত্র অ্যাক্সেস করা

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে Google-এ সাইন ইন করা একজন ব্যবহারকারীর জন্য একটি রিফ্রেশ টোকেন পেতে হয় এবং এটি ব্যবহার করে Google Calendar API গুলিতে কল করতে হয়। রিফ্রেশ টোকেনটি অফলাইন অ্যাক্সেসের জন্য সংরক্ষণ করা হয়।

নোড.জেএস

const {OAuth2Client} = require('google-auth-library');
const {google} = require('googleapis');
// ...
// Initialize Google OAuth client.
const keys = require('./oauth2.keys.json');
const oAuth2Client = new OAuth2Client(
  keys.web.client_id,
  keys.web.client_secret
);

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'google.com') {
    // Store the refresh token for later offline use.
    // These will only be returned if refresh tokens credentials are included
    // (enabled by Cloud console).
    return saveUserRefreshToken(
        user.uid,
        context.credential.refreshToken,
        'google.com'
      )
      .then(() => {
        // Blocking the function is not required. The function can resolve while
        // this operation continues to run in the background.
        return new Promise((resolve, reject) => {
          // For this operation to succeed, the appropriate OAuth scope should be requested
          // on sign in with Google, client-side. In this case:
          // https://www.googleapis.com/auth/calendar
          // You can check granted_scopes from within:
          // context.additionalUserInfo.profile.granted_scopes (space joined list of scopes).

          // Set access token/refresh token.
          oAuth2Client.setCredentials({
            access_token: context.credential.accessToken,
            refresh_token: context.credential.refreshToken,
          });
          const calendar = google.calendar('v3');
          // Setup Onboarding event on user's calendar.
          const event = {/** ... */};
          calendar.events.insert({
            auth: oauth2client,
            calendarId: 'primary',
            resource: event,
          }, (err, event) => {
            // Do not fail. This is a best effort approach.
            resolve();
          });
      });
    })
  }
});

ব্যবহারকারীর ক্রিয়াকলাপের জন্য reCAPTCHA এন্টারপ্রাইজ রায় ওভাররাইড করা হচ্ছে

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে সমর্থিত ব্যবহারকারী প্রবাহের জন্য একটি reCAPTCHA এন্টারপ্রাইজ রায় ওভাররাইড করতে হয়।

Firebase Authentication-এর সাথে reCAPTCHA Enterprise ইন্টিগ্রেট করার বিষয়ে আরও জানতে reCAPTCHA Enterprise সক্ষম করুন দেখুন।

ব্লকিং ফাংশনগুলি কাস্টম ফ্যাক্টরের উপর ভিত্তি করে প্রবাহকে অনুমতি দিতে বা ব্লক করতে ব্যবহার করা যেতে পারে, যার ফলে reCAPTCHA এন্টারপ্রাইজ দ্বারা প্রদত্ত ফলাফলকে অগ্রাহ্য করা হয়।

নোড.জেএস

const functions = require("firebase-functions/v1");
exports.beforesmsv1 = functions.auth.user().beforeSms((context) => {
 if (
   context.smsType === "SIGN_IN_OR_SIGN_UP" &&
   context.additionalUserInfo.phoneNumber.includes('+91')
 ) {
   return {
     recaptchaActionOverride: "ALLOW",
   };
 }

 // Allow users to sign in with recaptcha score greater than 0.5
 if (event.additionalUserInfo.recaptchaScore > 0.5) {
   return {
     recaptchaActionOverride: 'ALLOW',
   };
 }

 // Block all others.
 return  {
   recaptchaActionOverride: 'BLOCK',
 }
});