ডিজাইনিং রেস্ট এপিআই [৩] : এপিআই অথেনটিকেশন

in ডিজাইনিং রেস্ট এপিআই,

এপিআই অথেনটিকেশন রেস্ট ডেভেলপারদের কাছে একটি চ্যালেন্জ । রেস্ট এর একটি কম্পোনেন্ট হল এপিআই অবশ্যই স্টেটলেস হতে হবে যেটি client-stateless-server (CSS) এ সঙ্গায়িত করা হয়েছে । রেস্ট এর স্ট্রাকচার সবাই মানলেও অথেন্টিকেশনের সময় বেশিরভাগ ডেভেলপারই এই দিকটা এড়িয়ে চলে । এই পর্বে রেস্টফুল এপিআই অথেনটিকেশন নিয়ে আলোচনা করব ।

এপিআই অথেনটিকেশন

এপিআই অথেনটিকেশনের কথা বললেই শুরুতেই ওঅথ  OAUTH এর কথা আগে চলে আছে । অথেনটিকেশন এবং অথোরাইজেশনের জন্য ওঅথ এর ব্যবহার সবচেয়ে বেশি । গুগল, ফেসবুক, টুইটার সহ প্রায় বেশিরভাগ থার্ড পার্টি অথেনটিকেশনে অওথ ব্যবহৃত হয় । ওঅথ নিয়ে বিস্তারিত আলোচনার পূর্বে চলুন দেথে নেয়া যাক, সাধারন অথেনটিকেশন কিভাবে করা হয় :

আমাদের পরিচিত ওয়েব অথেনটিকেশন

স্ট্যান্ডার্ড HTTP সেশন বেজ অথেনটিকেশনের কিছু কমন স্টেপ হল

১। ক্লায়েন্ট ব্যবহারকারীর লগিন তথ্য সার্ভারে সেন্ড করে ।
২। সার্ভার সেই তথ্য ভেরিফাই করে একটি টোকেন জেনারেট করে ।
৩। এই টোকেন সার্ভার এবং ক্লায়েন্ট কুকিতে [sessionid=random-token] স্টোর থাকে।
৪। এখন ক্লায়েন্ট প্রতিটি রিকোয়েস্ট এর সাথে কুকি হেডারটি যুক্ত করে রিকোয়েস্ট সেন্ড করে।
৫। সার্ভার সেই টোকেনটি দিয়ে ডাটাবেজে কোয়েরী করে ব্যবহারকারীকে সনাক্ত করে।

Oauth2 অথেনটিকেশন

১। ক্লায়েন্ট ব্যবহারকারীর লগিন তথ্য সার্ভারে সেন্ড করে ।
২। সার্ভার সেই তথ্য ভেরিফাই করে একটি টোকেন জেনারেট করে ।
৩। এই টোকেন সার্ভারে স্টোর থাকে এবং টোকেনটি রেসপন্স বডিতে রিটার্ন করে।
৪। এখন ক্লায়েন্ট প্রতিটি রিকোয়েস্টের “Authorization” হেডারে ঐ টোকেনটি যুক্ত করে রিকোয়েস্ট সেন্ড করে।
৫। সার্ভার সেই টোকেনটি দিয়ে ডাটাবেজে কোয়েরী করে ব্যবহারকারীকে সনাক্ত করে।

কোনটি স্টেটলেস?

দুইটির মধ্যে পার্থক্য করে সহজেই বুঝতে পারি যে স্ট্যান্ডার্ড HTTP  সেশন অথেনটিকেশনের সাথে ওঅথ২ এর তেমন কোন পার্থক্য নেই । শুধু পার্থক্যটা হল রিকোয়েস্ট করার সময় দুটি মেথড দুটি ভিন্ন হেডার ব্যবহার করে। শুধু মাত্র হেডারের পার্থক্য থাকলেই তাকে আমারা স্টেটলেস বলতে পারি না । আমরা চাইলে টোকেন হেডারটি Authorization ফিল্ড এ না রেখে আমাদের মন মত একটি কাস্টম হেডারে সেন্ড করলেও কিছু যায় আসে না। স্টেটলেস আমরা তখনই বলতে পারি যখন অথোরাইজেশন টোকেনটি স্ট্যাটিক হবে অর্থাৎ এর কোন সেশন বা মেয়াদকাল থাকবে না । যেহেতু মেথড দুটি দ্বারা যে টোকেন জেনারেট হয় তা একটি সময় পর আর ভ্যালিড থাকে না তাই এই মেথডগুলো স্টেটলেস হতে পারে না ।

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

Like most real-world systems, not all components of the deployed Web architecture obey every constraint present in its architectural design. REST has been used both as a means to define architectural improvements and to identify architectural mismatches. Mismatches occur when, due to ignorance or oversight, a software implementation is deployed that violates the architectural constraints. While mismatches cannot be avoided in general, it is possible to identify them before they become standardized.

স্টেটলেস অথেনটিকেশন কি ?

আবারো বলতে হয়, স্টেটলেস মানে হল রিকোয়েস্ট এর কোন সময় সাপেক্ষিক ভ্যালিডিটি থাকবে না । তাহলে শুধু মাত্র টোকেন দিয়ে স্টেটলেস রিকোয়েস্ট করা কি সম্ভব ? উত্তর হ্যা ! খুব সহজেই আপনি তা করতে পারেন । নিচের ছবিটির দিকে খেয়াল করুন

