ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশনের জন্য OAuth 2.0

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

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

এই প্রবাহে, আপনার অ্যাপ্লিকেশানটি একটি Google URL খোলে যা আপনার অ্যাপ্লিকেশান এবং অ্যাপটির প্রয়োজনীয় API অ্যাক্সেস শনাক্ত করতে কোয়েরি প্যারামিটার ব্যবহার করে৷ আপনি বর্তমান ব্রাউজার উইন্ডোতে বা একটি পপআপে URL খুলতে পারেন। ব্যবহারকারী Google এর সাথে প্রমাণীকরণ করতে পারে এবং অনুরোধকৃত অনুমতি প্রদান করতে পারে। Google তারপর ব্যবহারকারীকে আপনার অ্যাপে পুনঃনির্দেশ করে। পুনঃনির্দেশে একটি অ্যাক্সেস টোকেন রয়েছে, যা আপনার অ্যাপ যাচাই করে এবং তারপর API অনুরোধ করতে ব্যবহার করে।

গুগল এপিআই ক্লায়েন্ট লাইব্রেরি এবং গুগল আইডেন্টিটি সার্ভিস

আপনি যদি Google-এ অনুমোদিত কল করার জন্য JavaScript-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তাহলে OAuth 2.0 ফ্লো পরিচালনা করতে আপনার Google আইডেন্টিটি পরিষেবা জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করা উচিত। অনুগ্রহ করে Google পরিচয় পরিষেবার টোকেন মডেল দেখুন, যা OAuth 2.0 অন্তর্নিহিত অনুদান প্রবাহের উপর ভিত্তি করে।

পূর্বশর্ত

আপনার প্রকল্পের জন্য API সক্ষম করুন

Google API-কে কল করে এমন যেকোনো অ্যাপ্লিকেশনে সেই APIগুলিকে সক্ষম করতে হবে৷ API Console.

আপনার প্রকল্পের জন্য একটি API সক্ষম করতে:

  1. Open the API Library মধ্যে Google API Console.
  2. If prompted, select a project, or create a new one.
  3. দ API Library পণ্য পরিবার এবং জনপ্রিয়তা দ্বারা গোষ্ঠীবদ্ধ সমস্ত উপলব্ধ API তালিকা করে। আপনি যে APIটি সক্ষম করতে চান তা তালিকায় দৃশ্যমান না হলে, এটি খুঁজতে অনুসন্ধান ব্যবহার করুন, অথবা এটি যে পণ্যের পরিবারে রয়েছে তার সমস্ত দেখুন ক্লিক করুন৷
  4. আপনি যে APIটি সক্ষম করতে চান তা নির্বাচন করুন, তারপর সক্ষম বোতামটি ক্লিক করুন।
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

অনুমোদনের শংসাপত্র তৈরি করুন

Google APIগুলি অ্যাক্সেস করতে OAuth 2.0 ব্যবহার করে এমন যেকোনো অ্যাপ্লিকেশনের অনুমোদনের শংসাপত্র থাকতে হবে যা Google-এর OAuth 2.0 সার্ভারে অ্যাপ্লিকেশনটিকে সনাক্ত করে৷ নিম্নলিখিত ধাপগুলি ব্যাখ্যা করে কিভাবে আপনার প্রকল্পের জন্য শংসাপত্র তৈরি করতে হয়। আপনার অ্যাপ্লিকেশনগুলি তারপরে সেই প্রকল্পের জন্য সক্ষম করা APIগুলি অ্যাক্সেস করতে শংসাপত্রগুলি ব্যবহার করতে পারে৷

  1. Go to the Credentials page.
  2. ক্রেডেনশিয়াল তৈরি করুন > OAuth ক্লায়েন্ট আইডি ক্লিক করুন।
  3. ওয়েব অ্যাপ্লিকেশন অ্যাপ্লিকেশন প্রকার নির্বাচন করুন.
  4. ফর্মটি পূরণ করুন। অনুমোদিত Google API অনুরোধগুলি করতে জাভাস্ক্রিপ্ট ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিকে অবশ্যই অনুমোদিত জাভাস্ক্রিপ্ট উত্স নির্দিষ্ট করতে হবে৷ উত্সগুলি সেই ডোমেনগুলিকে সনাক্ত করে যেগুলি থেকে আপনার অ্যাপ্লিকেশনটি OAuth 2.0 সার্ভারে অনুরোধ পাঠাতে পারে৷ এই উত্সগুলিকে অবশ্যই Google এর বৈধতা নিয়ম মেনে চলতে হবে৷

অ্যাক্সেস স্কোপ সনাক্ত করুন

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

আপনি OAuth 2.0 অনুমোদন কার্যকর করা শুরু করার আগে, আমরা সুপারিশ করি যে আপনি সেই সুযোগগুলি সনাক্ত করুন যেগুলি অ্যাক্সেস করার জন্য আপনার অ্যাপের অনুমতির প্রয়োজন হবে৷

OAuth 2.0 API স্কোপ নথিতে স্কোপের একটি সম্পূর্ণ তালিকা রয়েছে যা আপনি Google API অ্যাক্সেস করতে ব্যবহার করতে পারেন।

OAuth 2.0 অ্যাক্সেস টোকেন প্রাপ্ত করা

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

ধাপ 1: Google এর OAuth 2.0 সার্ভারে পুনঃনির্দেশ করুন

ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতির অনুরোধ করতে, ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে পুনঃনির্দেশ করুন৷

OAuth 2.0 এন্ডপয়েন্ট

https://accounts.google.com/o/oauth2/v2/auth এ Google-এর OAuth 2.0 এন্ডপয়েন্ট থেকে অ্যাক্সেসের অনুরোধ করার জন্য একটি URL তৈরি করুন। এই শেষ বিন্দু HTTPS এর মাধ্যমে অ্যাক্সেসযোগ্য; সরল HTTP সংযোগ প্রত্যাখ্যান করা হয়.

Google অনুমোদন সার্ভার ওয়েব সার্ভার অ্যাপ্লিকেশনের জন্য নিম্নলিখিত ক্যোয়ারী স্ট্রিং পরামিতি সমর্থন করে:

পরামিতি
client_id প্রয়োজন

আপনার আবেদনের জন্য ক্লায়েন্ট আইডি। আপনি এই মান খুঁজে পেতে পারেন API ConsoleCredentials page.

redirect_uri প্রয়োজন

ব্যবহারকারী অনুমোদন প্রবাহ সম্পূর্ণ করার পরে API সার্ভার ব্যবহারকারীকে কোথায় রিডাইরেক্ট করে তা নির্ধারণ করে। মানটি অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট ইউআরআইগুলির একটির সাথে মিলতে হবে, যা আপনি আপনার ক্লায়েন্টের কনফিগার করেছেন API ConsoleCredentials page. যদি এই মানটি প্রদত্ত client_id জন্য একটি অনুমোদিত পুনঃনির্দেশ URI-এর সাথে মেলে না তাহলে আপনি একটি redirect_uri_mismatch ত্রুটি পাবেন।

মনে রাখবেন যে http বা https স্কিম, কেস এবং ট্রেইলিং স্ল্যাশ (' / ') অবশ্যই মিলবে।

response_type প্রয়োজন

জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলিকে প্যারামিটারের মান token সেট করতে হবে। এই মানটি Google অনুমোদন সার্ভারকে ইউআরআই ( # ) এর ফ্র্যাগমেন্ট শনাক্তকারীতে একটি name=value পেয়ার হিসাবে অ্যাক্সেস টোকেনটি ফেরত দেওয়ার নির্দেশ দেয় যেখানে ব্যবহারকারীকে অনুমোদন প্রক্রিয়া সম্পূর্ণ করার পরে পুনঃনির্দেশিত করা হয়।

scope প্রয়োজন

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

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

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

state প্রস্তাবিত

আপনার অনুমোদনের অনুরোধ এবং অনুমোদন সার্ভারের প্রতিক্রিয়ার মধ্যে অবস্থা বজায় রাখতে আপনার অ্যাপ্লিকেশন ব্যবহার করে এমন কোনো স্ট্রিং মান নির্দিষ্ট করে। ব্যবহারকারী আপনার অ্যাপ্লিকেশনের অ্যাক্সেস অনুরোধে সম্মতি বা অস্বীকার করার পরে সার্ভারটি সঠিক মানটি ফেরত দেয় যা আপনি একটি name=value pair হিসেবে পাঠান redirect_uri এর URL খণ্ড শনাক্তকারী ( # )।

আপনি এই প্যারামিটারটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, যেমন আপনার অ্যাপ্লিকেশনে ব্যবহারকারীকে সঠিক সংস্থানের দিকে নির্দেশ করা, ননসেস পাঠানো এবং ক্রস-সাইট অনুরোধ জালিয়াতি প্রশমিত করা। যেহেতু আপনার redirect_uri অনুমান করা যেতে পারে, একটি state মান ব্যবহার করে আপনার নিশ্চয়তা বৃদ্ধি করতে পারে যে একটি ইনকামিং সংযোগ একটি প্রমাণীকরণ অনুরোধের ফলাফল। আপনি যদি একটি এলোমেলো স্ট্রিং তৈরি করেন বা একটি কুকির হ্যাশ বা ক্লায়েন্টের অবস্থা ক্যাপচার করে এমন অন্য মান এনকোড করেন, তাহলে ক্রস-সাইটের মতো আক্রমণের বিরুদ্ধে সুরক্ষা প্রদান করে অনুরোধ এবং প্রতিক্রিয়া একই ব্রাউজারে উদ্ভূত হয়েছে তা নিশ্চিত করতে আপনি প্রতিক্রিয়া যাচাই করতে পারেন জালিয়াতি অনুরোধ . কিভাবে একটি state টোকেন তৈরি এবং নিশ্চিত করতে হয় তার উদাহরণের জন্য OpenID Connect ডকুমেন্টেশন দেখুন।

include_granted_scopes ঐচ্ছিক

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

login_hint ঐচ্ছিক

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

প্যারামিটার মানটিকে একটি ইমেল ঠিকানা বা sub -শনাক্তকারীতে সেট করুন, যা ব্যবহারকারীর Google আইডির সমতুল্য।

prompt ঐচ্ছিক

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

সম্ভাব্য মান হল:

none কোনো প্রমাণীকরণ বা সম্মতি স্ক্রীন প্রদর্শন করবেন না। অন্যান্য মানের সাথে নির্দিষ্ট করা উচিত নয়।
consent ব্যবহারকারীকে সম্মতির জন্য অনুরোধ করুন।
select_account ব্যবহারকারীকে একটি অ্যাকাউন্ট নির্বাচন করতে অনুরোধ করুন।

Google এর অনুমোদন সার্ভারে নমুনা পুনঃনির্দেশ

পঠনযোগ্যতার জন্য লাইন বিরতি এবং স্পেস সহ একটি উদাহরণ URL নীচে দেখানো হয়েছে।

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly%20https%3A//www.googleapis.com/auth/calendar.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

আপনি অনুরোধ URL তৈরি করার পরে, ব্যবহারকারীকে এটিতে পুনঃনির্দেশ করুন।

জাভাস্ক্রিপ্ট নমুনা কোড

নিম্নলিখিত জাভাস্ক্রিপ্ট স্নিপেট দেখায় কিভাবে জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে জাভাস্ক্রিপ্টে অনুমোদনের প্রবাহ শুরু করতে হয়। যেহেতু এই OAuth 2.0 এন্ডপয়েন্ট ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) সমর্থন করে না, তাই স্নিপেট একটি ফর্ম তৈরি করে যা সেই এন্ডপয়েন্টে অনুরোধ খোলে।

/*
 * Create form to request access token from Google's OAuth 2.0 server.
 */
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

  // Create <form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);

  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client_id': 'YOUR_CLIENT_ID',
                'redirect_uri': 'YOUR_REDIRECT_URI',
                'response_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly',
                'include_granted_scopes': 'true',
                'state': 'pass-through value'};

  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

ধাপ 2: Google ব্যবহারকারীকে সম্মতির জন্য অনুরোধ করে

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

আপনার অ্যাপ্লিকেশনটির এই পর্যায়ে কিছু করার দরকার নেই কারণ এটি Google-এর OAuth 2.0 সার্ভারের প্রতিক্রিয়ার জন্য অপেক্ষা করে যা নির্দেশ করে যে কোনও অ্যাক্সেস দেওয়া হয়েছে কিনা। যে প্রতিক্রিয়া নিম্নলিখিত ধাপে ব্যাখ্যা করা হয়েছে.

ত্রুটি

Google-এর OAuth 2.0 অনুমোদনের এন্ডপয়েন্টের অনুরোধগুলি প্রত্যাশিত প্রমাণীকরণ এবং অনুমোদনের প্রবাহের পরিবর্তে ব্যবহারকারী-মুখী ত্রুটি বার্তাগুলি প্রদর্শন করতে পারে৷ সাধারণ ত্রুটি কোড এবং প্রস্তাবিত রেজোলিউশন নীচে তালিকাভুক্ত করা হয়.

admin_policy_enforced

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

disallowed_useragent

