প্রমাণীকরণ ব্লকিং ট্রিগার


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

আপনি শুরু করার আগে

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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 নিক্ষেপ করুন৷ যেমন:

Node.js

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 অনুরোধের সময়সীমা অতিক্রম করেছে৷

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

Node.js

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

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

Node.js

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}"`);
  }
});

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

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 ডাটাবেসে সংরক্ষিত হয়, যার মানে সেগুলি প্রতিক্রিয়া টোকেনে অন্তর্ভুক্ত করা হয় এবং ব্যবহারকারীর সেশনের মধ্যে টিকে থাকে।

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

Node.js

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 এর একটি কী-এর সাথে মিলে যায়, তাহলে মিলিত customClaims sessionClaims কী দ্বারা টোকেন দাবিতে ওভাররাইট করা হবে৷ যাইহোক, overwitten customClaims কী এখনও ভবিষ্যতের অনুরোধের জন্য ডাটাবেসে টিকে থাকবে।

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

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

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

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

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

কোনো আইডি টোকেন বা অ্যাক্সেস টোকেনের মতো OAuth শংসাপত্রের মাধ্যমে সরাসরি সাইন ইন করার সময় কোনো পরিচয় প্রদানকারী দ্বারা রিফ্রেশ টোকেন ফেরত দেওয়া হবে না। এই পরিস্থিতিতে, একই ক্লায়েন্ট-সাইড 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);

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

ফেসবুক

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

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

গিটহাব

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

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

মাইক্রোসফট

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

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

উদাহরণ:

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

ইয়াহু

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

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

লিঙ্কডইন

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

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

আপেল

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

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

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

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

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

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

Node.js

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}"`);
  }
});

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

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

Node.js

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

রেজিস্ট্রেশনে ইমেইল ভেরিফিকেশন প্রয়োজন

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

Node.js

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.`);
  }
});

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

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

Node.js

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

নির্দিষ্ট আইপি ঠিকানা থেকে সাইন-ইন ব্লক করা

নির্দিষ্ট আইপি অ্যাড্রেস রেঞ্জ থেকে সাইন-ইন কীভাবে ব্লক করে তা নিম্নলিখিত উদাহরণ:

Node.js

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

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

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

Node.js

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. আইপি অ্যাড্রেস ট্র্যাক করতে সেশন দাবি ব্যবহার করুন ব্যবহারকারী সাইন ইন করে:

    Node.js

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

    Node.js

    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!' })
          });
        }
      });
    });
    

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

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

Node.js

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 ক্যালেন্ডার APIs কল করতে এটি ব্যবহার করে৷ অফলাইন অ্যাক্সেসের জন্য রিফ্রেশ টোকেন সংরক্ষণ করা হয়।

Node.js

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 প্রমাণীকরণের সাথে reCAPTCHA এন্টারপ্রাইজ একীভূত করার বিষয়ে আরও জানতে reCAPTCHA Enterprise সক্ষম করুন দেখুন।

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

Node.js

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',
 }
});
,


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

আপনি শুরু করার আগে

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

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

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

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

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

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

  • beforeSms (কেবলমাত্র নোড.জেএস) : মাল্টিফ্যাক্টর প্রমাণীকরণের মতো ক্ষেত্রে কোনও এসএমএস বার্তা প্রেরণের আগে ট্রিগারগুলি।

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

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

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

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

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

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

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

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

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

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

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

    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 সিএলআই ব্যবহার করে আপনার ফাংশনগুলি স্থাপন করুন:

    firebase deploy --only functions
    

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

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

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

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

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

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

রেজিস্ট্রেশন বা সাইন-ইন ব্লক করা

কোনও নিবন্ধকরণ বা সাইন-ইন প্রচেষ্টা অবরুদ্ধ করতে, আপনার ফাংশনে একটি HttpsError নিক্ষেপ করুন। যেমন:

Node.js

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

নিম্নলিখিত টেবিলটি তাদের ডিফল্ট ত্রুটি বার্তার সাথে আপনি যে ত্রুটিগুলি উত্থাপন করতে পারেন তা তালিকাভুক্ত করে:

নাম কোড বার্তা
invalid-argument 400 ক্লায়েন্ট একটি অবৈধ যুক্তি নির্দিষ্ট করেছে।
failed-precondition 400 অনুরোধটি বর্তমান সিস্টেমের অবস্থায় কার্যকর করা যায় না।
out-of-range 400 ক্লায়েন্ট একটি অবৈধ পরিসীমা নির্দিষ্ট করেছে।
unauthenticated 401 অনুপস্থিত, অবৈধ, বা মেয়াদোত্তীর্ণ ওআউথ টোকেন।
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 এপিআই পদ্ধতি সার্ভার দ্বারা প্রয়োগ করা হয়নি।
unavailable 503 পরিষেবা অনুপলব্ধ
deadline-exceeded 504 অনুরোধের সময়সীমা ছাড়িয়ে গেছে।

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

Node.js

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

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

Node.js

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}"`);
  }
});

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

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

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

Node.js

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 একটি কী মেলে, তবে ম্যাচিং customClaims sessionClaims কী দ্বারা টোকেন দাবিতে ওভাররাইট করা হবে। তবে ওভারউইটেন customClaims কীটি এখনও ভবিষ্যতের অনুরোধগুলির জন্য ডাটাবেসে অব্যাহত থাকবে।

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

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

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

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

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

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

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

জেনেরিক ওআইডিসি সরবরাহকারী

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

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

উদাহরণ:

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

গুগল

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

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

উদাহরণ:

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

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

ফেসবুক

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

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

গিটহাব

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

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

মাইক্রোসফট

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

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

উদাহরণ:

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

ইয়াহু

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

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

লিঙ্কডইন

যখন কোনও ব্যবহারকারী লিংকডইনের সাথে সাইন ইন করে, নিম্নলিখিত শংসাপত্রটি পাস হবে:

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

আপেল

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

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

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

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

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

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

Node.js

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}"`);
  }
});

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

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

Node.js

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

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

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

Node.js

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.`);
  }
});

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

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

Node.js

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

নির্দিষ্ট আইপি ঠিকানাগুলি থেকে সাইন-ইন ব্লক করা

নিম্নলিখিত উদাহরণটি কীভাবে নির্দিষ্ট আইপি ঠিকানা থেকে ব্লক সাইন-ইন রেঞ্জ:

Node.js

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

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

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

Node.js

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. ব্যবহারকারীর সাইন ইন আইপি ঠিকানা ট্র্যাক করতে সেশন দাবিগুলি ব্যবহার করুন:

    Node.js

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

    Node.js

    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!' })
          });
        }
      });
    });
    

ব্যবহারকারীর ফটো স্ক্রিনিং

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

Node.js

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

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

কোনও ব্যবহারকারীর পরিচয় সরবরাহকারী ওআউথ শংসাপত্রগুলি অ্যাক্সেস করা

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

Node.js

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 এন্টারপ্রাইজ রায় ওভাররাইডিং

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

ফায়ারবেস প্রমাণীকরণের সাথে রেকাপ্টকা এন্টারপ্রাইজকে সংহত করার বিষয়ে আরও জানতে রেকাপ্টকা এন্টারপ্রাইজ সক্ষম করুন।

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

Node.js

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',
 }
});