এপিআই অথেনটিকেশন

ফেসবুক এবং টুইটার অথেনটিকেশনের জন্য দুইটি ভিন্ন টোকেন প্রোভাইড করে থাকে । এগুলোর মধ্যে একটি পাবলিক আরেকটি প্রাইভেট বা সিক্রেট  টোকেন [KEY]

পাবলিক এপিআই টোকেন

উপরের চিত্রে AppID/API key/Consumer key হল পাবলিক টোকেন যা আপনি প্রতিটি রিকোয়েস্ট এর সাথে সার্ভারে সেন্ড করবেন । এই টোকেনটি যদি অন্য কেউ জেনে যায় তাহলে আপনার তেমন কিছু যায় আসে না । বুঝার জন্য ধরে নিতে পারেন এটি আপনার লগিন ইউজার নেম ।

https://maps.googleapis.com/maps/api/geocode/json?address=abc&key=API_KEY

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

প্রাইভেট এপিআই টোকেন

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

$data = $request_uri . $content_type. $content_body;
$hash =  hash_hmac ( "sha1", $data, PRIVATE_KEY );
PUT /accounts/12 HTTP/1.1
 Host: localhost
 Authorization: 8458fh9385793fheoiw9375398450394oniu
 Cache-Control: no-cache
 Content-Type: application/x-www-form-urlencoded

 param=this-is-the-request-body

আমাজন এস৩ রেস্ট অথেনটিকেশন যেভাবে হ্যাশ কোড জেনারেট করে তার একটি উদাহরন:

h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
    "PUT\nc8fdb181845a4ca6b8fec737b3581d76\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic:ab
     racadabra\nx-amz-meta-author:foo@bar.com\n/quotes/nelson",sha)
base64.encodestring(h.digest()).strip()

এভাবে রিকোয়েস্ট করার কিছু সুবিধা হল :

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

টাইম স্ট্যাম্প কেন দরকার ?

রিকোয়েস্ট করার সময় একটি বাড়তি টাইমস্ট্যাম্প প্যারামিটার দেয়া উচিত যা রিকোয়েস্ট টাইম বা রিকোয়েস্ট  এক্সপায়ার টাইম হিসেবে ধরা হবে। টাইম স্ট্যাম্প যুক্ত করলে স্টেটলেস এর সূত্র ক্ষুন্ন হয় না, কারন এটি একটি ভ্যালিডেশন প্যারামিটার মাত্র এবং এটি কোন ইউজারের সেশন কে প্রকাশ করে না । বরং এটি ঐ রিকোয়েস্ট এর সময়কালকে প্রকাশ করে । ধরুন পুরো রিকোয়েস্ট টি প্রাইভেট টোকেন দিয়ে এনক্রিপ্ট করার পর হ্যাশ কোডটি যদি vjbyPxybdZaNmGa%2ByT272YEAiv4%3Dহয় তাহলে সম্পূর্ন রিকোয়েস্টি হবে এমন :

http://s3.amazonaws.com/quotes/nelson?AWSAccessKeyId=44CF9590006BF252F707&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&data=some-data

এখন এই লিংকটি অন্যকেউ ক্লায়েন্ট বা ব্রাউজার হিস্টোরি থেকে কিংবা স্নাইফিং করে আবার রিকোয়েস্ট করলে সার্ভাস বুঝতে পারবে যে রিকোয়েস্ট টি ইনভ্যালিড । কেউ যদি Expires=1141889120 এর মান পরিবর্তন করে দেয় তাহলে রিকোয়েস্ট টি এনক্রিপ্ট করলে হ্যাশ কোড আর  vjbyPxybdZaNmGa%2ByT272YEAiv4%3D থাকবে না সুতরাং রিকোয়েস্ট টি ইনভ্যালিড হিসেবে গন্য হবে।

বেসিক HTTP অথেনটিকেশন

এই দুটি পদ্ধতি ছাড়াও অথেনটিকেশনের জন্য অনেকেই বেসিক HTTP অথেনটিকেশন ব্যবহার করেন এবং এটি সম্ভবত সবচেয়ে সহজ অথেনটিকেশন মেথড। আপনি যদি অথেনটিকেশন এর জন্য বেসিক HTTP অথোরাইজেশন চিন্তা করে থাকেন তাহলে আপনাকে অবশ্যই SSL বা HTTPS প্রোটেকলের মাধ্যমে রিকোয়েস্ট করতে হবে । কারন বেসিক HTTP অথোরাইজেশন ব্যবহৃত Base64 এনক্রিপশন যে কেউ সহজেই ডিকোড করতে পারবে ।

Authorization: Basic aWtydW06bG92ZQ==

SSL আবশ্যক :

নেটওয়ার্ক  স্নাইফিং করা আজকাল ছেলেখেলা হয়ে গেছে । তাই রিকোয়েস্ট ডাটার সুরক্ষায় একটি ভাল SSL ব্যবহার করা উচিত । আর বেসিক HTTP অথেনটিকেশন SSL ব্যতিত চিন্তাও করা ঠিক হবে না। মনে রাখবেন Self-signed SSL ব্যবহার করা আর না করা একই কথা।

পরবর্তী পোস্ট   »  ডিজাইনিং রেস্ট এপিআই [৪] : ইরর ডিজাইন


মুক্ত জ্ঞান ছড়িয়ে দিন সবার মাঝে!