.NET ক্লায়েন্ট লাইব্রেরির সাথে AuthSub ব্যবহার করা

জেফ ফিশার, Google Data APIs টিম
আগস্ট 2007

ভূমিকা: কেন AuthSub গুরুত্বপূর্ণ?

গুগল ডেটা API (সংক্ষেপে "GData") সম্পর্কে দুর্দান্ত জিনিসটি হল কীভাবে তারা বিকাশকারীদের এমন অ্যাপ্লিকেশন তৈরি করতে দেয় যা Google পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করে। আরও নির্দিষ্টভাবে, তারা আপনাকে আপনার অ্যাপ্লিকেশনে ব্যবহারের জন্য ব্যক্তিগত ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি দেয়। APIগুলি আপনাকে সিঙ্ক্রোনাইজ, আমদানি, রপ্তানি এবং অন্যথায় সেই ডেটা পরিচালনা করতে অ্যাপ্লিকেশন লিখতে সক্ষম করে। যদিও APIগুলি আপনাকে এই শক্তিশালী ক্ষমতা প্রদান করে, আপনাকে তাদের দায়িত্বের সাথে ব্যবহার করার কথা মনে রাখতে হবে। যেহেতু ব্যবহারকারীর ডেটা ব্যক্তিগত তথ্য, স্বাভাবিকভাবেই আপনি এটি একটি নিরাপদ উপায়ে অ্যাক্সেস করতে চান। এর একটি মূল অংশ হল নিরাপদ ফ্যাশনে Google এর সার্ভারে প্রমাণীকরণ করতে সক্ষম হওয়া।

ধরা যাক আপনার কাছে একটি দুর্দান্ত নতুন ওয়েব অ্যাপ্লিকেশন রয়েছে যা আপনি Google ওয়েব পরিষেবাগুলিতে সঞ্চিত ডেটার সাথে সংযুক্ত করতে চান৷ এখন আপনি এই ব্যক্তিগত ডেটা অ্যাক্সেস করার জন্য প্রমাণীকরণ করতে চান। কেন শুধু সহজ কিছু ব্যবহার করবেন না, যেমন ClientLogin ? ঠিক আছে, এটি কৌশলটি করবে, কিন্তু তারপরে আপনি আরও বেশি ব্যক্তিগত ডেটা পরিচালনা করছেন: ব্যবহারকারীর লগইন শংসাপত্র। ClientLogin-এর জন্য ব্যবহারকারীর Google ব্যবহারকারীর নাম এবং পাসওয়ার্ড চাওয়ার জন্য আপনার অ্যাপ্লিকেশনের প্রয়োজন। এটি একটি ডেস্কটপ অ্যাপ্লিকেশনের জন্য ঠিক আছে যা ব্যবহারকারীর ব্যক্তিগত মেশিনে চলছে, কিন্তু একটি ওয়েব-ভিত্তিক অ্যাপ্লিকেশনের জন্য আদর্শের চেয়ে কম। আপনার নিজের সার্ভারে এই শংসাপত্রগুলি পরিচালনা করার দায়বদ্ধতার পাশাপাশি, সম্ভবত আপনার আরও কিছু সতর্ক ব্যবহারকারী ভয় পাবেন যে আপনি তাদের তথ্য সংরক্ষণ করতে পারেন। ব্যবহারকারীদের আরেকটি সাধারণ উদ্বেগ হল যদি তারা শুধুমাত্র একটি নির্দিষ্ট পরিষেবাতে (যেমন তাদের Google ক্যালেন্ডারের ইভেন্টগুলি) একটি প্রোগ্রাম অ্যাক্সেস দিতে চায় তবে অন্য কোনো পরিষেবাতে (যেমন তাদের Google ডকুমেন্ট) নয়। AuthSub একটি ব্যবহারকারীকে Google এর সার্ভারের মাধ্যমে প্রমাণীকরণ করার অনুমতি দিয়ে এই উভয় সমস্যার সমাধান করে এবং আপনার প্রোগ্রামটিকে শুধুমাত্র তার প্রয়োজনীয় অ্যাক্সেসের জন্য অনুরোধ করার অনুমতি দেয়।

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

হ্যান্ডলিং প্রমাণীকরণ

তাই আসলে আপনার ওয়েব অ্যাপ্লিকেশন AuthSub ব্যবহার করার জন্য কি প্রয়োজন? প্রথমত, GData ক্লায়েন্ট লাইব্রেরি থেকে কিছু মানসম্পন্ন আমদানি রয়েছে:

