অনুমোদনের সুযোগ

যেসব স্ক্রিপ্ট প্রজেক্ট ব্যবহারকারীদের ডেটা অ্যাক্সেস করে বা তাদের হয়ে কাজ করে, ব্যবহারকারীদের অবশ্যই সেগুলোকে অনুমোদন দিতে হবে। এই প্রক্রিয়াটির একটি সামগ্রিক ধারণা পেতে, ‘Authorization for Google Services’ দেখুন। যখন কোনো ব্যবহারকারী প্রথমবারের মতো অনুমোদন-প্রয়োজনীয় কোনো স্ক্রিপ্ট চালান, তখন ইউজার ইন্টারফেস (UI) অনুমোদন প্রক্রিয়াটি শুরু করার জন্য একটি প্রম্পট প্রদর্শন করে।

এই কার্যপ্রবাহ চলাকালীন, ইউজার ইন্টারফেস (UI) ব্যবহারকারীদের জানিয়ে দেয় যে স্ক্রিপ্টটি কোন কোন অনুমতি চাইছে। উদাহরণস্বরূপ, একটি স্ক্রিপ্ট ইমেল বার্তা পড়ার বা ক্যালেন্ডার ইভেন্ট তৈরি করার অনুমতি চাইতে পারে। স্ক্রিপ্ট প্রজেক্টটি এই স্বতন্ত্র অনুমতিগুলোকে OAuth স্কোপ হিসেবে সংজ্ঞায়িত করে।

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

অনুমোদন প্রক্রিয়ার সময়, অ্যাপস স্ক্রিপ্ট প্রয়োজনীয় স্কোপগুলোর সহজবোধ্য বিবরণ উপস্থাপন করে। উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টের স্প্রেডশিটে শুধুমাত্র-পঠ্য (read-only) অ্যাক্সেসের প্রয়োজন হয়, তাহলে ম্যানিফেস্টে https://www.googleapis.com/auth/spreadsheets.readonly স্কোপটি অন্তর্ভুক্ত থাকতে পারে। অনুমোদন প্রম্পটটি ব্যবহারকারীকে "আপনার গুগল স্প্রেডশিটগুলো দেখুন" (View your Google Spreadsheets) বলে জিজ্ঞাসা করে।

কিছু স্কোপের মধ্যে অন্য স্কোপও অন্তর্ভুক্ত থাকে। উদাহরণস্বরূপ, https://www.googleapis.com/auth/spreadsheets এ অনুমোদিত অ্যাক্সেস স্প্রেডশিটে পড়া এবং লেখার অ্যাক্সেস দেয়।

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

স্কোপ দেখুন

আপনার স্ক্রিপ্ট প্রজেক্টের জন্য প্রয়োজনীয় স্কোপগুলো দেখতে:

  1. স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, Overview ক্লিক করুন।
  3. প্রজেক্ট OAuth স্কোপস-এর অধীনে স্কোপগুলো দেখুন।

সুস্পষ্ট পরিধি নির্ধারণ করুন

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

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

আপনার স্ক্রিপ্ট প্রজেক্ট যে স্কোপগুলো ব্যবহার করে, তা আপনি এর ম্যানিফেস্ট ফাইল সম্পাদনা করে স্পষ্টভাবে সেট করতে পারেন। ' oauthScopes ম্যানিফেস্ট ফিল্ডটি হলো প্রজেক্টে ব্যবহৃত স্কোপগুলোর একটি অ্যারে। আপনার প্রজেক্টের স্কোপ সেট করতে:

  1. স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, প্রজেক্ট ক্লিক করুন।
  3. এডিটরে 'appsscript.json' ম্যানিফেস্ট ফাইল দেখানোর চেকবক্সটি নির্বাচন করুন।
  4. বাম দিকে, ‘এডিটর ক্লিক করুন।
  5. বাম দিকে appsscript.json ফাইলটিতে ক্লিক করুন।
  6. oauthScopes লেবেলযুক্ত শীর্ষ-স্তরের ফিল্ডটি খুঁজুন। যদি এটি উপস্থিত না থাকে, তবে আপনি এটি যোগ করতে পারেন।
  7. প্রজেক্টে আপনি যে স্কোপগুলো ব্যবহার করতে চান, সেগুলো দিয়ে oauthScopes অ্যারের বিষয়বস্তু প্রতিস্থাপন করুন। উদাহরণস্বরূপ:
          {
            ...
            "oauthScopes": [
              "https://www.googleapis.com/auth/spreadsheets.readonly",
              "https://www.googleapis.com/auth/userinfo.email"
            ],
           ...
          }
  8. উপরে, সেভ (Save বাটনে ক্লিক করুন।

সূক্ষ্ম OAuth অনুমতিগুলি পরিচালনা করুন

সরাসরি স্ক্রিপ্ট চালানো ব্যবহারকারীদের জন্য অ্যাপস স্ক্রিপ্ট আইডিই-তে প্রথমে গ্র্যানুলার OAuth কনসেন্ট স্ক্রিনটি চালু করা হয়েছিল। সময়ের সাথে সাথে এই কনসেন্ট স্ক্রিনটি পর্যায়ক্রমে ম্যাক্রো, ট্রিগার এবং অ্যাড-অন-এর মতো অন্যান্য প্ল্যাটফর্মেও প্রকাশ করা হচ্ছে। আরও তথ্যের জন্য, “Granular OAuth consent in Google Apps Script IDE executions” দেখুন।

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

নিম্নলিখিত বিভাগগুলিতে সূক্ষ্ম OAuth অনুমতিগুলি কীভাবে পরিচালনা করতে হয় তা বর্ণনা করা হয়েছে।

প্রয়োজনীয় স্কোপগুলির জন্য স্বয়ংক্রিয়ভাবে অনুমতির প্রয়োজন হবে

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

ScriptApp ক্লাসের নিম্নলিখিত মেথডগুলো অনুমতি যাচাই করে এবং অনুমোদনের জন্য প্রম্পট প্রদর্শন করে:

  • requireScopes(authMode, oAuthScopes) : যেসব ফ্লো নির্দিষ্ট স্কোপের উপর নির্ভর করে, তাদের জন্য এই মেথডটি ব্যবহার করুন।
  • requireAllScopes(authMode) : যদি কোনো এক্সিকিউশন ফ্লো প্রজেক্টের সমস্ত স্কোপের উপর নির্ভর করে, তাহলে এই মেথডটি ব্যবহার করুন।

উদাহরণ

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে requireScopes() এবং requireAllScopes() কল করতে হয়। স্ক্রিপ্টটি Gmail, Sheets, এবং Calendar-এর জন্য স্কোপ ব্যবহার করে। sendEmail() ফাংশনটির জন্য শুধুমাত্র Gmail এবং Sheets-এর স্কোপ প্রয়োজন, অপরদিকে createEventSendEmail() ফাংশনটির জন্য স্ক্রিপ্টে ব্যবহৃত সমস্ত স্কোপ প্রয়োজন।

// This function requires the Gmail and Sheets scopes.
function sendEmail() {
  // Validates that the user has granted permission for the Gmail and Sheets scopes.
  // If not, the execution ends and prompts the user for authorization.
  ScriptApp.requireScopes(ScriptApp.AuthMode.FULL, [
    'https://mail.google.com/',
    'https://www.googleapis.com/auth/spreadsheets'
  ]);

  // Sends an email.
  GmailApp.sendEmail("dana@example.com", "Subject", "Body");
  Logger.log("Email sent successfully!");

  // Opens a spreadsheet and sheet to track the sent email.
  const ss = SpreadsheetApp.openById("abc1234567");
  const sheet = ss.getSheetByName("Email Tracker")

  // Gets the last row of the sheet.
  const lastRow = sheet.getLastRow();

  // Adds "Sent" to column E of the last row of the spreadsheet.
  sheet.getRange(lastRow, 5).setValue("Sent");
  Logger.log("Sheet updated successfully!");
}

// This function requires all scopes used by the script (Gmail,
// Calendar, and Sheets).
function createEventSendEmail() {
  // Validates that the user has granted permission for all scopes used by the
  // script. If not, the execution ends and prompts the user for authorization.
  ScriptApp.requireAllScopes(ScriptApp.AuthMode.FULL);

  // Creates an event.
  CalendarApp.getDefaultCalendar().createEvent(
    "Meeting",
    new Date("November 28, 2024 10:00:00"),
    new Date("November 28, 2024 11:00:00")
  );
  Logger.log("Calendar event created successfully!");

  // Sends an email.
  GmailApp.sendEmail("dana@example.com", "Subject 2", "Body 2");
  Logger.log("Email sent successfully!");

  // Opens a spreadsheet and sheet to track the created meeting and sent email.
  const ss = SpreadsheetApp.openById("abc1234567");
  const sheet = ss.getSheetByName("Email and Meeting Tracker")
  // Gets the last row
  const lastRow = sheet.getLastRow();

  // Adds "Sent" to column E of the last row
  sheet.getRange(lastRow, 5).setValue("Sent");
  // Adds "Meeting created" to column F of the last row
  sheet.getRange(lastRow, 6).setValue("Meeting created");
  Logger.log("Sheet updated successfully!");
}

Create a custom experience for missing scopes

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

অথরাইজেশন ইনফো অবজেক্ট থেকে অনুমতির বিবরণ, যেমন অনুমোদিত স্কোপের তালিকা এবং অনুপস্থিত অনুমতি অনুরোধ করার জন্য URL, পেতে AuthorizationInfo ক্লাসের মেথডগুলো ব্যবহার করুন।

উদাহরণ

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

// This function uses the Gmail scope and skips the email
// capabilities if the scope for Gmail hasn't been granted.
function myFunction() {
  const authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL, ['https://mail.google.com/']);
  if (authInfo.getAuthorizationStatus() === ScriptApp.AuthorizationStatus.NOT_REQUIRED) {
    GmailApp.sendEmail("dana@example.com", "Subject", "Body");
    Logger.log("Email sent successfully!");
  } else {
    const scopesGranted = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL).getAuthorizedScopes();
    console.warn(`Authorized scopes: ${scopesGranted} not enough to send mail, skipping.`);
  }
  // Continue the rest of the execution flow...
}

ট্রিগার কার্যকর করার অনুমতি আছে কিনা তা নিশ্চিত করুন।

ট্রিগারের সাথে যুক্ত ফাংশনগুলো স্বয়ংক্রিয়ভাবে চলে, এবং অনুমতি দেওয়ার জন্য ব্যবহারকারীরা উপস্থিত নাও থাকতে পারেন। আমরা সুপারিশ করি যে, একটি ট্রিগার ইনস্টল করার আগে আপনি requireScopes(authMode, oAuthScopes) ব্যবহার করুন। এটি ব্যবহারকারীর কাছে অনুপস্থিত অনুমতির জন্য জিজ্ঞাসা করে এবং সেগুলো ছাড়া ট্রিগারটি ইনস্টল হতে দেয় না।

উদাহরণ

// This function requires scope Sheets.
function trackFormSubmissions(e){
  // Opens a spreadsheet to track the sent email.
  const ss = SpreadsheetApp.openById("abc1234567");
  const sheet = ss.getSheetByName("Submission Tracker")

  // Gets the last row of the sheet.
  const lastRow = sheet.getLastRow();

  // Adds email address of user that submitted the form
  // to column E of the last row of the spreadsheet.
  sheet.getRange(lastRow, 5).setValue(e.name);
  Logger.log("Sheet updated successfully!");
}

function installTrigger(){
  // Validates that the user has granted permissions for trigger
  // installation and execution. If not, trigger doesn't get
  // installed and prompts the user for authorization.
  ScriptApp.requireScopes(ScriptApp.AuthMode.FULL, [
    'https://www.googleapis.com/auth/script.scriptapp',
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/forms.currentonly'
  ]);
  ScriptApp.newTrigger('trackFormSubmission')
    .forForm(FormApp.getActiveForm())
    .onFormSubmit()
    .create();
}

OAuth যাচাইকরণ

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

সীমাবদ্ধ পরিধি

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

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

পর্যালোচনা প্রক্রিয়া সহজ করার জন্য সম্ভব হলে সীমাবদ্ধ পরিধি ব্যবহার করা এড়িয়ে চলুন। অ-পাবলিক অ্যাপের জন্য আপনি অবাধে সীমাবদ্ধ পরিধি ব্যবহার করতে পারেন।