অনুমোদনের এন্ডপয়েন্টটি Google-এর OAuth 2.0 নীতি দ্বারা অনুমোদিত একটি এমবেডেড ব্যবহারকারী-এজেন্টের ভিতরে প্রদর্শিত হয়৷

অ্যান্ড্রয়েড

android.webkit.WebView এ অনুমোদনের অনুরোধগুলি খোলার সময় Android বিকাশকারীরা এই ত্রুটির বার্তাটির সম্মুখীন হতে পারে৷ বিকাশকারীদের পরিবর্তে Android লাইব্রেরিগুলি ব্যবহার করা উচিত যেমন Android এর জন্য Google সাইন-ইন বা Android এর জন্য OpenID ফাউন্ডেশনের AppAuth

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

iOS

WKWebView এ অনুমোদনের অনুরোধ খোলার সময় iOS এবং macOS ডেভেলপাররা এই ত্রুটির সম্মুখীন হতে পারে। বিকাশকারীদের পরিবর্তে iOS লাইব্রেরিগুলি ব্যবহার করা উচিত যেমন iOS এর জন্য Google সাইন-ইন বা iOS এর জন্য OpenID ফাউন্ডেশনের AppAuth

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

org_internal

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

invalid_client

যে উৎস থেকে অনুরোধ করা হয়েছে তা এই ক্লায়েন্টের জন্য অনুমোদিত নয়। origin_mismatch দেখুন।

invalid_grant

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

origin_mismatch

অনুমোদনের অনুরোধের উদ্ভব জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট OAuth ক্লায়েন্ট আইডির জন্য নিবন্ধিত একটি অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন ইউআরআই-এর সাথে নাও মিলতে পারে। তে অনুমোদিত জাভাস্ক্রিপ্টের উত্স পর্যালোচনা করুন৷ Google API ConsoleCredentials page.

redirect_uri_mismatch

অনুমোদনের অনুরোধে পাস করা redirect_uri OAuth ক্লায়েন্ট আইডির জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে মেলে না। তে অনুমোদিত পুনঃনির্দেশ ইউআরআই পর্যালোচনা করুন৷ Google API Console Credentials page.

অনুমোদনের অনুরোধের উদ্ভব জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট OAuth ক্লায়েন্ট আইডির জন্য নিবন্ধিত একটি অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন ইউআরআই-এর সাথে নাও মিলতে পারে। তে অনুমোদিত জাভাস্ক্রিপ্টের উত্স পর্যালোচনা করুন৷ Google API Console Credentials page.

redirect_uri প্যারামিটার OAuth আউট-অফ-ব্যান্ড (OOB) প্রবাহকে নির্দেশ করতে পারে যা অবমূল্যায়িত হয়েছে এবং আর সমর্থিত নয়। আপনার ইন্টিগ্রেশন আপডেট করতে মাইগ্রেশন গাইড পড়ুন।

invalid_request

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

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

ধাপ 3: OAuth 2.0 সার্ভার প্রতিক্রিয়া পরিচালনা করুন

OAuth 2.0 এন্ডপয়েন্ট

OAuth 2.0 সার্ভার আপনার অ্যাক্সেস টোকেন অনুরোধে উল্লেখিত redirect_uri এ একটি প্রতিক্রিয়া পাঠায়।

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

  • একটি অ্যাক্সেস টোকেন প্রতিক্রিয়া:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    access_token প্যারামিটার ছাড়াও, টুকরো স্ট্রিংটিতে token_type প্যারামিটার রয়েছে, যা সর্বদা Bearer এ সেট করা থাকে এবং expires_in প্যারামিটার, যা টোকেনের জীবনকাল নির্দিষ্ট করে, সেকেন্ডে। যদি state প্যারামিটারটি অ্যাক্সেস টোকেন অনুরোধে নির্দিষ্ট করা হয়, তবে এর মানও প্রতিক্রিয়াতে অন্তর্ভুক্ত করা হয়।

  • একটি ত্রুটি প্রতিক্রিয়া:
    https://oauth2.example.com/callback#error=access_denied

নমুনা OAuth 2.0 সার্ভার প্রতিক্রিয়া

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

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly%20https%3A//www.googleapis.com/auth/calendar.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

OAuth 2.0 ফ্লো সম্পূর্ণ করার পরে, আপনাকে http://localhost/oauth2callback এ পুনঃনির্দেশিত করা হবে। সেই URLটি একটি 404 NOT FOUND ত্রুটি প্রদান করবে যদি না আপনার স্থানীয় মেশিনটি সেই ঠিকানায় একটি ফাইল পরিবেশন করে। পরবর্তী ধাপে ইউআরআই-এ ফেরত দেওয়া তথ্য সম্পর্কে আরও বিশদ প্রদান করা হয় যখন ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনে ফেরত পাঠানো হয়।

ধাপ 4: ব্যবহারকারীদের মঞ্জুর করা সুযোগগুলি পরীক্ষা করুন৷

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

OAuth 2.0 এন্ডপয়েন্ট

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

উদাহরণস্বরূপ, নিম্নলিখিত নমুনা অ্যাক্সেস টোকেন প্রতিক্রিয়া ইঙ্গিত করে যে ব্যবহারকারী আপনার অ্যাপ্লিকেশনটিকে শুধুমাত্র-পঠনযোগ্য ড্রাইভ কার্যকলাপ এবং ক্যালেন্ডার ইভেন্ট অনুমতিগুলিতে অ্যাক্সেস দিয়েছেন:

  {
    "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
    "expires_in": 3920,
    "token_type": "Bearer",
    "scope": "https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly",
    "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
  }

Google API কল করা হচ্ছে

OAuth 2.0 এন্ডপয়েন্ট

আপনার অ্যাপ্লিকেশন একটি অ্যাক্সেস টোকেন প্রাপ্ত করার পরে, যদি API দ্বারা প্রয়োজনীয় অ্যাক্সেসের সুযোগ মঞ্জুর করা হয় তবে আপনি একটি প্রদত্ত ব্যবহারকারী অ্যাকাউন্টের হয়ে একটি Google API এ কল করতে টোকেনটি ব্যবহার করতে পারেন। এটি করার জন্য, একটি access_token ক্যোয়ারী প্যারামিটার বা একটি Authorization HTTP শিরোনাম Bearer মান অন্তর্ভুক্ত করে API-এর একটি অনুরোধে অ্যাক্সেস টোকেন অন্তর্ভুক্ত করুন। যখন সম্ভব, HTTP শিরোনামটি পছন্দনীয়, কারণ সার্ভার লগগুলিতে কোয়েরি স্ট্রিংগুলি দৃশ্যমান হয়। বেশিরভাগ ক্ষেত্রে আপনি Google API-এ আপনার কলগুলি সেট আপ করতে একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, ড্রাইভ ফাইল API কল করার সময়)।

আপনি সমস্ত Google API ব্যবহার করে দেখতে পারেন এবং OAuth 2.0 খেলার মাঠে তাদের স্কোপ দেখতে পারেন।

HTTP GET উদাহরণ

অনুমোদন ব্যবহার করে drive.files এন্ডপয়েন্টে (ড্রাইভ ফাইল এপিআই) একটি কল Authorization: Bearer HTTP হেডার নিচের মত দেখতে হতে পারে। মনে রাখবেন যে আপনাকে আপনার নিজস্ব অ্যাক্সেস টোকেন নির্দিষ্ট করতে হবে:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

এখানে access_token ক্যোয়ারী স্ট্রিং প্যারামিটার ব্যবহার করে প্রমাণীকৃত ব্যবহারকারীর জন্য একই API-তে একটি কল রয়েছে:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl উদাহরণ

আপনি curl কমান্ড-লাইন অ্যাপ্লিকেশনের মাধ্যমে এই কমান্ডগুলি পরীক্ষা করতে পারেন। এখানে একটি উদাহরণ যা HTTP হেডার বিকল্প ব্যবহার করে (পছন্দের):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

অথবা, বিকল্পভাবে, ক্যোয়ারী স্ট্রিং প্যারামিটার বিকল্প:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

জাভাস্ক্রিপ্ট নমুনা কোড

নীচের কোড স্নিপেটটি দেখায় যে কীভাবে একটি Google API-এ একটি অনুরোধ পাঠাতে CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) ব্যবহার করতে হয়। এই উদাহরণটি JavaScript-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করে না। যাইহোক, আপনি ক্লায়েন্ট লাইব্রেরি ব্যবহার না করলেও, সেই লাইব্রেরির ডকুমেন্টেশনে CORS সমর্থন গাইড আপনাকে এই অনুরোধগুলি আরও ভালভাবে বুঝতে সাহায্য করবে।

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

var xhr = new XMLHttpRequest();
xhr.open('GET',
    'https://www.googleapis.com/drive/v3/about?fields=user&' +
    'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
  console.log(xhr.response);
};
xhr.send(null);

