বিভিন্ন লেভেলে অনুমতি কীভাবে ম্যানেজ করবেন

এক নজরে

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

গ্র্যানুলার অনুমতি কী?

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

একাধিক নন-সাইন-ইন স্কোপের অনুরোধ করা হলে

সাইন-ইন ও নন-সাইন-ইন স্কোপ

যেসব অ্যাপ্লিকেশন সাইন-ইন এবং সাইন-ইন নয় এমন স্কোপের জন্য অনুরোধ করে, ব্যবহারকারীরা প্রথমে সাইন-ইন স্কোপের (email, profile, এবং openid) জন্য সম্মতি পৃষ্ঠা দেখতে পান। ব্যবহারকারীরা তাদের প্রাথমিক পরিচয় তথ্য (নাম, ইমেল আইডি এবং প্রোফাইল ফটো) শেয়ার করার জন্য সম্মতি দেওয়ার পরে, ব্যবহারকারীরা সাইন-ইন নয় এমন স্কোপের জন্য একটি গ্রানুলার অনুমতি সম্মতি স্ক্রিন দেখতে পাবেন। এই ক্ষেত্রে, অ্যাপ্লিকেশনটিকে অবশ্যই ব্যবহারকারীদের দ্বারা কোন কোন স্কোপ মঞ্জুর করা হয়েছে তা পরীক্ষা করতে হবে এবং ব্যবহারকারীরা সমস্ত অনুরোধ করা স্কোপ মঞ্জুর করেছেন বলে ধরে নিতে পারবে না। নিম্নলিখিত উদাহরণে, ওয়েব অ্যাপ্লিকেশন তিনটি সাইন-ইন স্কোপ এবং একটি Google Drive নন-সাইন-ইন স্কোপের জন্য অনুরোধ করে। ব্যবহারকারী সাইন-ইন স্কোপে সম্মতি দেওয়ার পরে, Google Drive-এর অনুমতির জন্য ব্যবহারকারীকে দানাদার অনুমতির সম্মতি স্ক্রিন দেখানো হবে:

সাইন-ইন ও নন-সাইন-ইন স্কোপ

একাধিক নন-সাইন-ইন স্কোপ

অ্যাপ্লিকেশন একাধিক নন-সাইন-ইন স্কোপের জন্য অনুরোধ করলে ব্যবহারকারীদের একটি গ্র্যানুলার অনুমতি সম্মতি স্ক্রিন দেখানো হবে। ব্যবহারকারীরা বেছে নিতে পারবেন যে তারা অ্যাপ্লিকেশনের সাথে শেয়ার করার জন্য কোন কোন অনুমতি অনুমোদন করতে চান। ব্যবহারকারীর Gmail মেসেজ ও Google Calendar ডেটা অ্যাক্সেস করার অনুরোধ জানিয়ে গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিনের একটি উদাহরণ নিচে দেওয়া হল:

একাধিক নন-সাইন-ইন স্কোপ

যেসব অ্যাপ্লিকেশন শুধুমাত্র সাইন-ইন স্কোপ (email, profile এবং openid) অনুরোধ করে, সেগুলির ক্ষেত্রে গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন প্রযোজ্য নয়। ব্যবহারকারী সম্পূর্ণ সাইন-ইন অনুরোধ অনুমোদন বা প্রত্যাখ্যান করেন। অন্য কথায়, অ্যাপ্লিকেশন যদি শুধু সাইন-ইন স্কোপের (একটি, দুটি বা তিনটিই) জন্য অনুরোধ করে, তাহলে গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন প্রযোজ্য নয়।

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

সাইন-ইন স্কোপের সংখ্যা সাইন-ইন না করা স্কোপের সংখ্যা বিভিন্ন লেভেলে অনুমতির সম্মতি সংক্রান্ত স্ক্রিন
1-3 0 প্রযোজ্য নয়
1-3 ১+ প্রযোজ্য
0 1 প্রযোজ্য নয়
0 ২+ প্রযোজ্য

আপনার অ্যাপ্লিকেশন প্রভাবিত হয়েছে কিনা তা নির্ধারণ করুন

আপনার অ্যাপ্লিকেশনের সব বিভাগ ভালভাবে পর্যালোচনা করুন যেখানে অনুমতির অনুরোধের জন্য Google OAuth 2.0 অনুমোদনের এন্ডপয়েন্ট ব্যবহার করা হয়। যেসব অ্যাপ একাধিক স্কোপের জন্য অনুরোধ করে সেগুলির দিকে মনোযোগ দিন, কারণ সেগুলি ব্যবহারকারীদের কাছে উপস্থাপিত গ্রানুলার অনুমতি সম্মতি স্ক্রিনগুলি সক্রিয় করে। এই ধরনের ক্ষেত্রে, আপনার কোড যাতে ব্যবহারকারীর অনুমোদিত কিছু স্কোপ ম্যানেজ করতে পারে তা নিশ্চিত করুন।

আপনার অ্যাপ্লিকেশন একাধিক স্কোপ ব্যবহার করছে কিনা তা কীভাবে নির্ধারণ করবেন

আপনার অ্যাপের মাধ্যমে করা Google OAuth 2.0 অনুমোদনের অনুরোধ গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখাবে কিনা তা নির্ধারণ করতে, আপনার অ্যাপ কোড বা আউটগোয়িং নেটওয়ার্ক কল পরীক্ষা করুন।

আপনার অ্যাপ্লিকেশন কোড পরীক্ষা করুন

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

Google Identity সম্পর্কিত পরিষেবা

নিম্নলিখিত Google Identity Services জাভাস্ক্রিপ্ট লাইব্রেরি কোড স্নিপেট একাধিক নন-সাইন-ইন স্কোপ সহ TokenClient শুরু করে। ওয়েব অ্যাপ ব্যবহারকারীর থেকে অনুমোদনের অনুরোধ করলে, গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখানো হবে।

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly \
  https://www.googleapis.com/auth/contacts.readonly',
  callback: (response) => {
    ...
  },
});

Python

নিম্নলিখিত কোড স্নিপেট google-auth-oauthlib.flow মডিউল ব্যবহার করে অনুমোদনের অনুরোধ তৈরি করে; scope প্যারামিটারে দুটি সাইন-ইন ছাড়া স্কোপ অন্তর্ভুক্ত থাকে। ওয়েব অ্যাপ্লিকেশন ব্যবহারকারীর থেকে অনুমোদনের অনুরোধ করলে, গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখানো হবে।

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are
# required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=[
        'https://www.googleapis.com/auth/calendar.readonly',
        'https://www.googleapis.com/auth/contacts.readonly'
    ])

Node.js

নিম্নলিখিত কোড স্নিপেট একটি google.auth.OAuth2 অবজেক্ট তৈরি করে, যা অনুমোদনের অনুরোধে প্যারামিটারগুলি সংজ্ঞায়িত করে যার scope প্যারামিটারে দুটি নন-সাইন-ইন স্কোপ অন্তর্ভুক্ত থাকে। ওয়েব অ্যাপ ব্যবহারকারীর থেকে অনুমোদনের অনুরোধ করলে গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখানো হবে।

const {google} = require('googleapis');

/**
  * To use OAuth2 authentication, we need access to a CLIENT_ID,
  * CLIENT_SECRET, AND REDIRECT_URI from the client_secret.json file.
  * To get these credentials for your application, visit
  * https://console.cloud.google.com/apis/credentials.
  */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Calendar and Contacts.
const scopes = [
  'https://www.googleapis.com/auth/calendar.readonly',
  'https://www.googleapis.com/auth/contacts.readonly']
];

// Generate a url that asks permissions
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined earlier.
    * Alternatively, if only one scope is needed, you can pass a scope URL
    * as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

আউটগোয়িং নেটওয়ার্ক কল পরীক্ষা করুন

আপনার অ্যাপ্লিকেশনের ধরনের উপর নির্ভর করে নেটওয়ার্ক কল পরীক্ষা করার পদ্ধতি আলাদা হবে।

নেটওয়ার্ক কল পরীক্ষা করার সময়, Google OAuth অনুমোদন এন্ডপয়েন্টে পাঠানো অনুরোধগুলি দেখুন এবং scope প্যারামিটার পরীক্ষা করুন।

এইসব ভ্যালুর কারণে গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখানো হয়।

  • scope প্যারামিটারে সাইন-ইন স্কোপ ও নন-সাইন-ইন স্কোপ রয়েছে।

    নিম্নলিখিত স্যাম্পেল অনুরোধে তিনটি সাইন-ইন স্কোপ এবং ব্যবহারকারীর Google Drive ফাইলের মেটাডেটা দেখার জন্য একটি নন-সাইন-ইন স্কোপ রয়েছে:

    https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID
  • scope প্যারামিটারে একাধিক নন-সাইন-ইন স্কোপ রয়েছে।

    নিম্নলিখিত স্যাম্পেল অনুরোধে দুটি নন-সাইন-ইন স্কোপ আছে যা ব্যবহারকারীর Google Drive মেটাডেটা দেখতে এবং নির্দিষ্ট Google Drive ফাইল ম্যানেজ করতে ব্যবহার করা হয়:

    https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID

বিভিন্ন লেভেলে অনুমতি ম্যানেজ করার পেশাদার পদ্ধতি

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

  1. Google API পরিষেবা: ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং আপনি সেগুলি মেনে চলছেন কিনা তা নিশ্চিত করুন।
  2. কোনও টাস্কের জন্য প্রয়োজনীয় নির্দিষ্ট স্কোপের জন্য অনুরোধ করুন। আপনাকে Google OAuth 2.0 নীতি মেনে চলতে হবে, যার অর্থ হল আপনার শুধু যে স্কোপ প্রয়োজন, সেটির জন্যই অনুরোধ করতে পারবেন। সাইন-ইন করার সময় একাধিক স্কোপের জন্য অনুরোধ করা এড়িয়ে চলুন, যদি না এটি আপনার অ্যাপের মূল কার্যকারিতার জন্য অপরিহার্য হয়। একাধিক স্কোপ একসাথে বান্ডিল করা, বিশেষ করে প্রথমবার ব্যবহারকারীদের জন্য যারা আপনার অ্যাপ্লিকেশনের ফিচারের সাথে পরিচিত নন, তাদের জন্য এইসব অনুমতির প্রয়োজনীয়তা বোঝা চ্যালেঞ্জিং হতে পারে। এর ফলে ব্যবহারকারীরা সতর্ক হয়ে যেতে পারেন এবং আপনার অ্যাপ্লিকেশনের সাথে আর নাও যুক্ত হতে পারেন।
  3. অনুমোদনের অনুরোধ করার আগে ব্যবহারকারীদের কাছে যুক্তি প্রদান করুন। আপনার অ্যাপ্লিকেশনের কেন অনুরোধ করা অনুমতি প্রয়োজন, ব্যবহারকারীর ডেটা দিয়ে আপনি কী করবেন এবং অনুরোধটি অনুমোদন করলে ব্যবহারকারী কীভাবে উপকৃত হবেন তা স্পষ্টভাবে ব্যাখ্যা করুন। আমাদের রিসার্চ থেকে জানা গেছে যে এই ব্যাখ্যা ব্যবহারকারীর বিশ্বাস ও এনগেজমেন্ট বাড়ায়।
  4. একাধিক অ্যাক্সেস টোকেন ম্যানেজ করার ঝামেলা এড়াতে, আপনার অ্যাপ্লিকেশন যখনই স্কোপের অনুরোধ করে, তখনই ইনক্রিমেন্টাল অনুমোদন ব্যবহার করুন।
  5. ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করুন। একসাথে একাধিক স্কোপের জন্য অনুরোধ করার সময়, ব্যবহারকারী আপনার অ্যাপের অনুরোধ করা সব স্কোপের অনুমতি নাও দিতে পারেন। আপনার অ্যাপকে সবসময় চেক করতে হবে যে ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন এবং কোনও স্কোপের অনুমতি না দিলে, প্রাসঙ্গিক ফিচার বন্ধ করে দিয়ে সেই পরিস্থিতি সামলাতে হবে। একাধিক স্কোপের জন্য সম্মতি ম্যানেজ করা সংক্রান্ত Google OAuth 2.0 নীতি অনুসরণ করুন এবং ব্যবহারকারী স্কোপ প্রয়োজন এমন নির্দিষ্ট ফিচার ব্যবহার করার ইচ্ছা স্পষ্টভাবে প্রকাশ করলে তবেই তাকে আবার সম্মতির জন্য প্রম্পট করুন।

বিভিন্ন লেভেলে অনুমতি ম্যানেজ করতে আপনার অ্যাপ্লিকেশন আপডেট করুন

Android অ্যাপ্লিকেশন

Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করার জন্য আপনি যে SDK ব্যবহার করেন তার ডকুমেন্টেশন আপনার কনসাল্ট করা উচিত এবং পেশাদার পদ্ধতি-এর উপর ভিত্তি করে গ্র্যানুলার অনুমতি ম্যানেজ করার জন্য আপনার অ্যাপ্লিকেশন আপডেট করা উচিত।

Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করতে আপনি Play Services থেকে auth.api.signin SDK ব্যবহার করলে, প্রয়োজনীয় স্কোপের সবচেয়ে ছোট সেট অনুরোধ করতে requestPermissions ফাংশন ব্যবহার করতে পারবেন এবং গ্র্যানুলার অনুমতির অনুরোধ করার সময় ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করতে hasPermissions ফাংশন ব্যবহার করতে পারবেন।

Chrome এক্সটেনশন অ্যাপ্লিকেশন

সেরা পদ্ধতি অনুযায়ী Google OAuth 2.0-এর সাথে কাজ করার জন্য আপনার Chrome Identity API ব্যবহার করা উচিত।

গ্র্যানুলার অনুমতি কীভাবে সঠিকভাবে ম্যানেজ করতে হয় তা নিম্নলিখিত উদাহরণ থেকে দেখুন।

manifest.json

উদাহরণ হিসেবে দেখানো ম্যানিফেস্ট ফাইল Chrome এক্সটেনশন অ্যাপ্লিকেশনের জন্য দুটি সাইন-ইন না করা স্কোপ ঘোষণা করে।

{
  "name": "Example Chrome extension application",
  ...
  "permissions": [
      "identity"
    ],
  "oauth2" : {
      "client_id": "YOUR_CLIENT_ID",
      "scopes":[
        "https://www.googleapis.com/auth/calendar.readonly",
        "https://www.googleapis.com/auth/contacts.readonly"
      ]
  }
}

ভুল পদ্ধতি

সব বা কিছুই না

ব্যবহারকারী অনুমোদনের প্রসেস শুরু করতে বোতামে ক্লিক করেন। কোড স্নিপেট ধরে নেয় যে ব্যবহারকারীদের manifest.json ফাইলে নির্দিষ্ট করা দুটি স্কোপের জন্য "সব-অথবা-কিছুই-নয়" সম্মতি স্ক্রিন দেখানো হয়েছে। ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করা হয় না।

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken({ interactive: true },
      function (token) {
          if (token === undefined) {
            // User didn't authorize both scopes.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized both or one of the scopes.
            // It neglects to check which scopes users granted and assumes
            // users granted all scopes.

            // Calling the APIs, etc.
            ...
          }
      });
});

সঠিক পদ্ধতি

সবচেয়ে ছোট স্কোপ

প্রয়োজনীয় স্কোপের সবচেয়ে ছোট সেট বেছে নিন

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

এই উদাহরণে, এটি ধরে নেওয়া হয়েছে যে manifest.json ফাইলে ঘোষিত দুটি স্কোপই হল প্রয়োজনীয় স্কোপের সবচেয়ে ছোট সেট। oauth.js ফাইলটি Google-এর সাথে অনুমোদনের প্রক্রিয়া শুরু করতে Chrome Identity API ব্যবহার করে। গ্র্যানুলার অনুমতি চালু করতে আপনাকে সম্মতি জানাতে হবে, যাতে ব্যবহারকারীরা আপনার অ্যাপ্লিকেশনকে অনুমতি দেওয়ার ক্ষেত্রে আরও বেশি নিয়ন্ত্রণ পান। ব্যবহারকারী কোন কোন স্কোপ অনুমোদন করছেন তা চেক করার মাধ্যমে আপনার অ্যাপ্লিকেশনকে ব্যবহারকারীর থেকে পাওয়া উত্তর সঠিকভাবে ম্যানেজ করতে হবে।

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken(
      { interactive: true, enableGranularPermissions: true },
      function (token, grantedScopes) {
          if (token === undefined) {
            // User didn't authorize any scope.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized the request. Now, check which scopes were
            // granted.
            if (grantedScopes.includes(
                'https://www.googleapis.com/auth/calendar.readonly'))
            {
              // User authorized Calendar read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Calendar read permission.
              // Update UX and application accordingly
              ...
            }

            if (grantedScopes.includes(
                'https://www.googleapis.com/auth/contacts.readonly'))
            {
              // User authorized Contacts read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Contacts read permission.
              // Update UX and application accordingly
              ...
            }
          }
      });
});

iOS, iPadOS ও macOS অ্যাপ্লিকেশন

Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করার জন্য আপনি যে SDK ব্যবহার করেন তার ডকুমেন্টেশন আপনার কনসাল্ট করা উচিত এবং পেশাদার পদ্ধতি-এর উপর ভিত্তি করে গ্র্যানুলার অনুমতি ম্যানেজ করার জন্য আপনার অ্যাপ্লিকেশন আপডেট করা উচিত।

Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করার জন্য আপনি iOS ও macOS-এর জন্য Google Sign-In লাইব্রেরি ব্যবহার করলে, গ্র্যানুলার অনুমতি ম্যানেজ করার ব্যাপারে ডকুমেন্টেশন আপনার পর্যালোচনা করা উচিত।

ওয়েব অ্যাপ্লিকেশন

Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করার জন্য আপনি যে SDK ব্যবহার করেন তার ডকুমেন্টেশন আপনার কনসাল্ট করা উচিত এবং পেশাদার পদ্ধতি-এর উপর ভিত্তি করে গ্র্যানুলার অনুমতি ম্যানেজ করার জন্য আপনার অ্যাপ্লিকেশন আপডেট করা উচিত।

সার্ভার-সাইড (অফলাইন) অ্যাক্সেস

সার্ভার-সাইড (অফলাইন) অ্যাক্সেস মোডের জন্য আপনাকে নিম্নলিখিত কাজগুলি করতে হবে:

  • একটি সার্ভার সেট-আপ করুন এবং সর্বজনীনভাবে অ্যাক্সেসযোগ্য এন্ডপয়েন্ট নির্ধারণ করুন যাতে অনুমোদন কোড পাওয়া যায়।
  • Google Cloud কনসোলের ক্লায়েন্ট পৃষ্ঠায় আপনার পাবলিক এন্ডপয়েন্টের রিডাইরেক্ট URI কনফিগার করুন।

নিম্নলিখিত কোড স্নিপেট NodeJS-এর একটি উদাহরণ দেখায় যা দুটি সাইন-ইন না করা স্কোপের জন্য অনুরোধ করে। ব্যবহারকারীরা গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখতে পাবেন।

ভুল পদ্ধতি

সব বা কিছুই না

ব্যবহারকারীদের অনুমোদনের URL-এ রিডাইরেক্ট করা হয়। কোড স্নিপেট ধরে নেয় যে ব্যবহারকারীদের scopes অ্যারেতে নির্দিষ্ট করা দুটি স্কোপের জন্য "সব-বা-কিছুই-না" সম্মতি স্ক্রিন দেখানো হয়েছে। ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করা হয় না।

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts
// scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined earlier
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to the Google authorization server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from the Google authorization server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google authorization server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // User authorized both or one of the scopes.
        // It neglects to check which scopes users granted and assumes users
        // granted all scopes.

        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        // Calling the APIs, etc.
        ...
      }
    }
    res.end();
  }).listen(80);
}
সঠিক পদ্ধতি

সবচেয়ে ছোট স্কোপ

প্রয়োজনীয় স্কোপের সবচেয়ে ছোট সেট বেছে নিন

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

আপনার অ্যাপ্লিকেশনকে একাধিক নন-সাইন-ইন স্কোপের জন্য অনুরোধ করতে হলে, অনুরোধ করার সময় আপনাকে সর্বদা ইনক্রিমেন্টাল অনুমোদন ব্যবহার করতে হবে এবং ব্যবহারকারীরা কোন স্কোপের অনুমতি দিয়েছেন তা চেক করতে হবে।

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

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts
// scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined earlier
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true,
  // Set to true to enable more granular permissions for Google OAuth 2.0
  // client IDs created before 2019. No effect for newer Google OAuth 2.0
  // client IDs, since more granular permissions is always enabled for them.
  enable_granular_consent: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Redirect users to the Google authorization server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from the Google authorization server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google authorization server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        // User authorized the request. Now, check which scopes were
        // granted.
        if (tokens.scope.includes(
            'https://www.googleapis.com/auth/calendar.readonly'))
        {
          // User authorized Calendar read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Calendar read permission.
          // Calling the APIs, etc.
          ...
        }

        // Check which scopes user granted the permission to application
        if (tokens.scope.includes(
            'https://www.googleapis.com/auth/contacts.readonly'))
        {
          // User authorized Contacts read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Contacts read permission.
          // Update UX and application accordingly
          ...
        }
      }
    }
    res.end();
  }).listen(80);
}

সার্ভার-ভিত্তিক অ্যাপ্লিকেশন থেকে কীভাবে Google API অ্যাক্সেস করবেন সেই সম্পর্কে সার্ভার-সাইড ওয়েব অ্যাপ গাইড পর্যালোচনা করুন।

শুধুমাত্র ক্লায়েন্ট-সাইড অ্যাক্সেস

  • Google OAuth 2.0-এর সাথে ইন্টার‍্যাক্ট করার জন্য যেসব অ্যাপ্লিকেশন Google Identity Services JavaScript লাইব্রেরি ব্যবহার করে, গ্র্যানুলার অনুমতি ম্যানেজ করার জন্য আপনাকে এই ডকুমেন্টেশন পর্যালোচনা করতে হবে।
  • যেসব অ্যাপ্লিকেশন সরাসরি JavaScript ব্যবহার করে Google OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টে কল করে, সেগুলির ক্ষেত্রে গ্র্যানুলার অনুমতি ম্যানেজ করার জন্য আপনাকে এই ডকুমেন্টেশন পর্যালোচনা করতে হবে।

বিভিন্ন লেভেলে অনুমতি ম্যানেজ করার ক্ষেত্রে আপনার আপডেট করা অ্যাপ্লিকেশন পরীক্ষা করুন

  1. ব্যবহারকারী অনুমতির অনুরোধে উত্তর দিতে পারেন এমন সব পরিস্থিতি এবং আপনার অ্যাপ্লিকেশনের থেকে প্রত্যাশিত আচরণ আউটলাইন করুন। যেমন, ব্যবহারকারী যদি অনুরোধ করা তিনটি স্কোপের মধ্যে মাত্র দুটিতে অনুমতি দেন, তাহলে আপনার অ্যাপ্লিকেশনকে সেই অনুযায়ী কাজ করতে হবে।
  2. বিভিন্ন লেভেলে অনুমতি চালু করে আপনার অ্যাপ্লিকেশন টেস্ট করুন। বিভিন্ন স্তরে অনুমতি চালু করার দুটি উপায় আছে:

    1. আপনার অ্যাপ্লিকেশনের জন্য গ্র্যানুলার অনুমতি আগে থেকেই চালু আছে কিনা তা দেখতে আপনার অ্যাপ্লিকেশনের OAuth 2.0 সম্মতি সংক্রান্ত স্ক্রিন চেক করুন। এছাড়াও, আপনি পরীক্ষার উদ্দেশ্যে Google Cloud Console-এর মাধ্যমে একটি নতুন ওয়েব, Android বা iOS Google OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে পারেন কারণ তাদের জন্য গ্র্যানুলার অনুমতি সবসময় চালু থাকে।
    2. Google OAuth অনুমোদন এন্ডপয়েন্ট কল করার সময় enable_granular_consent প্যারামিটারটি true-এ সেট করুন। কিছু SDK-তে এই প্যারামিটারের জন্য স্পষ্ট সহায়তা রয়েছে। অন্যান্যদের জন্য, আপনি কীভাবে এই প্যারামিটার এবং এর মান ম্যানুয়ালি যোগ করতে পারেন তা দেখতে ডকুমেন্টেশন চেক করুন। আপনার ইমপ্লিমেন্টেশনে প্যারামিটার যোগ করার সুবিধা না থাকলে, আপনি শুধু পরীক্ষার উদ্দেশ্যে Google Cloud কনসোলের মাধ্যমে নতুন ওয়েব, Android বা iOS Google OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে পারেন, যেমনটি আগের পয়েন্টে বলা হয়েছে।

  3. আপনার আপডেট করা অ্যাপ্লিকেশন পরীক্ষা করার সময়, Workspace অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত Google অ্যাকাউন্ট (@gmail.com) ব্যবহার করুন। এর কারণ হল, ডোমেন-জুড়ে কর্তৃত্বের ডেলিগেশন সহ Workspace Enterprise অ্যাপ অথবা বিশ্বস্ত হিসেবে চিহ্নিত অ্যাপ এই মুহূর্তে গ্র্যানুলার অনুমতিতে করা পরিবর্তনের দ্বারা প্রভাবিত হয় না। তাই, আপনার সংস্থার Workspace অ্যাকাউন্ট দিয়ে পরীক্ষা করলে, নতুন গ্র্যানুলার সম্মতি সংক্রান্ত স্ক্রিন হয়ত প্রত্যাশা অনুযায়ী দেখা যাবে না।