<%@ Import Namespace="Google.GData.Client" %>
<%@ Import Namespace="Google.GData.Extensions" %>
<%@ Import Namespace="System.Net" %>

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

authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
  • টার্গেট এটি আপনার ওয়েব অ্যাপ্লিকেশনের URL ধারণকারী একটি স্ট্রিং। এখানেই ব্যবহারকারীকে প্রমাণীকরণের পরে পুনঃনির্দেশিত করা হবে।
  • সুযোগ এই স্ট্রিং আপনি কোন API ব্যবহার করছেন তার দ্বারা নির্ধারিত হয়। এটি একটি GData API-এর একটি ফিডের সাথে মিলে যায়। উদাহরণস্বরূপ, একজন ব্যবহারকারীর জন্য সমস্ত ক্যালেন্ডার তথ্য ধারণকারী ফিড হল "http://www.google.com/calendar/feeds/default/private/full"৷
  • নিরাপদ এটি একটি বুলিয়ান যা সার্ভারকে বলে যে আপনি Google এর সাথে নিবন্ধন করেছেন এবং সার্ভারে আপনার অনুরোধগুলিকে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষর করবেন৷ এই যুক্তিটি সাধারণত ডিফল্টরূপে মিথ্যা হয়, বিশেষ করে যখন একটি পরীক্ষার পরিবেশে কাজ করে।
  • অধিবেশন এটি আরেকটি বুলিয়ান যা নির্দেশ করে যে আপনি "একবার ব্যবহারের টোকেন" এর পরিবর্তে একটি "সেশন টোকেন" চান। এই যুক্তির ভূমিকা মুহূর্তের মধ্যে আরও স্পষ্ট হয়ে উঠবে।

ব্যবহারকারী জেনারেট করা URL-এ ক্লিক করার পরে, তাদের একটি Google অ্যাকাউন্ট পৃষ্ঠায় নিয়ে যাওয়া হবে যা তাদের Google অ্যাকাউন্টে সাইন ইন করতে দেয়। তারপরে তাদের "টার্গেট" ভেরিয়েবলে আপনার নির্দিষ্ট করা ওয়েব পৃষ্ঠায় পুনঃনির্দেশিত করা হবে, কিন্তু একটি ক্যোয়ারী প্যারামিটার "টোকেন" সহ যার মধ্যে একটি একবার ব্যবহারের টোকেন রয়েছে৷ সাধারণত, এই টোকেনটি ঠিক একবার ব্যবহার করা যেতে পারে। অর্থাৎ, এটি একটি প্রদত্ত ফিডে একটি ক্রিয়া সম্পাদন করতে ব্যবহার করা যেতে পারে। যাইহোক, যদি আপনি "সেশন" প্যারামিটারটিকে সত্য হিসাবে নির্দিষ্ট করেন, তাহলে এটি একটি "সেশন টোকেন" এর জন্য বিনিময় করা যেতে পারে যা ব্যবহারকারীর সেশন শেষ না হওয়া পর্যন্ত পুনরায় ব্যবহার করা যেতে পারে। আপনি নিম্নলিখিত পদ্ধতিতে এটি করতে পারেন:

String token = Request.QueryString["token"];
Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString();

এখানে আপনি ক্যোয়ারী প্যারামিটার থেকে টোকেনটি বের করেন এবং এটি একটি "সেশন টোকেন" এর জন্য বিনিময় করেন। তারপরে, যাতে এটি পরবর্তী ব্যবহারের জন্য সংরক্ষণ করা যায়, আপনি এটিকে .NET-এর স্বয়ংক্রিয় Session অ্যারেতে সংরক্ষণ করতে বেছে নিতে পারেন। স্বাভাবিকভাবেই, আপনি একটি ডাটাবেসের মধ্যে টোকেন সংরক্ষণ করতেও বেছে নিতে পারেন। পরের ধাপ হল এই টোকেনটি ব্যবহার করে একটি প্রমাণীকৃত অনুরোধ করা:

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "My-Cool-Application");
authFactory.Token = (String) Session["token"];
CalendarService service = new CalendarService(authFactory.ApplicationName);
service.RequestFactory = authFactory;

