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

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

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

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

Google APIs ক্লায়েন্ট লাইব্রেরি এবং Google Identity Services

Google-এ অনুমোদিত কল করার জন্য আপনি JavaScript-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, অনুমোদনের ফ্লো ম্যানেজ করার জন্য আপনাকে Google Identity Services JavaScript লাইব্রেরি ব্যবহার করতে হবে। আমরা Google Identity Services-এর কোড মডেল ব্যবহার করার জন্য সাজেস্ট করি, যা PKCE সহ আরও সুরক্ষিত অথরাইজেশন কোডের ফ্লোয়ের উপর ভিত্তি করে তৈরি।

পূর্বশর্ত

আপনার প্রোজেক্টের জন্য API চালু করা

Google API কল করে এমন যেকোনও অ্যাপ্লিকেশনকে API কনসোলে সেইসব API চালু করতে হবে।

আপনার প্রোজেক্টের জন্য API চালু করতে:

  1. Google API কনসোলে API লাইব্রেরি খুলুন।
  2. প্রম্পট করা হলে, কোনও প্রোজেক্ট বেছে নিন অথবা নতুন একটি তৈরি করুন।
  3. API লাইব্রেরিতে উপলভ্য সব API-এর তালিকা থাকে, যা প্রোডাক্ট ফ্যামিলি ও জনপ্রিয়তার ভিত্তিতে গ্রুপ করা থাকে। আপনি যে API চালু করতে চান সেটি তালিকায় দেখতে না পেলে, সেটি খুঁজে পেতে সার্চ ব্যবহার করুন অথবা সেটি যে প্রোডাক্ট ফ্যামিলির অন্তর্গত তার সব দেখুন বিকল্পে ক্লিক করুন।
  4. আপনি যে API চালু করতে চান সেটি বেছে নিন, তারপর চালু করুন বোতামে ক্লিক করুন।
  5. প্রম্পট করা হলে, বিলিং চালু করুন।
  6. প্রম্পট করা হলে, API-এর পরিষেবার শর্তাবলী পড়ে সম্মতি দিন।

অনুমোদনের ক্রেডেনশিয়াল তৈরি করা

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

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

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

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

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

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

OAuth 2.0 অ্যাক্সেস টোকেন পাওয়া

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

ধাপ ১: Google-এর OAuth 2.0 সার্ভারে রিডাইরেক্ট করা

ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি চাইতে, ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে রিডাইরেক্ট করুন।

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

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

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

প্যারামিটারগুলি
client_id আবশ্যক

আপনার অ্যাপ্লিকেশনের জন্য ক্লায়েন্ট আইডি। আপনি এই ভ্যালু Cloud Console ক্লায়েন্ট পৃষ্ঠায় দেখতে পাবেন।

redirect_uri আবশ্যক

ব্যবহারকারী অথরাইজেশন ফ্লো সম্পূর্ণ করার পরে API সার্ভার ব্যবহারকারীকে কোথায় রিডাইরেক্ট করবে তা নির্ধারণ করে। OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট URI-এর মধ্যে কোনও একটির সাথে ভ্যালু হুবহু মিলতে হবে, যা আপনি ক্লায়েন্টের Cloud Console ক্লায়েন্ট পৃষ্ঠা-তে কনফিগার করেছেন। এই ভ্যালু, প্রদান করা client_id-এর জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে ম্যাচ না করলে, আপনি একটি redirect_uri_mismatch সমস্যা পাবেন।

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

response_type আবশ্যক

JavaScript অ্যাপ্লিকেশনকে প্যারামিটারের মান token হিসেবে সেট করতে হবে। এই মানটি Google যাচাইকরণ সার্ভারকে নির্দেশ দেয় যে যাচাইকরণ প্রসেস সম্পূর্ণ করার পরে ব্যবহারকারীকে যে URI-তে (#) রিডাইরেক্ট করা হবে, সেটির ফ্র্যাগমেন্ট আইডেন্টিফায়ারে অ্যাক্সেস টোকেনটি name=value পেয়ার হিসেবে ফেরত দিতে হবে।

scope আবশ্যক

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

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

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

state সাজেস্ট করা হয়

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

আপনি এই প্যারামিটারটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, যেমন ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনের সঠিক রিসোর্সে নির্দেশ করা, ননস পাঠানো এবং ক্রস-সাইট অনুরোধ জালিয়াতি কমানো। আপনার 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//developers.google.com/oauthplayground&
 client_id=client_id

অনুরোধের URL তৈরি করার পরে, ব্যবহারকারীকে সেখানে রিডাইরেক্ট করুন।

JavaScript স্যাম্পেল কোড

নিম্নলিখিত জাভাস্ক্রিপ্ট স্নিপেট থেকে বোঝা যায় যে কীভাবে জাভাস্ক্রিপ্টে জাভাস্ক্রিপ্টের জন্য 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();
}

ধাপ ২: Google ব্যবহারকারীকে সম্মতি দেওয়ার জন্য প্রম্পট করে

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

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

সমস্যা

Google-এর OAuth 2.0 অনুমোদনের এন্ডপয়েন্টে করা অনুরোধে প্রত্যাশিত যাচাইকরণ ও অনুমোদনের ফ্লোয়ের পরিবর্তে ব্যবহারকারী নিজে ইন্টার‌্যাক্ট করতে পারেন এমন ত্রুটি মেসেজ দেখানো হতে পারে। সাধারণ সমস্যার কোড ও সাজেস্ট করা সমাধানগুলি হল:

admin_policy_enforced

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

disallowed_useragent

অনুমোদন এন্ডপয়েন্টটি Google-এর OAuth 2.0 নীতি দ্বারা অনুমোদিত নয় এমন এম্বেড করা ইউজার-এজেন্টের মধ্যে দেখানো হয়।

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

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

org_internal

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

invalid_client

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

deleted_client

অনুরোধ করার জন্য যে OAuth ক্লায়েন্ট ব্যবহার করা হচ্ছে সেটি মুছে দেওয়া হয়েছে। মুছে দেওয়ার কাজটি ম্যানুয়ালি অথবা অটোমেটিক করা যেতে পারে, যদি অব্যবহৃত ক্লায়েন্ট হয়। মুছে ফেলা ক্লায়েন্টকে ৩০ দিনের মধ্যে ফিরিয়ে আনা যাবে। আরও জানুন ।

invalid_grant

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

origin_mismatch

অনুমোদনের অনুরোধ করা জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট OAuth ক্লায়েন্ট আইডির জন্য রেজিস্টার করা অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে না মিলতে পারে। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠা থেকে অনুমোদিত JavaScript উৎস পর্যালোচনা করুন।

redirect_uri_mismatch

অনুমোদনের অনুরোধে পাস করা redirect_uri OAuth ক্লায়েন্ট আইডির জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে মিলছে না। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠায় অনুমোদিত রিডাইরেক্ট URI পর্যালোচনা করুন।

অনুমোদনের অনুরোধ করা জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট, OAuth ক্লায়েন্ট আইডির জন্য রেজিস্টার করা অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে নাও মিলতে পারে। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠা থেকে অনুমোদিত JavaScript অরিজিন পর্যালোচনা করুন।

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

invalid_request

আপনার করা অনুরোধে কোনও সমস্যা হয়েছে। এটি একাধিক কারণে হতে পারে:

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

ধাপ ৩: OAuth 2.0 সার্ভার রেসপন্স ম্যানেজ করা

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

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

ব্যবহারকারী অনুরোধ অনুমোদন করলে, উত্তরে একটি অ্যাক্সেস টোকেন থাকে। ব্যবহারকারী অনুরোধ অনুমোদন না করলে, উত্তরে একটি সমস্যার মেসেজ থাকে। অ্যাক্সেস টোকেন বা ত্রুটি মেসেজ রিডাইরেক্ট 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 Drive-এ ফাইলের মেটাডেটা দেখার জন্য শুধুমাত্র পড়ার অ্যাক্সেস এবং আপনার Google Calendar ইভেন্ট দেখার জন্য শুধুমাত্র পড়ার অ্যাক্সেসের অনুরোধ করে:

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//developers.google.com/oauthplayground&
 client_id=client_id

OAuth 2.0 ফ্লো সম্পূর্ণ করার পরে, আপনার ব্রাউজার আপনাকে OAuth 2.0 প্লেগ্রাউন্ডে রিডাইরেক্ট করে, এটি OAuth ফ্লো পরীক্ষা করার একটি টুল। আপনি দেখতে পাবেন যে OAuth 2.0 Playground অটোমেটিক অনুমোদন কোড ক্যাপচার করেছে।

ধাপ ৪: ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করুন

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

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

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

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

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

যেমন, নিম্নলিখিত স্যাম্পেল অ্যাক্সেস টোকেন রেসপন্স থেকে বোঝা যায় যে ব্যবহারকারী আপনার অ্যাপ্লিকেশনকে শুধু-পড়া-যাবে এমন Drive অ্যাক্টিভিটি এবং Calendar ইভেন্টের অনুমতি দিয়েছেন:

  {
    "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 এন্ডপয়েন্ট

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

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

HTTP GET-এর উদাহরণ

Authorization: Bearer HTTP হেডার ব্যবহার করে drive.files এন্ডপয়েন্টে (Drive Files API) কল করলে তা নিম্নলিখিত উদাহরণের মতো দেখতে হতে পারে। মনে রাখবেন যে আপনাকে নিজের অ্যাক্সেস টোকেন উল্লেখ করতে হবে:

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

JavaScript স্যাম্পেল কোড

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

এই কোড স্যাম্পেল দেখায় যে কীভাবে JavaScript-এর জন্য 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. ব্যবহারকারী অনুরোধ করা স্কোপে() অ্যাক্সেস দিলে, পৃষ্ঠাটি স্যাম্পেল API অনুরোধ করার জন্য অ্যাক্সেস টোকেন ব্যবহার করে।

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

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

আপনার Google অ্যাকাউন্টের অনুমতি পৃষ্ঠা থেকে অ্যাপের অ্যাক্সেস তুলে নিতে পারবেন। ক্লায়েন্ট আইডি তৈরি করার সময় OAuth সম্মতি স্ক্রিনের মধ্যে ব্র্যান্ডিং পৃষ্ঠায় যে অ্যাপ্লিকেশনের নাম দেওয়া হয়েছে, সেই নামেই অ্যাপটি তালিকাভুক্ত করা হয়েছে।

এই কোড লোকালি রান করাতে, আপনাকে YOUR_CLIENT_ID এবং YOUR_REDIRECT_URI ভেরিয়েবলের জন্য ভ্যালু সেট করতে হবে যা আপনার অনুমোদন সংক্রান্ত ক্রেডেনশিয়ালের সাথে সম্পর্কিত। যে URL-এ পৃষ্ঠাটি পরিবেশন করা হচ্ছে, YOUR_REDIRECT_URI ভেরিয়েবলটি সেই URL-এ সেট করতে হবে। ভ্যালুটিকে অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট URI-এর মধ্যে একটির সাথে হুবহু মিলতে হবে, যা আপনি Cloud Console ক্লায়েন্ট পৃষ্ঠায় কনফিগার করেছেন। এই ভ্যালু কোনও অনুমোদিত 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-এর বিভাগ ৩ দেখুন।

যাচাইকরণের নিয়ম
স্কিম

জাভাস্ক্রিপ্ট অরিজিনে অবশ্যই HTTPS স্কিম ব্যবহার করতে হবে, সাধারণ HTTP নয়। লোকালহোস্ট URI (লোকালহোস্ট IP অ্যাড্রেস URI সহ) এই নিয়ম থেকে অব্যাহতি পায়।

হোস্ট

হোস্ট র IP অ্যাড্রেস হতে পারবে না। Localhost IP অ্যাড্রেস এই নিয়মের আওতাভুক্ত নয়।

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

    JavaScript অরিজিনে userinfo সাবকম্পোনেন্ট থাকলে চলবে না।

    পাথ

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

    কোয়েরি

    JavaScript অরিজিনে কোয়েরি কম্পোনেন্ট থাকলে চলবে না।

    ফ্র্যাগমেন্ট

    JavaScript অরিজিনে ফ্র্যাগমেন্ট কম্পোনেন্ট থাকতে পারবে না।

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

    ইনক্রিমেন্টাল অনুমোদন

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

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

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

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

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

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

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

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

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

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

    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। সমস্যার ক্ষেত্রে, HTTP স্ট্যাটাস কোড 400-এর সাথে একটি ত্রুটি কোড পাঠানো হয়।

    নিচের জাভাস্ক্রিপ্ট স্নিপেট থেকে জানা যায় যে জাভাস্ক্রিপ্টের জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে জাভাস্ক্রিপ্টে কীভাবে টোকেন তুলে নিতে হয়। যেহেতু টোকেন তুলে নেওয়ার জন্য 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

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