সম্পূর্ণ উদাহরণ

OAuth 2.0 এন্ডপয়েন্ট

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

OAuth 2.0 প্রবাহের জন্য, পৃষ্ঠাটি এই পদক্ষেপগুলি অনুসরণ করে:

  1. এটি ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে নির্দেশ করে, যা https://www.googleapis.com/auth/drive.metadata.readonly এবং https://www.googleapis.com/auth/calendar.readonly স্কোপে অ্যাক্সেসের অনুরোধ করে।
  2. এক বা একাধিক অনুরোধকৃত স্কোপে অ্যাক্সেস দেওয়ার (বা অস্বীকার) করার পরে, ব্যবহারকারীকে মূল পৃষ্ঠায় পুনঃনির্দেশিত করা হয়, যা খণ্ড শনাক্তকারী স্ট্রিং থেকে অ্যাক্সেস টোকেন পার্স করে।
  3. পৃষ্ঠাটি পরীক্ষা করে যে কোন স্কোপ ব্যবহারকারীরা অ্যাপ্লিকেশনটিতে অ্যাক্সেস দিয়েছে৷
  4. যদি ব্যবহারকারী অনুরোধকৃত স্কোপ()s-এ অ্যাক্সেস মঞ্জুর করে থাকে, পৃষ্ঠাটি নমুনা API অনুরোধ করতে অ্যাক্সেস টোকেন ব্যবহার করে।

    API অনুরোধটি অনুমোদিত ব্যবহারকারীর Google ড্রাইভ অ্যাকাউন্ট সম্পর্কে তথ্য পুনরুদ্ধার করতে ড্রাইভ API-এর about.get পদ্ধতিতে কল করে৷

  5. যদি অনুরোধটি সফলভাবে কার্যকর হয়, API প্রতিক্রিয়া ব্রাউজারের ডিবাগিং কনসোলে লগ ইন করা হয়।

আপনি আপনার Google অ্যাকাউন্টের অনুমতি পৃষ্ঠার মাধ্যমে অ্যাপে অ্যাক্সেস প্রত্যাহার করতে পারেন। অ্যাপটিকে Google API ডক্সের জন্য OAuth 2.0 ডেমো হিসেবে তালিকাভুক্ত করা হবে।

স্থানীয়ভাবে এই কোডটি চালানোর জন্য, আপনাকে YOUR_CLIENT_ID এবং YOUR_REDIRECT_URI ভেরিয়েবলের জন্য মান সেট করতে হবে যা আপনার অনুমোদনের শংসাপত্রের সাথে সঙ্গতিপূর্ণ। YOUR_REDIRECT_URI ভেরিয়েবলটি একই URL এ সেট করা উচিত যেখানে পৃষ্ঠাটি পরিবেশিত হচ্ছে৷ মানটি অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট ইউআরআইগুলির একটির সাথে মিলতে হবে, যা আপনি কনফিগার করেছেন API Console Credentials page. যদি এই মানটি একটি অনুমোদিত URI-এর সাথে মেলে না, তাহলে আপনি একটি redirect_uri_mismatch ত্রুটি পাবেন। আপনার প্রকল্পটি অবশ্যই এই অনুরোধের জন্য উপযুক্ত API সক্ষম করেছে

<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var fragmentString = location.hash.substring(1);
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0 && params['state']) {
    if (params['state'] == localStorage.getItem('state')) {
      localStorage.setItem('oauth2-test-params', JSON.stringify(params) );

      trySampleRequest();
    } else {
      console.log('State mismatch. Possible CSRF attack');
    }
  }

  // Function to generate a random state value
  function generateCryptoRandomState() {
    const randomValues = new Uint32Array(2);
    window.crypto.getRandomValues(randomValues);

    // Encode as UTF-8
    const utf8Encoder = new TextEncoder();
    const utf8Array = utf8Encoder.encode(
      String.fromCharCode.apply(null, randomValues)
    );

    // Base64 encode the UTF-8 data
    return btoa(String.fromCharCode.apply(null, utf8Array))
      .replace(/\+/g, '-')
      .replace(/\//g, '_')
      .replace(/=+$/, '');
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) { 
      // User authorized the request. Now, check which scopes were granted.
      if (params['scope'].includes('https://www.googleapis.com/auth/drive.metadata.readonly')) {
        // User authorized read-only Drive activity permission.
        // Calling the APIs, etc.
        var xhr = new XMLHttpRequest();
        xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
        xhr.onreadystatechange = function (e) {
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.response);
          } else if (xhr.readyState === 4 && xhr.status === 401) {
            // Token invalid, so prompt for user permission.
            oauth2SignIn();
          }
        };
        xhr.send(null);
      }
      else {
        // User didn't authorize read-only Drive activity permission.
        // Update UX and application accordingly
        console.log('User did not authorize read-only Drive activity permission.');
      }

      // Check if user authorized Calendar read permission.
      if (params['scope'].includes('https://www.googleapis.com/auth/calendar.readonly')) {
        // User authorized Calendar read permission.
        // Calling the APIs, etc.
        console.log('User authorized Calendar read permission.');
      }
      else {
        // User didn't authorize Calendar read permission.
        // Update UX and application accordingly
        console.log('User did not authorize Calendar read permission.');
      } 
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // create random state value and store in local storage
    var state = generateCryptoRandomState();
    localStorage.setItem('state', state);

    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly',
                  'state': state,
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

জাভাস্ক্রিপ্ট মূল বৈধতা নিয়ম

ডেভেলপারদের তাদের অ্যাপ্লিকেশানগুলিকে সুরক্ষিত রাখতে সহায়তা করার জন্য Google JavaScript উত্সগুলিতে নিম্নলিখিত বৈধতা নিয়মগুলি প্রয়োগ করে৷ আপনার জাভাস্ক্রিপ্টের উত্সগুলি অবশ্যই এই নিয়মগুলি মেনে চলবে। নীচে উল্লিখিত ডোমেন, হোস্ট এবং স্কিমের সংজ্ঞার জন্য RFC 3986 বিভাগ 3 দেখুন।

বৈধতা নিয়ম
স্কিম

JavaScript অরিজিন অবশ্যই HTTPS স্কিম ব্যবহার করবে, সাধারণ HTTP নয়। লোকালহোস্ট ইউআরআই (স্থানীয় হোস্ট আইপি ঠিকানা ইউআরআই সহ) এই নিয়ম থেকে অব্যাহতিপ্রাপ্ত।

হোস্ট

হোস্ট কাঁচা IP ঠিকানা হতে পারে না. স্থানীয় হোস্ট আইপি ঠিকানাগুলি এই নিয়ম থেকে অব্যাহতিপ্রাপ্ত।

ডোমেইন
  • হোস্ট টিএলডি ( টপ লেভেল ডোমেন ) অবশ্যই পাবলিক প্রত্যয় তালিকার অন্তর্গত।
  • হোস্ট ডোমেন “googleusercontent.com” হতে পারে না।
  • জাভাস্ক্রিপ্ট অরিজিনে URL শর্টনার ডোমেন থাকতে পারে না (যেমন goo.gl ) যদি না অ্যাপটি ডোমেনের মালিক হয়।
  • ব্যবহারকারীর তথ্য

    জাভাস্ক্রিপ্ট অরিজিনে ব্যবহারকারীর তথ্য উপকম্পোনেন্ট থাকতে পারে না।

    পথ

    JavaScript অরিজিনে পাথ উপাদান থাকতে পারে না।

    প্রশ্ন

    জাভাস্ক্রিপ্ট অরিজিন কোয়েরি উপাদান ধারণ করতে পারে না।

    খণ্ড

    জাভাস্ক্রিপ্টের উৎপত্তিতে খণ্ডের উপাদান থাকতে পারে না।

    অক্ষর জাভাস্ক্রিপ্ট অরিজিনে কিছু অক্ষর থাকতে পারে না যার মধ্যে রয়েছে:
    • ওয়াইল্ডকার্ড অক্ষর ( '*' )
    • অ-মুদ্রণযোগ্য ASCII অক্ষর
    • অবৈধ শতাংশ এনকোডিং (যেকোন শতাংশ এনকোডিং যা একটি শতাংশ চিহ্নের URL-এনকোডিং ফর্ম অনুসরণ করে না এবং দুটি হেক্সাডেসিমেল সংখ্যা অনুসরণ করে)
    • শূন্য অক্ষর (একটি এনকোড করা NULL অক্ষর, যেমন, %00 , %C0%80 )

    ক্রমবর্ধমান অনুমোদন

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

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

    এই ক্ষেত্রে, সাইন-ইন করার সময় অ্যাপটি openid এবং profile স্কোপগুলিকে প্রাথমিক সাইন-ইন করার জন্য অনুরোধ করতে পারে এবং তারপরে পরবর্তী সময়ে https://www.googleapis.com/auth/drive.file স্কোপের অনুরোধ করতে পারে একটি মিশ্রণ সংরক্ষণ করার প্রথম অনুরোধ.

    ক্রমবর্ধমান অনুমোদন থেকে প্রাপ্ত একটি অ্যাক্সেস টোকেনের ক্ষেত্রে নিম্নলিখিত নিয়মগুলি প্রযোজ্য:

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

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

    OAuth 2.0 এন্ডপয়েন্ট

    বিদ্যমান অ্যাক্সেস টোকেনে স্কোপ যোগ করতে, Google-এর OAuth 2.0 সার্ভারে আপনার অনুরোধে include_granted_scopes প্যারামিটার অন্তর্ভুক্ত করুন।

    নিম্নলিখিত কোড স্নিপেট প্রদর্শন করে কিভাবে এটি করতে হয়। স্নিপেট অনুমান করে যে আপনি সেই স্কোপগুলি সংরক্ষণ করেছেন যার জন্য আপনার অ্যাক্সেস টোকেন ব্রাউজারের স্থানীয় স্টোরেজে বৈধ। ( সম্পূর্ণ উদাহরণ কোডটি স্কোপের একটি তালিকা সংরক্ষণ করে যার জন্য অ্যাক্সেস টোকেনটি ব্রাউজারের স্থানীয় স্টোরেজে oauth2-test-params.scope বৈশিষ্ট্য সেট করে বৈধ।)

    স্নিপেট সেই স্কোপের সাথে তুলনা করে যার জন্য অ্যাক্সেস টোকেনটি আপনি একটি নির্দিষ্ট প্রশ্নের জন্য ব্যবহার করতে চান এমন সুযোগের সাথে বৈধ। যদি অ্যাক্সেস টোকেন সেই সুযোগটি কভার না করে, OAuth 2.0 প্রবাহ শুরু হয়। এখানে, oauth2SignIn ফাংশনটি ধাপ 2 -এ দেওয়া একই (এবং এটি সম্পূর্ণ উদাহরণে পরে দেওয়া হয়েছে)।

    var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    একটি টোকেন প্রত্যাহার করা হচ্ছে

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

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

    OAuth 2.0 এন্ডপয়েন্ট

    প্রোগ্রাম্যাটিকভাবে একটি টোকেন প্রত্যাহার করতে, আপনার অ্যাপ্লিকেশনটি https://oauth2.googleapis.com/revoke এ একটি অনুরোধ করে এবং একটি প্যারামিটার হিসাবে টোকেন অন্তর্ভুক্ত করে:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    টোকেন একটি অ্যাক্সেস টোকেন বা একটি রিফ্রেশ টোকেন হতে পারে। যদি টোকেনটি একটি অ্যাক্সেস টোকেন হয় এবং এটিতে একটি সংশ্লিষ্ট রিফ্রেশ টোকেন থাকে তবে রিফ্রেশ টোকেনটিও প্রত্যাহার করা হবে।

    যদি প্রত্যাহার সফলভাবে প্রক্রিয়া করা হয়, তাহলে প্রতিক্রিয়াটির HTTP স্ট্যাটাস কোড হল 200 । ত্রুটি অবস্থার জন্য, একটি এইচটিটিপি স্ট্যাটাস কোড 400 একটি ত্রুটি কোড সহ ফেরত দেওয়া হয়।

    নিম্নলিখিত জাভাস্ক্রিপ্ট স্নিপেট দেখায় কিভাবে জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে জাভাস্ক্রিপ্টে একটি টোকেন প্রত্যাহার করা যায়। যেহেতু টোকেন প্রত্যাহার করার জন্য Google-এর OAuth 2.0 এন্ডপয়েন্ট ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) সমর্থন করে না, তাই কোডটি একটি ফর্ম তৈরি করে এবং অনুরোধ পোস্ট করার জন্য XMLHttpRequest() পদ্ধতি ব্যবহার না করে ফর্মটিকে এন্ডপয়েন্টে জমা দেয়৷

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }

    ক্রস-অ্যাকাউন্ট সুরক্ষা বাস্তবায়ন করা

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

    Google-এর ক্রস-অ্যাকাউন্ট সুরক্ষা পরিষেবা দ্বারা আপনার অ্যাপে পাঠানো ইভেন্ট প্রকারের কিছু উদাহরণ হল:

    • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
    • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
    • https://schemas.openid.net/secevent/risc/event-type/account-disabled

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