এখানে আপনি প্রমাণীকরণের জন্য AuthSub ব্যবহার করে Google ক্যালেন্ডার API এর সাথে ইন্টারঅ্যাক্ট করার জন্য একটি CalendarService অবজেক্ট সেট আপ করেন৷ মনে রাখবেন GAuthSubRequestFactory এর কনস্ট্রাক্টরে ব্যবহৃত "cl" হল ক্যালেন্ডারের পরিষেবার নাম৷ অন্যান্য পরিষেবার নামগুলির জন্য আপনি Google Data APIs FAQ-এর সাথে পরামর্শ করতে পারেন৷

নিরাপদ (নিবন্ধিত) AuthSub

আপনি যদি আপনার ওয়েব অ্যাপ্লিকেশন নিবন্ধন করতে চান, তাহলে AuthSub ব্যবহার করার সময় আপনি নিরাপত্তার একটি অতিরিক্ত স্তর সক্ষম করতে পারেন৷ এটি আপনাকে আপনার কোড দ্বারা করা সমস্ত অনুরোধে ডিজিটালভাবে স্বাক্ষর করার অনুমতি দেয়, যাতে কেউ আপনার ব্যক্তিগত কী না থাকলে আপনাকে জারি করা AuthSub টোকেনগুলি ব্যবহার করতে না পারে৷ প্রথম ধাপ হল নিশ্চিত করা যে আপনি AuthSubUtil.getRequestUrl কল করার সময় সঠিক AuthSub লিঙ্ক তৈরি করছেন। আপনাকে আরও দুটি কোড পরিবর্তন করতে হবে:

String token = Request.QueryString["token"];
Session["token"] = AuthSubUtil.exchangeForSessionToken(token, rsaKey).ToString();

...

authFactory.PrivateKey = rsaKey;

প্রথমে, null এর পরিবর্তে লক্ষ্য করুন, আপনি এখন "rsaKey" পরিবর্তনশীলটিকে exchangeForSessionToken পদ্ধতিতে পাস করুন। এই একই ভেরিয়েবলটি পরিষেবাতে সংযোগ স্থাপন করার সময় আমাদের GAuthSubRequestFactory এর একটি বৈশিষ্ট্য সেট করতেও ব্যবহৃত হয়। "rsaKey" ভেরিয়েবল হল একটি RSACryptoServiceProvider যা x509 সার্টিফিকেটের প্রাইভেট কী কম্পোনেন্টের সাথে সম্পর্কিত যা আপনি Google-এর সাথে নিবন্ধন করেছেন।

একটি RSA ব্যক্তিগত কী এবং স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করা একটু বিভ্রান্তিকর হতে পারে, বিশেষ করে যেহেতু .NET ফ্রেমওয়ার্ক PEM ফর্ম্যাটে সংরক্ষিত কী বা শংসাপত্রগুলি বুঝতে পারে না৷ নিম্নলিখিত কমান্ডগুলি দেখায় কিভাবে টুলগুলির OpenSSL স্যুট ব্যবহার করে একটি ব্যক্তিগত কী এবং সর্বজনীন শংসাপত্র তৈরি করতে হয়:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \
  '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \
  test_key.pem -out test_cert.pem

openssl pkcs12 -export -in test_cert.pem -inkey test_key.pem \
  -out test_cert.pfx -name "Testing Certificate"

প্রথম ধাপটি যথাক্রমে "test_key.pem" এবং "test_cert.pem" নামে PEM ফর্ম্যাটে একটি ব্যক্তিগত কী এবং একটি সর্বজনীন X509 শংসাপত্র তৈরি করে৷ মনে রাখবেন শংসাপত্রটি Mountain View, CA, US-এ অবস্থিত "www.example.com"-এ নিবন্ধিত হতে সেট করা হয়েছে৷ এখানে আপনার কোম্পানির জন্য সঠিক মান প্রতিস্থাপন করুন. "test_cert.pem" ফাইলটিতে আপনাকে AuthSub রেজিস্ট্রেশন পৃষ্ঠায় জমা দেওয়ার জন্য প্রয়োজনীয় তথ্য রয়েছে।

দ্বিতীয় ধাপটি আপনার ব্যক্তিগত কী এবং শংসাপত্র থেকে একটি PFX ফাইল তৈরি করে। এই ফাইলটি .NET ক্লায়েন্ট লাইব্রেরিতে আমদানি করা যেতে পারে GData API-তে করা অনুরোধগুলি ডিজিটালি স্বাক্ষর করতে। নিম্নলিখিত কোডটি দেখায় কিভাবে আপনি PFX ফাইল থেকে একটি ওয়েব অ্যাপ্লিকেশনে ব্যক্তিগত কী আমদানি করতে পারেন:

