দানাদার অনুমতিগুলি কীভাবে পরিচালনা করবেন

সংক্ষিপ্ত বিবরণ

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

গ্র্যানুলার পারমিশন বলতে কী বোঝায়?

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

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

সাইন-ইন এবং নন-সাইন-ইন স্কোপ

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

সাইন-ইন এবং নন-সাইন-ইন স্কোপ

একাধিক সাইন-ইন-বিহীন পরিধি

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

একাধিক সাইন-ইন-বিহীন পরিধি

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

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

সাইন-ইন স্কোপের সংখ্যা সাইন-ইন ছাড়া স্কোপের সংখ্যা সূক্ষ্ম অনুমতি সম্মতি স্ক্রিন
১-৩ প্রযোজ্য নয়
১-৩ ১+ প্রযোজ্য
প্রযোজ্য নয়
২+ প্রযোজ্য

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

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

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

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

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

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

গুগল পরিচয় পরিষেবা

নিম্নলিখিত গুগল আইডেন্টিটি সার্ভিসেস জাভাস্ক্রিপ্ট লাইব্রেরির কোড স্নিপেটটি একাধিক নন-সাইন-ইন স্কোপ সহ 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) => {
    ...
  },
});

পাইথন

নিম্নলিখিত কোড স্নিপেটটি অথরাইজেশন রিকোয়েস্ট তৈরি করতে 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'])

নোড.জেএস

নিম্নলিখিত কোড স্নিপেটটি একটি 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 above.
    * 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 প্যারামিটারটিতে সাইন-ইন স্কোপ এবং নন-সাইন-ইন স্কোপ অন্তর্ভুক্ত থাকে।

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

    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 প্যারামিটারটিতে একাধিক নন-সাইন-ইন স্কোপ রয়েছে।

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

  • 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 Services: User Data Policy পর্যালোচনা করুন এবং নিশ্চিত করুন যে আপনি সেগুলি মেনে চলছেন।
  2. কোনো কাজের জন্য প্রয়োজনীয় নির্দিষ্ট স্কোপগুলোর জন্য অনুরোধ করুন । আপনাকে অবশ্যই Google OAuth 2.0-এর সেই নীতি মেনে চলতে হবে, যেখানে বলা আছে যে আপনি শুধুমাত্র প্রয়োজনীয় স্কোপগুলোর জন্যই অনুরোধ করবেন । সাইন-ইন করার সময় একাধিক স্কোপের জন্য অনুরোধ করা থেকে আপনার বিরত থাকা উচিত, যদি না তা আপনার অ্যাপের মূল কার্যকারিতার জন্য অপরিহার্য হয়। বেশ কয়েকটি স্কোপ একসাথে জুড়ে দিলে, বিশেষ করে প্রথমবারের ব্যবহারকারীদের জন্য যারা আপনার অ্যাপ্লিকেশনের বৈশিষ্ট্যগুলোর সাথে পরিচিত নন, তাদের পক্ষে এই অনুমতিগুলোর প্রয়োজনীয়তা বোঝা কঠিন হয়ে যেতে পারে। এর ফলে উদ্বেগ তৈরি হতে পারে এবং ব্যবহারকারীরা আপনার অ্যাপ্লিকেশনটি আরও ব্যবহার করা থেকে বিরত থাকতে পারেন।
  3. অনুমতির অনুরোধ করার আগে ব্যবহারকারীদের কাছে এর যৌক্তিকতা তুলে ধরুন । আপনার অ্যাপ্লিকেশনের কেন এই অনুমতি প্রয়োজন, ব্যবহারকারীর ডেটা দিয়ে আপনি কী করবেন এবং অনুরোধটি অনুমোদন করলে ব্যবহারকারী কীভাবে উপকৃত হবেন, তা স্পষ্টভাবে ব্যাখ্যা করুন। আমাদের গবেষণা অনুযায়ী, এই ধরনের ব্যাখ্যা ব্যবহারকারীর আস্থা ও সম্পৃক্ততা বৃদ্ধি করে।
  4. আপনার অ্যাপ্লিকেশন যখনই স্কোপের জন্য অনুরোধ করে, তখন একাধিক অ্যাক্সেস টোকেন পরিচালনা করার ঝামেলা এড়াতে ইনক্রিমেন্টাল অথরাইজেশন ব্যবহার করুন
  5. ব্যবহারকারীরা কোন কোন স্কোপের অনুমতি দিয়েছেন তা যাচাই করুন । একসাথে একাধিক স্কোপের অনুরোধ করার সময়, ব্যবহারকারীরা আপনার অ্যাপের অনুরোধ করা সমস্ত স্কোপের অনুমতি নাও দিতে পারেন। আপনার অ্যাপের সর্বদা যাচাই করা উচিত যে ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন এবং স্কোপের অনুমতি না দেওয়া হলে প্রাসঙ্গিক ফিচারগুলো নিষ্ক্রিয় করে তা সামাল দেওয়া উচিত। একাধিক স্কোপের জন্য সম্মতি ব্যবস্থাপনার বিষয়ে Google OAuth 2.0-এর নীতিমালা অনুসরণ করুন এবং ব্যবহারকারী যখন স্পষ্টভাবে সেই নির্দিষ্ট ফিচারটি ব্যবহার করার অভিপ্রায় ব্যক্ত করবেন যার জন্য স্কোপটি প্রয়োজন, কেবল তখনই তার কাছে পুনরায় সম্মতির জন্য অনুরোধ করুন।

