এই ডকুমেন্ট থেকে জানতে পারবেন যে জাভাস্ক্রিপ্ট ওয়েব অ্যাপ্লিকেশন থেকে Google API অ্যাক্সেস করার জন্য OAuth 2.0 অথরাইজেশন কীভাবে প্রয়োগ করতে হয়। OAuth 2.0 ব্যবহারকারীদের তাদের ইউজারনেম, পাসওয়ার্ড এবং অন্যান্য তথ্য গোপন রেখে কোনও অ্যাপ্লিকেশনের সাথে নির্দিষ্ট ডেটা শেয়ার করার অনুমতি দেয়। যেমন, কোনও অ্যাপ্লিকেশন OAuth 2.0 ব্যবহার করে ব্যবহারকারীর Google Drive-এ ফাইল সেভ করার অনুমতি চাইতে পারে।
এই 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 চালু করতে:
- Google API Console-এ API লাইব্রেরি খুলুন।
- প্রম্পট করা হলে, কোনও প্রোজেক্ট বেছে নিন অথবা নতুন একটি তৈরি করুন।
- API লাইব্রেরিতে উপলভ্য সব API-এর তালিকা থাকে, যা প্রোডাক্ট ফ্যামিলি ও জনপ্রিয়তার ভিত্তিতে গ্রুপ করা থাকে। আপনি যে API চালু করতে চান সেটি তালিকায় দেখতে না পেলে, সার্চ করে সেটি খুঁজে নিন অথবা যে প্রোডাক্ট ফ্যামিলির অন্তর্গত সেটিতে সব দেখুন বিকল্পে ক্লিক করুন।
- আপনি যে API চালু করতে চান সেটি বেছে নিন, তারপর চালু করুন বোতামে ক্লিক করুন।
- প্রম্পট করা হলে, বিলিং চালু করুন।
- প্রম্পট করা হলে, API-এর পরিষেবার শর্তাবলী পড়ে সম্মতি দিন।
অনুমোদনের ক্রেডেনশিয়াল তৈরি করুন
Google API অ্যাক্সেস করার জন্য OAuth 2.0 ব্যবহার করে এমন যেকোনও অ্যাপ্লিকেশনের কাছে অবশ্যই অনুমোদনের ক্রেডেনশিয়াল থাকতে হবে যা Google-এর OAuth 2.0 সার্ভারে অ্যাপ্লিকেশনটিকে শনাক্ত করে। আপনার প্রোজেক্টের জন্য কীভাবে ক্রেডেনশিয়াল তৈরি করবেন তা নিম্নলিখিত ধাপগুলি থেকে জানতে পারবেন। আপনার অ্যাপ্লিকেশন তখন ক্রেডেনশিয়াল ব্যবহার করে সেইসব API অ্যাক্সেস করতে পারবে যেগুলি আপনি সেই প্রোজেক্টের জন্য চালু করেছেন।
- ক্লায়েন্ট পৃষ্ঠায় যান।
- ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
- ওয়েব অ্যাপ্লিকেশন অ্যাপ্লিকেশনের ধরন বেছে নিন।
- ফর্ম পূরণ করা সম্পূর্ণ করুন। যেসব অ্যাপ্লিকেশন অনুমোদিত 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 অনুরোধ কার্যকর করার আগে আপনার অ্যাপ্লিকেশনের কাছে অবশ্যই সেই সম্মতি থাকতে হবে।
ধাপ ১: 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
ক্লায়েন্ট পৃষ্ঠা-তে কনফিগার করেছেন। এই ভ্যালু যদি প্রদত্ত মনে রাখবেন যে |
||||||
response_type |
আবশ্যক
JavaScript অ্যাপ্লিকেশনকে প্যারামিটারের মান |
||||||
scope |
আবশ্যক
ব্যবহারকারীর হয়ে আপনার অ্যাপ্লিকেশন যেসব রিসোর্স অ্যাক্সেস করতে পারে, সেগুলি শনাক্ত করার জন্য স্পেস-ডিলিমিটেড স্কোপের তালিকা। এইসব ভ্যালু সম্মতি সংক্রান্ত স্ক্রিনকে জানায় যে Google ব্যবহারকারীকে কী দেখায়। স্কোপ আপনার অ্যাপ্লিকেশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্স অ্যাক্সেস করার অনুরোধ করতে দেয় এবং ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেসের পরিমাণ নিয়ন্ত্রণ করতে দেয়। তাই, অনুরোধ করা স্কোপের সংখ্যা এবং ব্যবহারকারীর সম্মতি পাওয়ার সম্ভাবনার মধ্যে বিপরীত সম্পর্ক রয়েছে। আমরা সাজেস্ট করি যে আপনার অ্যাপ্লিকেশন যখনই সম্ভব হবে তখনই প্রসঙ্গে অনুমোদনের স্কোপে অ্যাক্সেসের অনুরোধ করবে। ইনক্রিমেন্টাল অনুমোদনের মাধ্যমে, প্রাসঙ্গিক ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুরোধ করে, আপনি ব্যবহারকারীদের বুঝতে সাহায্য করেন যে আপনার অ্যাপ্লিকেশন কেন অ্যাক্সেসের অনুরোধ করছে। |
||||||
state |
সাজেস্ট করা হয়
আপনার অ্যাপ্লিকেশন, আপনার অনুমোদনের অনুরোধ এবং অনুমোদন সার্ভারের উত্তরের মধ্যে স্ট্যাটাস বজায় রাখার জন্য যে স্ট্রিং ভ্যালু ব্যবহার করে তা নির্দিষ্ট করে।
ব্যবহারকারী আপনার অ্যাপ্লিকেশনের অ্যাক্সেসের অনুরোধে সম্মতি বা অসম্মতি জানানোর পরে,
সার্ভারটি ঠিক সেই ভ্যালু ফেরত দেয় যা আপনি
আপনি এই প্যারামিটারটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, যেমন ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনের সঠিক রিসোর্সে
নির্দেশ করা, ননস পাঠানো এবং ক্রস-সাইট অনুরোধ
জালিয়াতি কমানো। আপনার |
||||||
include_granted_scopes |
ঐচ্ছিক
অ্যাপ্লিকেশনকে ইনক্রিমেন্টাল অথরাইজেশন ব্যবহার করার অনুমতি দেয় যাতে কন্টেক্সটে অতিরিক্ত
স্কোপ অ্যাক্সেস করার অনুরোধ করা যায়। আপনি এই প্যারামিটারের ভ্যালু |
||||||
enable_granular_consent |
ঐচ্ছিক
ডিফল্ট হিসেবে Google কোনও অ্যাপ্লিকেশনের জন্য গ্র্যানুলার অনুমতি চালু করলে, এই প্যারামিটার আর কাজ করবে না। |
||||||
login_hint |
ঐচ্ছিক
কোন ব্যবহারকারী যাচাই করার চেষ্টা করছেন তা আপনার অ্যাপ্লিকেশন জানলে, এটি Google যাচাইকরণ সার্ভারকে ইঙ্গিত দিতে এই প্যারামিটার ব্যবহার করতে পারে। সাইন-ইন ফর্মে ইমেল ফিল্ড আগে থেকে পূরণ করে অথবা উপযুক্ত মাল্টি-লগ-ইন সেশন বেছে নিয়ে লগ-ইন ফ্লো সহজ করার জন্য সার্ভার এই ইঙ্গিত ব্যবহার করে। প্যারামিটারের মান কোনও ইমেল আইডি বা |
||||||
prompt |
ঐচ্ছিক
ব্যবহারকারীকে দেখানোর জন্য স্পেস-ডিলিমিটেড, ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয় এমন প্রম্পটের তালিকা। আপনি এই প্যারামিটার উল্লেখ না করলে, আপনার প্রোজেক্ট অ্যাক্সেসের জন্য অনুরোধ করার সময় ব্যবহারকারীকে শুধুমাত্র প্রথমবার প্রম্পট করা হবে। আরও তথ্যের জন্য আবার সম্মতি দেওয়ার জন্য প্রম্পট করা দেখুন। সম্ভাব্য ভ্যালুগুলি হল:
|
||||||
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 APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে জাভাস্ক্রিপ্টে কীভাবে অনুমোদনের ফ্লো শুরু করতে হয়। যেহেতু এই 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 Playground-এ রিডাইরেক্ট করে, যা 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 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 এন্ডপয়েন্ট
এই কোড স্যাম্পেল দেখায় যে কীভাবে JavaScript-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে JavaScript-এ OAuth 2.0 ফ্লো সম্পূর্ণ করতে হয়। এই কোডটি একটি HTML পৃষ্ঠার জন্য যা API অনুরোধ করার জন্য একটি বোতাম দেখায়। আপনি বোতামে ক্লিক করলে, কোডটি চেক করে দেখে যে পৃষ্ঠাটি আপনার ব্রাউজারের লোকাল স্টোরেজে একটি API অ্যাক্সেস টোকেন স্টোর করেছে কিনা। যদি তাই হয়, তাহলে এটি API অনুরোধ কার্যকর করে। অন্যথায়, এটি OAuth 2.0 ফ্লো শুরু করে।
OAuth 2.0 ফ্লোয়ের জন্য, পৃষ্ঠাটি এইসব ধাপ অনুসরণ করে:
- এটি ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে নিয়ে যায়, যা
https://www.googleapis.com/auth/drive.metadata.readonlyএবংhttps://www.googleapis.com/auth/calendar.readonlyস্কোপে অ্যাক্সেসের অনুরোধ করে। - এক বা একাধিক অনুরোধ করা স্কোপে অ্যাক্সেস মঞ্জুর (বা প্রত্যাখ্যান) করার পরে, ব্যবহারকারীকে আসল পৃষ্ঠায় রিডাইরেক্ট করা হয়, যা ফ্র্যাগমেন্ট আইডেন্টিফায়ার স্ট্রিং থেকে অ্যাক্সেস টোকেন পার্স করে।
- ব্যবহারকারী অ্যাপ্লিকেশনটিকে কোন কোন স্কোপে অ্যাক্সেস দিয়েছেন তা পৃষ্ঠাটি চেক করে।
ব্যবহারকারী অনুরোধ করা স্কোপে() অ্যাক্সেস দিলে, পৃষ্ঠাটি স্যাম্পেল API অনুরোধ করতে অ্যাক্সেস টোকেন ব্যবহার করে।
API অনুরোধ, অনুমোদিত ব্যবহারকারীর Google Drive অ্যাকাউন্ট সম্পর্কে তথ্য পেতে Drive API-এর
about.getপদ্ধতিকে কল করে।- অনুরোধটি সফলভাবে কার্যকর হলে, 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 নয়। Localhost URI (localhost IP অ্যাড্রেস URI সহ) এই নিয়মের আওতাভুক্ত নয়। |
| হোস্ট |
হোস্ট র IP অ্যাড্রেস হতে পারবে না। Localhost IP অ্যাড্রেস এই নিয়মের আওতাভুক্ত নয়। |
| ডোমেন |
“googleusercontent.com” হতে পারবে না।goo.gl)
থাকতে পারবে না। |
| Userinfo |
JavaScript অরিজিনে userinfo সাবকম্পোনেন্ট থাকলে চলবে না। |
| পাথ |
জাভাস্ক্রিপ্ট অরিজিনে পাথ কম্পোনেন্ট থাকতে পারবে না। |
| কোয়েরি |
JavaScript অরিজিনে কোয়েরি কম্পোনেন্ট থাকলে চলবে না। |
| ফ্র্যাগমেন্ট |
JavaScript অরিজিনে ফ্র্যাগমেন্ট কম্পোনেন্ট থাকতে পারবে না। |
| চরিত্র |
জাভাস্ক্রিপ্ট অরিজিনে এই ধরনের অক্ষর থাকতে পারবে না:
|
ইনক্রিমেন্টাল অনুমোদন
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
ক্রস-অ্যাকাউন্ট সুরক্ষা কীভাবে প্রয়োগ করবেন এবং উপলভ্য ইভেন্টের সম্পূর্ণ তালিকা সম্পর্কে আরও তথ্য পেতে ক্রস-অ্যাকাউন্ট সুরক্ষার মাধ্যমে ব্যবহারকারীর অ্যাকাউন্ট সুরক্ষিত করুন পৃষ্ঠা দেখুন।