এই ডকুমেন্টটিতে ব্যাখ্যা করা হয়েছে কিভাবে একটি জাভাস্ক্রিপ্ট ওয়েব অ্যাপ্লিকেশন থেকে গুগল এপিআই (Google APIs) অ্যাক্সেস করার জন্য OAuth 2.0 অথরাইজেশন প্রয়োগ করতে হয়। OAuth 2.0 ব্যবহারকারীদের ইউজারনেম, পাসওয়ার্ড এবং অন্যান্য তথ্য গোপন রেখে কোনো অ্যাপ্লিকেশনের সাথে নির্দিষ্ট ডেটা শেয়ার করার সুযোগ দেয়। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন ব্যবহারকারীদের গুগল ড্রাইভে ফাইল সংরক্ষণের জন্য তাদের কাছ থেকে অনুমতি পেতে OAuth 2.0 ব্যবহার করতে পারে।
এই OAuth 2.0 ফ্লো-কে ইমপ্লিসিট গ্র্যান্ট ফ্লো বলা হয়। এটি এমন অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে যেগুলি শুধুমাত্র ব্যবহারকারী অ্যাপ্লিকেশনটিতে উপস্থিত থাকাকালীন API অ্যাক্সেস করে। এই অ্যাপ্লিকেশনগুলি গোপনীয় তথ্য সংরক্ষণ করতে পারে না।
এই প্রক্রিয়ায়, আপনার অ্যাপ একটি গুগল ইউআরএল খোলে, যা কোয়েরি প্যারামিটার ব্যবহার করে আপনার অ্যাপ এবং অ্যাপটির প্রয়োজনীয় এপিআই অ্যাক্সেসের ধরন শনাক্ত করে। আপনি ইউআরএলটি বর্তমান ব্রাউজার উইন্ডোতে বা একটি পপআপে খুলতে পারেন। ব্যবহারকারী গুগলের সাথে প্রমাণীকরণ করতে এবং অনুরোধ করা অনুমতিগুলো প্রদান করতে পারেন। এরপর গুগল ব্যবহারকারীকে আপনার অ্যাপে ফিরিয়ে পাঠায়। এই পুনঃনির্দেশে একটি অ্যাক্সেস টোকেন অন্তর্ভুক্ত থাকে, যা আপনার অ্যাপ যাচাই করে এবং তারপর এপিআই অনুরোধ করার জন্য ব্যবহার করে।
গুগল এপিআই ক্লায়েন্ট লাইব্রেরি এবং গুগল আইডেন্টিটি সার্ভিসেস
যদি আপনি গুগলে অনুমোদিত কল করার জন্য জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তাহলে OAuth 2.0 ফ্লো পরিচালনা করার জন্য আপনার গুগল আইডেন্টিটি সার্ভিসেস জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করা উচিত। অনুগ্রহ করে গুগল আইডেন্টিটি সার্ভিসেস-এর টোকেন মডেলটি দেখুন, যা OAuth 2.0 ইমপ্লিসিট গ্র্যান্ট ফ্লো-এর উপর ভিত্তি করে তৈরি।
পূর্বশর্ত
আপনার প্রোজেক্টের জন্য এপিআই (API) সক্রিয় করুন
যে কোনো অ্যাপ্লিকেশন যা গুগল এপিআই কল করে, তাকে এপিআই কনসোলে সেই এপিআইগুলো সক্রিয় করতে হবে।
আপনার প্রোজেক্টের জন্য একটি API সক্রিয় করতে:
- গুগল এপিআই কনসোলে এপিআই লাইব্রেরিটি খুলুন ।
- অনুরোধ করা হলে, একটি প্রজেক্ট নির্বাচন করুন অথবা নতুন একটি তৈরি করুন।
- এপিআই লাইব্রেরিতে প্রোডাক্ট ফ্যামিলি এবং জনপ্রিয়তা অনুসারে শ্রেণীবদ্ধ করে সমস্ত উপলব্ধ এপিআই তালিকাভুক্ত করা আছে। আপনি যে এপিআইটি সক্রিয় করতে চান তা যদি তালিকায় দৃশ্যমান না হয়, তবে সেটি খুঁজে পেতে সার্চ ব্যবহার করুন, অথবা এটি যে প্রোডাক্ট ফ্যামিলির অন্তর্গত, সেখানে 'ভিউ অল'-এ ক্লিক করুন।
- যে API-টি সক্রিয় করতে চান, সেটি নির্বাচন করুন, তারপর ' Enable' বোতামে ক্লিক করুন।
- অনুরোধ করা হলে, বিলিং চালু করুন।
- অনুরোধ করা হলে, এপিআই-এর পরিষেবার শর্তাবলী পড়ুন এবং গ্রহণ করুন।
অনুমোদনের প্রমাণপত্র তৈরি করুন
যে কোনো অ্যাপ্লিকেশন যা গুগল এপিআই (Google API) অ্যাক্সেস করার জন্য OAuth 2.0 ব্যবহার করে, সেটির অবশ্যই এমন অনুমোদন ক্রেডেনশিয়াল (authorization credentials) থাকতে হবে যা গুগলের OAuth 2.0 সার্ভারের কাছে অ্যাপ্লিকেশনটিকে শনাক্ত করে। নিম্নলিখিত ধাপগুলোতে আপনার প্রোজেক্টের জন্য ক্রেডেনশিয়াল তৈরি করার পদ্ধতি ব্যাখ্যা করা হয়েছে। এরপর আপনার অ্যাপ্লিকেশনগুলো সেই ক্রেডেনশিয়াল ব্যবহার করে আপনার প্রোজেক্টের জন্য সক্রিয় করা এপিআইগুলো অ্যাক্সেস করতে পারবে।
- ক্লায়েন্ট পৃষ্ঠায় যান।
- ক্লায়েন্ট তৈরি করুন -এ ক্লিক করুন।
- ওয়েব অ্যাপ্লিকেশনটির ধরন নির্বাচন করুন।
- ফর্মটি পূরণ করুন। যে অ্যাপ্লিকেশনগুলি অনুমোদিত গুগল এপিআই অনুরোধ করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করে, সেগুলিকে অবশ্যই অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন নির্দিষ্ট করতে হবে। এই অরিজিনগুলি সেই ডোমেনগুলিকে শনাক্ত করে যেখান থেকে আপনার অ্যাপ্লিকেশন OAuth 2.0 সার্ভারে অনুরোধ পাঠাতে পারে। এই অরিজিনগুলিকে অবশ্যই গুগলের বৈধতা যাচাইয়ের নিয়ম মেনে চলতে হবে।
অ্যাক্সেসের পরিধি শনাক্ত করুন
স্কোপ আপনার অ্যাপ্লিকেশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্সগুলিতে অ্যাক্সেসের অনুরোধ করার সুযোগ দেয় এবং একই সাথে ব্যবহারকারীদেরকে আপনার অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেসের পরিমাণ নিয়ন্ত্রণ করতে সক্ষম করে। সুতরাং, অনুরোধ করা স্কোপের সংখ্যা এবং ব্যবহারকারীর সম্মতি পাওয়ার সম্ভাবনার মধ্যে একটি বিপরীত সম্পর্ক থাকতে পারে।
OAuth 2.0 অথরাইজেশন প্রয়োগ করা শুরু করার আগে, আমরা আপনাকে সেই স্কোপগুলি চিহ্নিত করার পরামর্শ দিই যেগুলিতে আপনার অ্যাপের অ্যাক্সেসের জন্য অনুমতির প্রয়োজন হবে।
OAuth 2.0 API Scopes ডকুমেন্টটিতে সেই সমস্ত স্কোপের একটি সম্পূর্ণ তালিকা রয়েছে যা আপনি গুগল এপিআই অ্যাক্সেস করতে ব্যবহার করতে পারেন।
OAuth 2.0 অ্যাক্সেস টোকেন প্রাপ্তি
নিম্নলিখিত ধাপগুলোতে দেখানো হয়েছে, কীভাবে আপনার অ্যাপ্লিকেশনটি কোনো ব্যবহারকারীর পক্ষ থেকে একটি এপিআই (API) অনুরোধ সম্পাদন করার জন্য তার সম্মতি পেতে গুগলের OAuth 2.0 সার্ভারের সাথে যোগাযোগ করে। ব্যবহারকারীর অনুমোদন প্রয়োজন এমন কোনো গুগল এপিআই অনুরোধ কার্যকর করার আগে আপনার অ্যাপ্লিকেশনটির অবশ্যই সেই সম্মতি থাকতে হবে।
ধাপ ১: গুগলের OAuth 2.0 সার্ভারে রিডাইরেক্ট করুন
কোনো ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি চাইতে, ব্যবহারকারীকে গুগলের OAuth 2.0 সার্ভারে রিডাইরেক্ট করুন।
OAuth 2.0 এন্ডপয়েন্ট
https://accounts.google.com/o/oauth2/v2/auth -এ অবস্থিত গুগলের OAuth 2.0 এন্ডপয়েন্ট থেকে অ্যাক্সেসের অনুরোধ করার জন্য একটি URL তৈরি করুন। এই এন্ডপয়েন্টটি HTTPS-এর মাধ্যমে অ্যাক্সেসযোগ্য; সাধারণ HTTP সংযোগ প্রত্যাখ্যান করা হয়।
গুগল অনুমোদন সার্ভার ওয়েব সার্ভার অ্যাপ্লিকেশনগুলির জন্য নিম্নলিখিত কোয়েরি স্ট্রিং প্যারামিটারগুলি সমর্থন করে:
| প্যারামিটার | |||||||
|---|---|---|---|---|---|---|---|
client_id | প্রয়োজনীয় আপনার অ্যাপ্লিকেশনের ক্লায়েন্ট আইডি। আপনি এই মানটি ক্লাউড কনসোল ক্লায়েন্টস পৃষ্ঠায় খুঁজে পাবেন। | ||||||
redirect_uri | প্রয়োজনীয় ব্যবহারকারী অনুমোদন প্রক্রিয়া সম্পন্ন করার পর এপিআই সার্ভার তাকে কোথায় রিডাইরেক্ট করবে, তা এটি নির্ধারণ করে। এই মানটি অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট ইউআরআইগুলোর মধ্যে একটির সাথে হুবহু মিলতে হবে, যা আপনি আপনার ক্লায়েন্টের ক্লাউড কনসোল ক্লায়েন্টস পৃষ্ঠায় কনফিগার করেছেন। যদি এই মানটি প্রদত্ত মনে রাখবেন যে | ||||||
response_type | প্রয়োজনীয় জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলিতে প্যারামিটারটির মান ' | ||||||
scope | প্রয়োজনীয় স্পেস দিয়ে আলাদা করা স্কোপগুলোর একটি তালিকা, যা সেই রিসোর্সগুলোকে শনাক্ত করে যেগুলো আপনার অ্যাপ্লিকেশন ব্যবহারকারীর পক্ষ থেকে অ্যাক্সেস করতে পারে। এই মানগুলো গুগল ব্যবহারকারীকে যে সম্মতি স্ক্রিনটি দেখায়, সেটির তথ্য সরবরাহ করে। স্কোপ আপনার অ্যাপ্লিকেশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্সগুলিতে অ্যাক্সেসের অনুরোধ করার সুযোগ দেয় এবং একই সাথে ব্যবহারকারীদেরকে আপনার অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেসের পরিমাণ নিয়ন্ত্রণ করতে সক্ষম করে। সুতরাং, অনুরোধ করা স্কোপের সংখ্যা এবং ব্যবহারকারীর সম্মতি পাওয়ার সম্ভাবনার মধ্যে একটি বিপরীত সম্পর্ক রয়েছে। আমরা সুপারিশ করি যে আপনার অ্যাপ্লিকেশনটি যখনই সম্ভব, প্রাসঙ্গিকতার ভিত্তিতে অথরাইজেশন স্কোপগুলিতে অ্যাক্সেসের অনুরোধ করবে। ইনক্রিমেন্টাল অথরাইজেশন ব্যবহার করে প্রাসঙ্গিকতার ভিত্তিতে ব্যবহারকারীর ডেটাতে অ্যাক্সেসের অনুরোধ করার মাধ্যমে, আপনি ব্যবহারকারীদের বুঝতে সাহায্য করেন যে আপনার অ্যাপ্লিকেশনটি যে অ্যাক্সেসের অনুরোধ করছে, তা কেন তার প্রয়োজন। | ||||||
state | সুপারিশকৃত এটি এমন যেকোনো স্ট্রিং ভ্যালু নির্দিষ্ট করে যা আপনার অ্যাপ্লিকেশনটি আপনার অথরাইজেশন রিকোয়েস্ট এবং অথরাইজেশন সার্ভারের রেসপন্সের মধ্যবর্তী অবস্থা (state) বজায় রাখতে ব্যবহার করে। ব্যবহারকারী আপনার অ্যাপ্লিকেশনের অ্যাক্সেস রিকোয়েস্টে সম্মতি বা অস্বীকৃতি জানানোর পর, সার্ভারটি আপনি এই প্যারামিটারটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, যেমন ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনের সঠিক রিসোর্সে নির্দেশ করা, ননস (nonce) পাঠানো এবং ক্রস-সাইট রিকোয়েস্ট ফোরজারি প্রতিরোধ করা। যেহেতু আপনার | ||||||
include_granted_scopes | ঐচ্ছিক অ্যাপ্লিকেশনগুলিকে প্রাসঙ্গিক অতিরিক্ত স্কোপগুলিতে অ্যাক্সেসের অনুরোধ করার জন্য ইনক্রিমেন্টাল অথরাইজেশন ব্যবহার করতে সক্ষম করে। যদি আপনি এই প্যারামিটারের মান ' | ||||||
enable_granular_consent | ঐচ্ছিক ডিফল্টরূপে এটি ' যখন গুগল কোনো অ্যাপ্লিকেশনের জন্য সুনির্দিষ্ট অনুমতি চালু করবে, তখন এই প্যারামিটারটির আর কোনো কার্যকারিতা থাকবে না। | ||||||
login_hint | ঐচ্ছিক আপনার অ্যাপ্লিকেশনটি যদি জানে কোন ব্যবহারকারী প্রমাণীকরণের চেষ্টা করছেন, তবে এটি গুগল অথেনটিকেশন সার্ভারকে একটি ইঙ্গিত দেওয়ার জন্য এই প্যারামিটারটি ব্যবহার করতে পারে। সার্ভারটি এই ইঙ্গিত ব্যবহার করে সাইন-ইন ফর্মের ইমেল ফিল্ডটি আগে থেকে পূরণ করে অথবা উপযুক্ত মাল্টি-লগইন সেশনটি নির্বাচন করে লগইন প্রক্রিয়াকে সহজ করে তোলে। প্যারামিটারের মান হিসেবে একটি ইমেল অ্যাড্রেস বা | ||||||
prompt | ঐচ্ছিক ব্যবহারকারীকে দেখানোর জন্য প্রম্পটগুলোর একটি তালিকা, যা স্পেস দিয়ে আলাদা করা এবং কেস-সেনসিটিভ। আপনি যদি এই প্যারামিটারটি নির্দিষ্ট না করেন, তাহলে আপনার প্রজেক্ট শুধুমাত্র প্রথমবার অ্যাক্সেসের অনুরোধ করার সময় ব্যবহারকারীকে প্রম্পট করা হবে। আরও তথ্যের জন্য ‘পুনরায় সম্মতি চাওয়া’ দেখুন। সম্ভাব্য মানগুলো হলো:
| ||||||
গুগলের অনুমোদন সার্ভারে নমুনা পুনঃনির্দেশ
পাঠযোগ্যতার জন্য লাইন ব্রেক এবং স্পেস সহ একটি উদাহরণ 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
রিকোয়েস্ট ইউআরএল তৈরি করার পর, ব্যবহারকারীকে সেখানে রিডাইরেক্ট করুন।
জাভাস্ক্রিপ্ট নমুনা কোড
নিম্নলিখিত জাভাস্ক্রিপ্ট কোডটি দেখায় কিভাবে জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে অথরাইজেশন প্রক্রিয়া শুরু করা যায়। যেহেতু এই 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(); }
ধাপ ২: গুগল ব্যবহারকারীর কাছে সম্মতি চায়
এই ধাপে, ব্যবহারকারী আপনার অ্যাপ্লিকেশনকে অনুরোধ করা অ্যাক্সেস দেবেন কিনা, সেই সিদ্ধান্ত নেন। এই পর্যায়ে, গুগল একটি সম্মতি উইন্ডো প্রদর্শন করে, যেখানে আপনার অ্যাপ্লিকেশনের নাম, ব্যবহারকারীর অনুমোদন ক্রেডেনশিয়াল ব্যবহার করে যে গুগল এপিআই পরিষেবাগুলিতে অ্যাক্সেসের অনুমতি চাওয়া হচ্ছে তার নাম এবং যে অ্যাক্সেসের পরিধিগুলো মঞ্জুর করা হবে তার একটি সারসংক্ষেপ দেখানো হয়। এরপর ব্যবহারকারী আপনার অ্যাপ্লিকেশনের অনুরোধ করা এক বা একাধিক পরিধিতে অ্যাক্সেস মঞ্জুর করতে সম্মতি দিতে পারেন অথবা অনুরোধটি প্রত্যাখ্যান করতে পারেন।
এই পর্যায়ে আপনার অ্যাপ্লিকেশনের কিছু করার প্রয়োজন নেই, কারণ এটি গুগলের OAuth 2.0 সার্ভার থেকে অ্যাক্সেস দেওয়া হয়েছে কিনা সেই প্রতিক্রিয়ার জন্য অপেক্ষা করে। সেই প্রতিক্রিয়াটি পরবর্তী ধাপে ব্যাখ্যা করা হয়েছে।
ত্রুটি
গুগলের OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টে করা অনুরোধগুলিতে প্রত্যাশিত অথেন্টিকেশন এবং অথরাইজেশন ফ্লো-এর পরিবর্তে ব্যবহারকারীর কাছে ত্রুটির বার্তা প্রদর্শিত হতে পারে। সাধারণ ত্রুটি কোড এবং প্রস্তাবিত সমাধানগুলি হলো:
admin_policy_enforced
আপনার Google Workspace অ্যাডমিনিস্ট্রেটরের নীতিমালার কারণে Google অ্যাকাউন্টটি অনুরোধ করা এক বা একাধিক স্কোপ অনুমোদন করতে পারছে না। একজন অ্যাডমিনিস্ট্রেটর কীভাবে আপনার OAuth ক্লায়েন্ট আইডিতে স্পষ্টভাবে অ্যাক্সেস মঞ্জুর না করা পর্যন্ত সমস্ত স্কোপ অথবা সংবেদনশীল ও সীমাবদ্ধ স্কোপগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে পারেন, সে সম্পর্কে আরও তথ্যের জন্য "কোন তৃতীয়-পক্ষ ও অভ্যন্তরীণ অ্যাপ Google Workspace ডেটা অ্যাক্সেস করবে তা নিয়ন্ত্রণ করুন" শীর্ষক Google Workspace অ্যাডমিন হেল্প আর্টিকেলটি দেখুন।
disallowed_useragent
অনুমোদন এন্ডপয়েন্টটি একটি এমবেডেড ইউজার-এজেন্টের ভিতরে প্রদর্শিত হয়, যা গুগলের OAuth 2.0 নীতিমালা দ্বারা অনুমোদিত নয়।
WKWebView তে অথরাইজেশন রিকোয়েস্ট খোলার সময় iOS এবং macOS ডেভেলপাররা এই ত্রুটির সম্মুখীন হতে পারেন। এর পরিবর্তে ডেভেলপারদের Google Sign-In for iOS অথবা OpenID Foundation-এর AppAuth for iOS-এর মতো iOS লাইব্রেরি ব্যবহার করা উচিত।
যখন কোনো iOS বা macOS অ্যাপ একটি এমবেডেড ইউজার-এজেন্টে একটি সাধারণ ওয়েব লিঙ্ক খোলে এবং কোনো ব্যবহারকারী আপনার সাইট থেকে Google-এর OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টে যান, তখন ওয়েব ডেভেলপাররা এই ত্রুটির সম্মুখীন হতে পারেন। ডেভেলপারদের উচিত সাধারণ লিঙ্কগুলোকে অপারেটিং সিস্টেমের ডিফল্ট লিঙ্ক হ্যান্ডলারে খোলার অনুমতি দেওয়া, যার মধ্যে ইউনিভার্সাল লিঙ্ক হ্যান্ডলার এবং ডিফল্ট ব্রাউজার অ্যাপ উভয়ই অন্তর্ভুক্ত। SFSafariViewController লাইব্রেরিটিও একটি সমর্থিত বিকল্প।
org_internal
অনুরোধে থাকা OAuth ক্লায়েন্ট আইডিটি একটি প্রকল্পের অংশ, যা একটি নির্দিষ্ট Google Cloud Organization- এর Google অ্যাকাউন্টগুলিতে অ্যাক্সেস সীমিত করে। এই কনফিগারেশন বিকল্পটি সম্পর্কে আরও তথ্যের জন্য, "আপনার OAuth সম্মতি স্ক্রিন সেট আপ করা" সাহায্য নিবন্ধের "ব্যবহারকারীর প্রকার" বিভাগটি দেখুন।
invalid_client
যে উৎস থেকে অনুরোধটি করা হয়েছে, তা এই ক্লায়েন্টের জন্য অনুমোদিত নয়। origin_mismatch দেখুন।
deleted_client
অনুরোধটি করার জন্য ব্যবহৃত OAuth ক্লায়েন্টটি মুছে ফেলা হয়েছে। অব্যবহৃত ক্লায়েন্টের ক্ষেত্রে, এই মুছে ফেলার কাজটি ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে হতে পারে। মুছে ফেলার ৩০ দিনের মধ্যে ক্লায়েন্ট পুনরুদ্ধার করা যেতে পারে। আরও জানুন ।
invalid_grant
ইনক্রিমেন্টাল অথরাইজেশন ব্যবহার করার সময়, টোকেনটির মেয়াদ শেষ হয়ে যেতে পারে বা এটি অবৈধ হয়ে যেতে পারে। ব্যবহারকারীকে পুনরায় প্রমাণীকরণ করুন এবং নতুন টোকেন পাওয়ার জন্য তার সম্মতি চান। আপনি যদি ক্রমাগত এই ত্রুটিটি দেখতে পান, তবে নিশ্চিত করুন যে আপনার অ্যাপ্লিকেশনটি সঠিকভাবে কনফিগার করা হয়েছে এবং আপনি আপনার অনুরোধে সঠিক টোকেন এবং প্যারামিটার ব্যবহার করছেন। অন্যথায়, ব্যবহারকারীর অ্যাকাউন্টটি মুছে ফেলা বা নিষ্ক্রিয় করা হয়ে থাকতে পারে।
origin_mismatch
অনুমোদন অনুরোধকারী জাভাস্ক্রিপ্টের স্কিম, ডোমেইন এবং/অথবা পোর্ট, OAuth ক্লায়েন্ট আইডির জন্য নিবন্ধিত কোনো অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে নাও মিলতে পারে। Google Cloud Console Clients পৃষ্ঠায় অনুমোদিত জাভাস্ক্রিপ্ট অরিজিনগুলো পর্যালোচনা করুন।
redirect_uri_mismatch
অনুমোদন অনুরোধে পাঠানো redirect_uri টি OAuth ক্লায়েন্ট আইডির জন্য কোনো অনুমোদিত রিডাইরেক্ট URI-এর সাথে মেলে না। Google Cloud Console-এর Clients পৃষ্ঠায় অনুমোদিত রিডাইরেক্ট URI-গুলো পর্যালোচনা করুন।
অনুমোদন অনুরোধকারী জাভাস্ক্রিপ্টের স্কিম, ডোমেইন এবং/অথবা পোর্ট, OAuth ক্লায়েন্ট আইডির জন্য নিবন্ধিত কোনো অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে নাও মিলতে পারে। Google Cloud Console Clients পৃষ্ঠায় অনুমোদিত জাভাস্ক্রিপ্ট অরিজিনগুলো পর্যালোচনা করুন।
redirect_uri প্যারামিটারটি OAuth আউট-অফ-ব্যান্ড (OOB) ফ্লো-কে নির্দেশ করতে পারে, যা বাতিল করা হয়েছে এবং এখন আর সমর্থিত নয়। আপনার ইন্টিগ্রেশন আপডেট করতে মাইগ্রেশন গাইডটি দেখুন।
invalid_request
আপনার করা অনুরোধটিতে কোনো সমস্যা ছিল। এর বেশ কয়েকটি কারণ থাকতে পারে:
- অনুরোধটি সঠিকভাবে বিন্যাস করা হয়নি।
- অনুরোধটিতে প্রয়োজনীয় প্যারামিটার অনুপস্থিত ছিল।
- অনুরোধটিতে এমন একটি অনুমোদন পদ্ধতি ব্যবহার করা হয়েছে যা গুগল সমর্থন করে না। আপনার OAuth ইন্টিগ্রেশনটি একটি প্রস্তাবিত ইন্টিগ্রেশন পদ্ধতি ব্যবহার করছে কিনা তা যাচাই করুন।
ধাপ ৩: 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প্যারামিটার ছাড়াও, fragment string-টিতেtoken_typeপ্যারামিটারও থাকে, যা সর্বদাBearerএ সেট করা থাকে, এবংexpires_inপ্যারামিটার থাকে, যা সেকেন্ডে টোকেনের মেয়াদকাল নির্দিষ্ট করে। যদি access token request-এstateপ্যারামিটারটি নির্দিষ্ট করা থাকে, তবে এর মানও response-এ অন্তর্ভুক্ত করা হয়।- একটি ত্রুটিপূর্ণ প্রতিক্রিয়া:
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 প্লেগ্রাউন্ড স্বয়ংক্রিয়ভাবে অথরাইজেশন কোডটি সংগ্রহ করে নিয়েছে।
ধাপ ৪: ব্যবহারকারীরা কোন কোন স্কোপ মঞ্জুর করেছেন তা যাচাই করুন।
একাধিক অনুমতি (স্কোপ) অনুরোধ করার সময়, ব্যবহারকারীরা আপনার অ্যাপকে সেগুলোর সবগুলোতে অ্যাক্সেস নাও দিতে পারেন। আপনার অ্যাপকে অবশ্যই যাচাই করতে হবে যে কোন স্কোপগুলো আসলে মঞ্জুর করা হয়েছে এবং কিছু অনুমতি প্রত্যাখ্যান করা হলে পরিস্থিতিটি সুষ্ঠুভাবে সামাল দিতে হবে; সাধারণত, সেই প্রত্যাখ্যান করা স্কোপগুলোর উপর নির্ভরশীল ফিচারগুলোকে নিষ্ক্রিয় করার মাধ্যমে এটি করা হয়।
তবে, এর ব্যতিক্রম রয়েছে। যে Google Workspace Enterprise অ্যাপগুলিতে ডোমেন-ব্যাপী কর্তৃত্ব অর্পণ করা থাকে, অথবা যে অ্যাপগুলিকে 'বিশ্বস্ত' (Trusted) হিসাবে চিহ্নিত করা হয়েছে, সেগুলি সুনির্দিষ্ট অনুমতির সম্মতি স্ক্রিনটি এড়িয়ে যায়। এই অ্যাপগুলির ক্ষেত্রে, ব্যবহারকারীরা সুনির্দিষ্ট অনুমতির সম্মতি স্ক্রিনটি দেখতে পাবেন না। এর পরিবর্তে, আপনার অ্যাপটি হয় অনুরোধ করা সমস্ত স্কোপ পাবে, অথবা কোনোটিই পাবে না।
আরও বিস্তারিত তথ্যের জন্য, কীভাবে সূক্ষ্ম অনুমতি পরিচালনা করতে হয় তা দেখুন।
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" }
গুগল এপিআই কল করা
OAuth 2.0 এন্ডপয়েন্ট
আপনার অ্যাপ্লিকেশন একটি অ্যাক্সেস টোকেন পাওয়ার পর, যদি এপিআই-এর জন্য প্রয়োজনীয় অ্যাক্সেসের সুযোগ(গুলি) মঞ্জুর করা হয়ে থাকে, তবে আপনি একটি নির্দিষ্ট ব্যবহারকারী অ্যাকাউন্টের পক্ষ থেকে একটি গুগল এপিআই-তে কল করার জন্য টোকেনটি ব্যবহার করতে পারেন। এটি করার জন্য, এপিআই-তে করা অনুরোধে একটি access_token কোয়েরি প্যারামিটার অথবা একটি Authorization HTTP হেডার Bearer ভ্যালু অন্তর্ভুক্ত করে অ্যাক্সেস টোকেনটি যোগ করুন। যখন সম্ভব, HTTP হেডার ব্যবহার করা শ্রেয়, কারণ কোয়েরি স্ট্রিংগুলো সার্ভার লগে দৃশ্যমান হওয়ার প্রবণতা থাকে। বেশিরভাগ ক্ষেত্রে আপনি গুগল এপিআই-তে আপনার কলগুলো সেট আপ করার জন্য একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, ড্রাইভ ফাইলস এপিআই-তে কল করার সময়)।
আপনি OAuth 2.0 প্লেগ্রাউন্ডে সমস্ত গুগল এপিআই ব্যবহার করে দেখতে এবং সেগুলোর পরিধি দেখতে পারেন।
HTTP GET উদাহরণ
Authorization: Bearer HTTP হেডার ব্যবহার করে drive.files এন্ডপয়েন্টে (ড্রাইভ ফাইলস এপিআই) একটি কল নিম্নলিখিতের মতো দেখতে হতে পারে। মনে রাখবেন, আপনাকে আপনার নিজস্ব অ্যাক্সেস টোকেন নির্দিষ্ট করতে হবে:
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
জাভাস্ক্রিপ্ট নমুনা কোড
নিচের কোড স্নিপেটটি দেখায় কিভাবে CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) ব্যবহার করে একটি গুগল এপিআই-তে অনুরোধ পাঠানো যায়। এই উদাহরণটিতে জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করা হয়নি। তবে, আপনি ক্লায়েন্ট লাইব্রেরিটি ব্যবহার না করলেও, সেই লাইব্রেরির ডকুমেন্টেশনে থাকা CORS সাপোর্ট গাইডটি সম্ভবত আপনাকে এই অনুরোধগুলো আরও ভালোভাবে বুঝতে সাহায্য করবে।
এই কোড স্নিপেটে, access_token ভেরিয়েবলটি সেই টোকেনকে বোঝায় যা আপনি অনুমোদিত ব্যবহারকারীর পক্ষ থেকে এপিআই (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 এন্ডপয়েন্ট
এই কোড স্যাম্পলটি দেখায় কিভাবে জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে OAuth 2.0 ফ্লো সম্পন্ন করা যায়। কোডটি একটি HTML পেজের জন্য, যেখানে একটি এপিআই রিকোয়েস্ট চেষ্টা করার জন্য একটি বাটন দেখানো হয়। আপনি বাটনটিতে ক্লিক করলে, কোডটি পরীক্ষা করে দেখে যে পেজটি আপনার ব্রাউজারের লোকাল স্টোরেজে কোনো এপিআই অ্যাক্সেস টোকেন সংরক্ষণ করেছে কিনা। যদি করে থাকে, তবে এটি এপিআই রিকোয়েস্টটি সম্পাদন করে। অন্যথায়, এটি OAuth 2.0 ফ্লো শুরু করে।
OAuth 2.0 ফ্লো-এর জন্য, পেজটি নিম্নলিখিত ধাপগুলো অনুসরণ করে:
- এটি ব্যবহারকারীকে গুগলের OAuth 2.0 সার্ভারে নিয়ে যায়, যা
https://www.googleapis.com/auth/drive.metadata.readonlyএবংhttps://www.googleapis.com/auth/calendar.readonlyস্কোপগুলোতে অ্যাক্সেসের অনুরোধ করে। - এক বা একাধিক অনুরোধকৃত স্কোপে অ্যাক্সেস মঞ্জুর (বা অস্বীকার) করার পর, ব্যবহারকারীকে মূল পৃষ্ঠায় পুনঃনির্দেশিত করা হয়, যেটি ফ্র্যাগমেন্ট আইডেন্টিফায়ার স্ট্রিং থেকে অ্যাক্সেস টোকেনটি পার্স করে।
- পৃষ্ঠাটি যাচাই করে দেখে যে ব্যবহারকারী অ্যাপ্লিকেশনটিতে কোন কোন স্কোপে অ্যাক্সেসের অনুমতি দিয়েছেন।
যদি ব্যবহারকারী অনুরোধ করা scope() গুলিতে অ্যাক্সেসের অনুমতি দিয়ে থাকেন, তাহলে পেজটি নমুনা API অনুরোধটি করার জন্য অ্যাক্সেস টোকেন ব্যবহার করে।
এপিআই অনুরোধটি অনুমোদিত ব্যবহারকারীর গুগল ড্রাইভ অ্যাকাউন্ট সম্পর্কিত তথ্য পুনরুদ্ধার করার জন্য ড্রাইভ এপিআই-এর
about.getমেথডকে কল করে।- অনুরোধটি সফলভাবে সম্পন্ন হলে, এপিআই প্রতিক্রিয়াটি ব্রাউজারের ডিবাগিং কনসোলে লগ করা হয়।
আপনি আপনার গুগল অ্যাকাউন্টের অনুমতি পৃষ্ঠা থেকে অ্যাপটিতে প্রবেশাধিকার প্রত্যাহার করতে পারেন। ক্লায়েন্ট আইডি তৈরির সময় OAuth সম্মতি স্ক্রিনের মধ্যে ব্র্যান্ডিং পৃষ্ঠায় প্রদত্ত অ্যাপ্লিকেশন নামটি হিসেবে অ্যাপটি তালিকাভুক্ত থাকে।
এই কোডটি স্থানীয়ভাবে চালানোর জন্য, আপনাকে YOUR_CLIENT_ID এবং YOUR_REDIRECT_URI ভেরিয়েবলগুলোর জন্য আপনার অনুমোদন ক্রেডেনশিয়াল অনুযায়ী মান সেট করতে হবে। YOUR_REDIRECT_URI ভেরিয়েবলটি অবশ্যই সেই একই URL-এ সেট করতে হবে যেখান থেকে পেজটি সার্ভ করা হচ্ছে। এই মানটি অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট URI-গুলোর একটির সাথে হুবহু মিলতে হবে, যা আপনি ক্লাউড কনসোল ক্লায়েন্টস পেজে কনফিগার করেছেন। যদি এই মানটি কোনো অনুমোদিত 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>জাভাস্ক্রিপ্ট উৎস যাচাইকরণ নিয়ম
ডেভেলপারদের তাদের অ্যাপ্লিকেশন সুরক্ষিত রাখতে সাহায্য করার জন্য গুগল জাভাস্ক্রিপ্ট অরিজিনের ক্ষেত্রে নিম্নলিখিত যাচাইকরণ নিয়মগুলি প্রয়োগ করে। আপনার জাভাস্ক্রিপ্ট অরিজিনকে অবশ্যই এই নিয়মগুলি মেনে চলতে হবে। নীচে উল্লিখিত ডোমেইন, হোস্ট এবং স্কিমের সংজ্ঞার জন্য RFC 3986-এর ৩ নং ধারা দেখুন।
| বৈধতার নিয়মাবলী | |
|---|---|
| পরিকল্পনা | জাভাস্ক্রিপ্ট অরিজিনে অবশ্যই HTTPS স্কিম ব্যবহার করতে হবে, সাধারণ HTTP নয়। লোকালহোস্ট ইউআরআই (লোকালহোস্ট আইপি অ্যাড্রেস ইউআরআই সহ) এই নিয়মের আওতামুক্ত। |
| হোস্ট | হোস্ট সরাসরি আইপি অ্যাড্রেস হতে পারে না। লোকালহোস্ট আইপি অ্যাড্রেস এই নিয়মের আওতামুক্ত। |
| ডোমেইন | “googleusercontent.com” হতে পারবে না।goo.gl ) থাকতে পারে না, যদি না অ্যাপটি ডোমেইনটির মালিক হয়। |
| ব্যবহারকারীর তথ্য | জাভাস্ক্রিপ্ট অরিজিনে ইউজারইনফো সাবকম্পোনেন্ট থাকতে পারে না। |
| পথ | জাভাস্ক্রিপ্ট অরিজিনে পাথ কম্পোনেন্ট থাকতে পারে না। |
| প্রশ্ন | জাভাস্ক্রিপ্ট অরিজিন-এ কোয়েরি কম্পোনেন্ট থাকতে পারে না। |
| খণ্ড | জাভাস্ক্রিপ্ট অরিজিনে ফ্র্যাগমেন্ট কম্পোনেন্ট থাকতে পারে না। |
| চরিত্র | জাভাস্ক্রিপ্ট অরিজিনে নিম্নলিখিত নির্দিষ্ট অক্ষরগুলো থাকতে পারে না:
|
ক্রমবর্ধমান অনুমোদন
OAuth 2.0 প্রোটোকলে, আপনার অ্যাপ রিসোর্স অ্যাক্সেস করার জন্য অনুমোদনের অনুরোধ করে, যা স্কোপ দ্বারা চিহ্নিত করা হয়। যখন আপনার রিসোর্সগুলির প্রয়োজন হয়, তখনই সেগুলির জন্য অনুমোদনের অনুরোধ করাকে একটি সেরা ব্যবহারকারী-অভিজ্ঞতার অনুশীলন হিসাবে বিবেচনা করা হয়। এই অনুশীলনটি সক্ষম করার জন্য, গুগলের অনুমোদন সার্ভার ইনক্রিমেন্টাল অথরাইজেশন সমর্থন করে। এই বৈশিষ্ট্যটি আপনাকে প্রয়োজন অনুযায়ী স্কোপের জন্য অনুরোধ করতে দেয় এবং, যদি ব্যবহারকারী নতুন স্কোপের জন্য অনুমতি দেয়, তবে একটি অনুমোদন কোড ফেরত দেয় যা একটি টোকেনের জন্য বিনিময় করা যেতে পারে, যে টোকেনটিতে ব্যবহারকারীর দ্বারা প্রজেক্টকে দেওয়া সমস্ত স্কোপ অন্তর্ভুক্ত থাকে।
উদাহরণস্বরূপ, এমন একটি অ্যাপ যা ব্যবহারকারীদের মিউজিক ট্র্যাকের নমুনা শুনতে এবং মিক্স তৈরি করতে দেয়, সেটির সাইন-ইন করার সময় খুব কম রিসোর্সের প্রয়োজন হতে পারে; সম্ভবত সাইন-ইনকারী ব্যক্তির নাম ছাড়া আর কিছুই নয়। তবে, একটি সম্পূর্ণ মিক্স সেভ করার জন্য তাদের গুগল ড্রাইভে অ্যাক্সেসের প্রয়োজন হবে। বেশিরভাগ মানুষই এটিকে স্বাভাবিক মনে করবে যদি অ্যাপটির প্রয়োজনের সময়ই কেবল তাদের গুগল ড্রাইভে অ্যাক্সেসের জন্য অনুরোধ করা হয়।
এক্ষেত্রে, সাইন-ইন করার সময় অ্যাপটি সাধারণ সাইন-ইন সম্পন্ন করার জন্য openid এবং profile স্কোপগুলোর জন্য অনুরোধ করতে পারে, এবং পরে একটি মিক্স সংরক্ষণ করার জন্য প্রথম অনুরোধের সময় https://www.googleapis.com/auth/drive.file স্কোপটির জন্য অনুরোধ করতে পারে।
ইনক্রিমেন্টাল অথরাইজেশন থেকে প্রাপ্ত অ্যাক্সেস টোকেনের ক্ষেত্রে নিম্নলিখিত নিয়মগুলি প্রযোজ্য:
- নতুন, সমন্বিত অনুমোদন ব্যবস্থার অন্তর্ভুক্ত যেকোনো স্কোপের সাথে সংশ্লিষ্ট রিসোর্স অ্যাক্সেস করার জন্য এই টোকেনটি ব্যবহার করা যাবে।
- যখন আপনি সম্মিলিত অনুমোদনের জন্য রিফ্রেশ টোকেন ব্যবহার করে একটি অ্যাক্সেস টোকেন পান, তখন সেই অ্যাক্সেস টোকেনটি সম্মিলিত অনুমোদনকে প্রতিনিধিত্ব করে এবং রেসপন্সে অন্তর্ভুক্ত যেকোনো
scopeভ্যালুর জন্য ব্যবহার করা যেতে পারে। - সম্মিলিত অনুমোদনে সেই সমস্ত স্কোপ অন্তর্ভুক্ত থাকে যা ব্যবহারকারী এপিআই প্রজেক্টকে মঞ্জুর করেছেন, এমনকি যদি মঞ্জুরিগুলো ভিন্ন ভিন্ন ক্লায়েন্ট থেকে অনুরোধ করা হয়ে থাকে। উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারী একটি অ্যাপ্লিকেশনের ডেস্কটপ ক্লায়েন্ট ব্যবহার করে একটি স্কোপে অ্যাক্সেস মঞ্জুর করেন এবং তারপর একটি মোবাইল ক্লায়েন্টের মাধ্যমে একই অ্যাপ্লিকেশনে আরেকটি স্কোপ মঞ্জুর করেন, তাহলে সম্মিলিত অনুমোদনে উভয় স্কোপই অন্তর্ভুক্ত হবে।
- যদি আপনি একটি সম্মিলিত অনুমোদনের প্রতিনিধিত্বকারী কোনো টোকেন বাতিল করেন, তাহলে সংশ্লিষ্ট ব্যবহারকারীর পক্ষ থেকে সেই অনুমোদনের সমস্ত স্কোপে প্রবেশাধিকার একই সাথে বাতিল হয়ে যায়।
নিচের কোড নমুনাগুলোতে দেখানো হয়েছে কীভাবে একটি বিদ্যমান অ্যাক্সেস টোকেনে স্কোপ যোগ করতে হয়। এই পদ্ধতিটি আপনার অ্যাপকে একাধিক অ্যাক্সেস টোকেন পরিচালনা করার ঝামেলা থেকে মুক্তি দেয়।
OAuth 2.0 এন্ডপয়েন্ট
বিদ্যমান অ্যাক্সেস টোকেনে স্কোপ যোগ করতে, গুগলের OAuth 2.0 সার্ভারে আপনার অনুরোধে include_granted_scopes প্যারামিটারটি অন্তর্ভুক্ত করুন।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে তা করতে হয়। এই স্নিপেটটি ধরে নেয় যে, আপনার অ্যাক্সেস টোকেনটি যে স্কোপগুলোর জন্য বৈধ, সেগুলো আপনি ব্রাউজারের লোকাল স্টোরেজে সংরক্ষণ করেছেন। ( সম্পূর্ণ উদাহরণ কোডটি ব্রাউজারের লোকাল স্টোরেজে 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. }
টোকেন প্রত্যাহার
কিছু ক্ষেত্রে একজন ব্যবহারকারী কোনো অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেস প্রত্যাহার করতে চাইতে পারেন। ব্যবহারকারী অ্যাকাউন্ট সেটিংস-এ গিয়ে অ্যাক্সেস প্রত্যাহার করতে পারেন। আরও তথ্যের জন্য, আপনার অ্যাকাউন্টে অ্যাক্সেস থাকা তৃতীয় পক্ষের সাইট ও অ্যাপস সম্পর্কিত সাপোর্ট ডকুমেন্টের ‘সাইট বা অ্যাপের অ্যাক্সেস সরান’ অংশটি দেখুন।
কোনো অ্যাপ্লিকেশনের পক্ষে প্রোগ্রাম্যাটিকভাবে তাকে দেওয়া অ্যাক্সেস প্রত্যাহার করাও সম্ভব। প্রোগ্রাম্যাটিক প্রত্যাহার সেইসব ক্ষেত্রে গুরুত্বপূর্ণ যেখানে একজন ব্যবহারকারী আনসাবস্ক্রাইব করেন, কোনো অ্যাপ্লিকেশন সরিয়ে ফেলেন, অথবা কোনো অ্যাপের জন্য প্রয়োজনীয় এপিআই রিসোর্স উল্লেখযোগ্যভাবে পরিবর্তিত হয়। অন্য কথায়, অপসারণ প্রক্রিয়ার একটি অংশ হিসেবে অ্যাপ্লিকেশনটিকে পূর্বে দেওয়া অনুমতিগুলো মুছে ফেলা নিশ্চিত করার জন্য একটি এপিআই অনুরোধ অন্তর্ভুক্ত থাকতে পারে।
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 ফেরত দেওয়া হয়।
নিম্নলিখিত জাভাস্ক্রিপ্ট কোডটিতে দেখানো হয়েছে কিভাবে জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে একটি টোকেন বাতিল করা যায়। যেহেতু টোকেন বাতিল করার জন্য গুগলের 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(); }
ক্রস-অ্যাকাউন্ট সুরক্ষা বাস্তবায়ন
আপনার ব্যবহারকারীদের অ্যাকাউন্ট সুরক্ষিত রাখার জন্য আরেকটি অতিরিক্ত পদক্ষেপ হলো গুগলের ক্রস-অ্যাকাউন্ট প্রোটেকশন সার্ভিস ব্যবহার করে ক্রস-অ্যাকাউন্ট প্রোটেকশন প্রয়োগ করা। এই পরিষেবাটি আপনাকে নিরাপত্তা ইভেন্টের নোটিফিকেশনের জন্য সাবস্ক্রাইব করার সুযোগ দেয়, যা ব্যবহারকারীর অ্যাকাউন্টের বড় ধরনের পরিবর্তন সম্পর্কে আপনার অ্যাপ্লিকেশনকে তথ্য সরবরাহ করে। এরপর, ইভেন্টগুলোতে আপনি কীভাবে সাড়া দেবেন সেই সিদ্ধান্ত অনুযায়ী ব্যবস্থা নিতে আপনি এই তথ্য ব্যবহার করতে পারেন।
গুগলের ক্রস-অ্যাকাউন্ট প্রোটেকশন সার্ভিস দ্বারা আপনার অ্যাপে পাঠানো ইভেন্ট টাইপগুলোর কিছু উদাহরণ হলো:
-
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
ক্রস অ্যাকাউন্ট প্রোটেকশন কীভাবে প্রয়োগ করতে হয় সে সম্পর্কে আরও তথ্যের জন্য এবং উপলব্ধ ইভেন্টগুলির সম্পূর্ণ তালিকার জন্য ‘ক্রস-অ্যাকাউন্ট প্রোটেকশনের মাধ্যমে ব্যবহারকারীর অ্যাকাউন্ট সুরক্ষিত করুন’ পৃষ্ঠাটি দেখুন।