সূক্ষ্ম অনুমতি ব্যবস্থাপনার জন্য আপনার অ্যাপ্লিকেশনটি আপডেট করুন।

অ্যান্ড্রয়েড অ্যাপ্লিকেশন

Google OAuth 2.0-এর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনি যে SDK-গুলো ব্যবহার করেন সেগুলোর ডকুমেন্টেশন দেখে নিন এবং সেরা অনুশীলন অনুযায়ী সূক্ষ্ম অনুমতিগুলো পরিচালনা করার জন্য আপনার অ্যাপ্লিকেশনটি আপডেট করুন।

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

ক্রোম এক্সটেনশন অ্যাপ্লিকেশন

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

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে সূক্ষ্ম অনুমতিগুলি সঠিকভাবে পরিচালনা করতে হয়।

manifest.json

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

{
  "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 ফাইলটি গুগলের সাথে অনুমোদন প্রক্রিয়া শুরু করার জন্য ক্রোম আইডেন্টিটি এপিআই (Chrome Identity API) ব্যবহার করে। আপনার গ্র্যানুলার পারমিশন (granular permissions) সক্রিয় করা উচিত, যাতে ব্যবহারকারীরা আপনার অ্যাপ্লিকেশনকে অনুমতি দেওয়ার ক্ষেত্রে আরও বেশি নিয়ন্ত্রণ পায়। ব্যবহারকারীরা কোন কোন স্কোপ অনুমোদন করছে তা পরীক্ষা করে আপনার অ্যাপ্লিকেশনটির উচিত তাদের কাছ থেকে আসা প্রতিক্রিয়া সঠিকভাবে পরিচালনা করা।

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-এর সাথে ইন্টারঅ্যাক্ট করার জন্য Google Sign-In for iOS এবং macOS লাইব্রেরি ব্যবহার করেন, তাহলে সূক্ষ্ম অনুমতি পরিচালনার বিষয়ে ডকুমেন্টেশনটি পর্যালোচনা করা উচিত।

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

Google OAuth 2.0-এর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনি যে SDK-গুলো ব্যবহার করেন সেগুলোর ডকুমেন্টেশন দেখে নিন এবং সেরা অনুশীলন অনুযায়ী সূক্ষ্ম অনুমতিগুলো পরিচালনা করার জন্য আপনার অ্যাপ্লিকেশনটি আপডেট করুন।

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

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

নিম্নলিখিত কোড স্নিপেটটি দুটি নন-সাইন-ইন স্কোপের জন্য অনুরোধ করার একটি 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 above
  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 Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 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 above
  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 Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 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 OAuth 2.0-এর সাথে ইন্টারঅ্যাক্ট করার জন্য Google Identity Services জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করে, তাদের সূক্ষ্ম অনুমতি পরিচালনার বিষয়ে এই ডকুমেন্টেশনটি পর্যালোচনা করা উচিত।
  • যেসব অ্যাপ্লিকেশন জাভাস্ক্রিপ্ট ব্যবহার করে সরাসরি গুগল OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টে কল করে, তাদের গ্র্যানুলার পারমিশন পরিচালনার বিষয়ে এই ডকুমেন্টেশনটি পর্যালোচনা করা উচিত।

সূক্ষ্ম অনুমতি ব্যবস্থাপনার ক্ষেত্রে আপনার হালনাগাদ করা অ্যাপ্লিকেশনটি পরীক্ষা করুন।

  1. ব্যবহারকারীরা অনুমতির অনুরোধে কোন কোন ক্ষেত্রে সাড়া দিতে পারে এবং আপনার অ্যাপ্লিকেশন থেকে কী ধরনের আচরণ প্রত্যাশিত, তার একটি রূপরেখা দিন । উদাহরণস্বরূপ, যদি ব্যবহারকারী অনুরোধ করা তিনটি স্কোপের মধ্যে কেবল দুটিকে অনুমোদন দেয়, তবে আপনার অ্যাপ্লিকেশনটির আচরণ সেই অনুযায়ী হওয়া উচিত।
  2. গ্র্যানুলার পারমিশন সক্রিয় করে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করুন । গ্র্যানুলার পারমিশন সক্রিয় করার দুটি উপায় রয়েছে:
    1. আপনার অ্যাপ্লিকেশনের জন্য গ্র্যানুলার পারমিশন আগে থেকেই সক্রিয় করা আছে কিনা তা দেখতে আপনার অ্যাপ্লিকেশনের OAuth 2.0 কনসেন্ট স্ক্রিনগুলো পরীক্ষা করুন। এছাড়াও, পরীক্ষার উদ্দেশ্যে আপনি Google Cloud কনসোলের মাধ্যমে একটি নতুন ওয়েব, অ্যান্ড্রয়েড বা iOS Google OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে পারেন, কারণ সেগুলোর জন্য গ্র্যানুলার পারমিশন সর্বদা সক্রিয় থাকে।
    2. Google OAuth অথরাইজেশন এন্ডপয়েন্টগুলো কল করার সময় enable_granular_consent প্যারামিটারটি ` true তে সেট করুন। কিছু SDK-তে এই প্যারামিটারটির জন্য সুস্পষ্ট সাপোর্ট রয়েছে। অন্যগুলোর ক্ষেত্রে, কীভাবে এই প্যারামিটার এবং এর ভ্যালু ম্যানুয়ালি যোগ করা যায় তা জানতে ডকুমেন্টেশন দেখুন। যদি আপনার ইমপ্লিমেন্টেশন প্যারামিটারটি যোগ করা সাপোর্ট না করে, তাহলে পূর্ববর্তী পয়েন্টে উল্লিখিত পদ্ধতি অনুযায়ী শুধুমাত্র পরীক্ষার উদ্দেশ্যে আপনি Google Cloud কনসোলের মাধ্যমে একটি নতুন ওয়েব, অ্যান্ড্রয়েড বা iOS Google OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে পারেন।
  3. আপনার আপডেট করা অ্যাপ্লিকেশনটি পরীক্ষা করার সময়, ওয়ার্কস্পেস অ্যাকাউন্টের পরিবর্তে একটি ব্যক্তিগত গুগল অ্যাকাউন্ট (@gmail.com) ব্যবহার করুন। এর কারণ হলো , ডোমেন-ব্যাপী কর্তৃত্ব অর্পণ করা বা বিশ্বস্ত (Trusted) হিসেবে চিহ্নিত ওয়ার্কস্পেস এন্টারপ্রাইজ অ্যাপগুলো এই মুহূর্তে সূক্ষ্ম অনুমতির (granular permissions) পরিবর্তন দ্বারা প্রভাবিত হয় না। তাই, আপনার প্রতিষ্ঠানের ওয়ার্কস্পেস অ্যাকাউন্ট দিয়ে পরীক্ষা করলে নতুন সূক্ষ্ম সম্মতির স্ক্রিনটি প্রত্যাশিতভাবে নাও দেখা যেতে পারে।