protected AsymmetricAlgorithm getRsaKey()
{

  X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx","");
  RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider;

  return privateKey;
}

এই স্নিপেট দ্বারা সংজ্ঞায়িত getRsaKey() ফাংশনটি API-কে প্রমাণীকরণ করার জন্য উপরে দেখানো "rsaKey" ভেরিয়েবলের জায়গায় ব্যবহার করা যেতে পারে। স্বাভাবিকভাবেই, আপনার তৈরি করা PFX ফাইলের উপযুক্ত অবস্থান দিয়ে ফাইল পাথ প্রতিস্থাপন করা উচিত।

সম্পূর্ণ কোড তালিকা

পূর্ববর্তী বিভাগে প্রদর্শিত পদ্ধতিগুলি কীভাবে ব্যবহার করবেন তা দেখানোর সবচেয়ে সহজ উপায় হল একটি লাইভ উদাহরণ। নিম্নলিখিত নমুনা কোডটি একটি সাধারণ ASP পৃষ্ঠা যা ব্যবহারকারীকে প্রমাণীকরণ করতে AuthSub ব্যবহার করে, তারপর তাদের Google ক্যালেন্ডারের ইভেন্টগুলি প্রিন্ট করে।

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@ Import Namespace="Google.GData.Client" %>
<%@ Import Namespace="Google.GData.Extensions" %>
<%@ Import Namespace="Google.GData.Calendar" %>
<%@ Import Namespace="System.Net" %>

<script runat="server">
    void PrintCalendar() {

        GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "TesterApp");
        authFactory.Token = (String) Session["token"];
        CalendarService service = new CalendarService(authFactory.ApplicationName);
        service.RequestFactory = authFactory;

        EventQuery query = new EventQuery();

        query.Uri = new Uri("http://www.google.com/calendar/feeds/default/private/full");

        try
        {
            EventFeed calFeed = service.Query(query);
            foreach (Google.GData.Calendar.EventEntry entry in calFeed.Entries)
            {
                Response.Write("Event: " + entry.Title.Text + "<br/>");
            }
        }
        catch (GDataRequestException gdre)
        {
            HttpWebResponse response = (HttpWebResponse)gdre.Response;
            
            //bad auth token, clear session and refresh the page
            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                Session.Clear();
                Response.Redirect(Request.Url.AbsolutePath, true);
            }
            else
            {
                Response.Write("Error processing request: " + gdre.ToString());
            }
        }
    }

</script>


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Test Site</title>
</head>
<body>

    <form id="form1" runat="server">
    <h1>AuthSub Sample Page</h1>
    <div>
    <%
        GotoAuthSubLink.Visible = false;
        
        if (Session["token"] != null)
        {
            PrintCalendar();
        }
        else if (Request.QueryString["token"] != null)
        {
            String token = Request.QueryString["token"];
            Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString();
            Response.Redirect(Request.Url.AbsolutePath, true);
        }
        else //no auth data, print link
        {
            GotoAuthSubLink.Text = "Login to your Google Account";
            GotoAuthSubLink.Visible = true;
            GotoAuthSubLink.NavigateUrl = AuthSubUtil.getRequestUrl(Request.Url.ToString(),
                "http://www.google.com/calendar/feeds/",false,true);
        }
        
     %>
    <asp:HyperLink ID="GotoAuthSubLink" runat="server"/>

    </div>
    </form>
</body>
</html>

উপসংহার

AuthSub আপনার ওয়েব অ্যাপ্লিকেশনকে ব্যবহারকারীর Google অ্যাকাউন্টে সংরক্ষিত ডেটা নিরাপদ এবং নিয়ন্ত্রিত উপায়ে অ্যাক্সেস করার অনুমতি দেয়। .NET ক্লায়েন্ট লাইব্রেরি ব্যবহার করে Google পরিষেবাগুলির সাথে আপনার ASP-ভিত্তিক ওয়েবসাইটকে একীভূত করা সহজ করে তোলে৷ এই নিবন্ধটি আপনাকে শুরু করার জন্য, তবে অতিরিক্ত সংস্থান রয়েছে যেগুলির সাথে পরামর্শ করার জন্য আপনাকে উত্সাহিত করা হচ্ছে: