.NET क्लाइंट लाइब्रेरी के साथ AuthSub का इस्तेमाल करना

जेफ़ फ़िशर, Google डेटा एपीआई टीम
अगस्त 2007

परिचय: AuthSub ज़रूरी क्यों है?

Google डेटा एपीआई (कम शब्दों में "GData") के बारे में सबसे अच्छी बात यह है कि वे डेवलपर को ऐसे ऐप्लिकेशन बनाने की अनुमति देते हैं जो Google की सेवाओं से इंटरैक्ट करते हैं. खास तौर पर, इनकी मदद से अपने ऐप्लिकेशन में इस्तेमाल करने के लिए उपयोगकर्ता का निजी डेटा ऐक्सेस किया जा सकता है. API आपको डेटा समन्वयित, आयात, निर्यात और प्रबंधित करने के लिए उसे लिखने की सुविधा देते हैं. एपीआई आपको ये बेहतरीन क्षमताएं देते हैं. हालांकि, आपको याद रखना होगा कि आप इनका इस्तेमाल ज़िम्मेदारी से करें. उपयोगकर्ता का डेटा एक निजी जानकारी होती है. इसलिए, आपको इसे सुरक्षित तरीके से ऐक्सेस करना होगा. इसका एक अहम हिस्सा है सुरक्षित तरीके से Google के सर्वर की पुष्टि करना.

मान लें कि आपके पास एक बहुत बढ़िया नया वेब ऐप्स है जिसे आप Google वेब सेवाओं में संगृहीत डेटा से संबद्ध करना चाहते हैं. इस निजी डेटा को ऐक्सेस करने के लिए, अब आपको पुष्टि करनी है. आसान क्यों नहीं है, जैसे कि ClientLogin? ऐसा करने से काम हो जाएगा, लेकिन फिर भी आप ज़्यादा निजी डेटा प्रबंधित करेंगे: उपयोगकर्ता के लॉगिन क्रेडेंशियल. ClientLogin के लिए आपके ऐप्लिकेशन को उपयोगकर्ता का Google उपयोगकर्ता नाम और पासवर्ड मांगने की ज़रूरत है. यह डेस्कटॉप ऐप्लिकेशन पर ठीक है, जो उपयोगकर्ता की निजी मशीन पर चल रहा है. हालांकि, यह वेब-आधारित ऐप्लिकेशन के लिए सही से कम है. अपने सर्वर पर इन क्रेडेंशियल को मैनेज करने की ज़िम्मेदारी देने के अलावा, हो सकता है कि आपके कुछ ज़्यादा सावधान उपयोगकर्ताओं में यह डर हो कि आप उनकी जानकारी सेव कर सकते हैं. उपयोगकर्ताओं की एक दूसरी चिंता यह है कि वे प्रोग्राम को सिर्फ़ एक खास सेवा (जैसे कि उनके Google Calendar पर इवेंट) को ऐक्सेस देना चाहते हैं, लेकिन किसी दूसरी सेवा (जैसे कि उनके Google दस्तावेज़) को नहीं देना चाहते. AuthSub इन दोनों समस्याओं को हल करता है. इसके लिए, उपयोगकर्ता को Google के सर्वर से पुष्टि करने की सुविधा दी जाती है. साथ ही, आपके प्रोग्राम को सिर्फ़ उस ऐक्सेस का अनुरोध करने की अनुमति दी जाती है जो उसके लिए ज़रूरी है.

अब जब आपने AuthSub के पीछे के सिद्धांत के बारे में अच्छी तरह पढ़ लिया है, तो अब कुछ कोडिंग की ओर बढ़ने का समय है! इस लेख के लिए, मैंने चीज़ों को आसान रखना चुना है और सब कुछ एक ASP पेज में ही कर लिया है, लेकिन आपको यहां दिखाई गई तकनीकों को अपने ऐप्लिकेशन में आसानी से एकीकृत करने में सक्षम हो जाना चाहिए.

हैंडलिंग ऑथेंटिकेशन

आपके वेब ऐप्लिकेशन में AuthSub का उपयोग करने के लिए असल में क्या चाहिए? सबसे पहले, GData क्लाइंट लाइब्रेरी से कुछ स्टैंडर्ड इंपोर्ट होते हैं:

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

अब आपको सबसे पहले उपयोगकर्ता को विशेष रूप से तैयार किए गए URL पर भेजना होगा. इस तरह, Google के सर्वर को पुष्टि करने की प्रोसेस और उपयोगकर्ता को आपकी वेबसाइट पर रीडायरेक्ट करने की अनुमति मिलती है. अच्छी बात यह है कि आपको यह यूआरएल मैन्युअल तरीके से जनरेट नहीं करना पड़ेगा, क्योंकि ऐसा करने के लिए तरीके उपलब्ध हैं. आइए एक उदाहरण देखें:

authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
  • target यह एक स्ट्रिंग है, जिसमें आपके वेब ऐप्लिकेशन का यूआरएल होता है. यहां आपको उपयोगकर्ता को पुष्टि करने के बाद रीडायरेक्ट किया जाएगा.
  • स्कोप यह स्ट्रिंग उस एपीआई से तय होती है जिसका इस्तेमाल किया जा रहा है. यह GData API में से किसी एक फ़ीड से मेल खाता है. उदाहरण के लिए, उपयोगकर्ता के लिए कैलेंडर की सभी जानकारी वाला फ़ीड "http://www.google.com/calendar/feeds/default/private/full" है.
  • सुरक्षित यह एक बूलियन होता है जो सर्वर को बताता है कि आपने Google के साथ रजिस्टर किया है और वह सर्वर को क्रिप्टोग्राफ़िक तरीके से आपके अनुरोध पर हस्ताक्षर करेगा. यह तर्क आम तौर पर डिफ़ॉल्ट रूप से गलत होता है, खास तौर पर किसी टेस्ट एनवायरमेंट में काम करते समय.
  • सेशन यह एक और बूलियन है जिससे यह पता चलता है कि आपको "एक बार इस्तेमाल किए जाने वाले टोकन" के बजाय "सेशन टोकन" चाहिए. इस आर्ग्युमेंट की भूमिका कुछ ही समय में और साफ़ हो जाएगी.

जनरेट किए गए यूआरएल पर उपयोगकर्ता के क्लिक करने के बाद, उसे 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 Calendar API के साथ इंटरैक्ट करने के लिए, CalendarService ऑब्जेक्ट सेट अप किया जाता है. ध्यान रखें कि GAuthSubRequestFactory के कंस्ट्रक्टर में इस्तेमाल किया गया "cl", Calendar के लिए सेवा का नाम है. सेवा के दूसरे नामों के लिए, Google Data API के बारे में अक्सर पूछे जाने वाले सवाल पढ़ें.

सुरक्षित (रजिस्टर किया गया) AuthSub

अगर आप अपना वेब ऐप्लिकेशन रजिस्टर करना चुनते हैं, तो आप AuthSub का इस्तेमाल करते समय सुरक्षा का एक और स्तर चालू कर सकते हैं. इससे आपको अपने कोड के ज़रिए किए गए सभी अनुरोधों को डिजिटल रूप से साइन करने की अनुमति मिल जाएगी. इसकी मदद से, कोई व्यक्ति आपको जारी किए गए AuthSub टोकन का इस्तेमाल तब तक नहीं कर पाएगा, जब तक उसके पास आपकी निजी कुंजी न हो. पहला चरण यह पक्का करना है कि "सुरक्षित" तर्क को सही पर सेट करके, AuthSubUtil.getRequestUrl को कॉल करते समय सही AuthSub लिंक जनरेट किया जा रहा है. कोड में दो अन्य बदलाव करने होंगे:

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

...

authFactory.PrivateKey = rsaKey;

सबसे पहले, ध्यान दें कि null के बजाय, अब exchangeForSessionToken तरीके को "rsaKey" वैरिएबल पास करें. सेवा के लिए कनेक्शन सेट अप करते समय, GAuthSubRequestFactory वैरिएबल की प्रॉपर्टी सेट करने के लिए भी इसी वैरिएबल का इस्तेमाल किया जाता है. "rsaKey" वैरिएबल, RSACryptoServiceProvider के x509 सर्टिफ़िकेट के निजी कुंजी कॉम्पोनेंट के जैसा है जिसे आपने Google के साथ रजिस्टर किया है.

आरएसए निजी कुंजी और खुद से हस्ताक्षर किया गया सर्टिफ़िकेट जनरेट करना थोड़ा मुश्किल हो सकता है. ऐसा खास तौर पर तब होता है, जब .NET फ़्रेमवर्क, पीईएम फ़ॉर्मैट में स्टोर की गई कुंजियों या सर्टिफ़िकेट को नहीं समझता. नीचे दिए गए निर्देश, टूल के 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"

पहले चरण में निजी कुंजी और सार्वजनिक X509 सर्टिफ़िकेट, PEM फ़ॉर्मैट में जनरेट किए जाते हैं. इन सर्टिफ़िकेट को "test_key.pem" और "test_cert.pem" कहा जाता है. ध्यान दें कि यह सर्टिफ़िकेट माउंटेन व्यू, सीए, अमेरिका में मौजूद "www.example.com" पर रजिस्टर करने के लिए सेट किया गया है. यहां अपनी कंपनी के लिए उचित मान डालें. "test_cert.pem" फ़ाइल में वह जानकारी है जिसे आपको AuthSub रजिस्ट्रेशन पेज पर सबमिट करना होगा.

दूसरे चरण में, आपकी निजी कुंजी और सर्टिफ़िकेट से PFX फ़ाइल जनरेट होती है. GData API में किए गए अनुरोधों को डिजिटल रूप से हस्ताक्षर करने के लिए, यह फ़ाइल .NET क्लाइंट लाइब्रेरी में आयात की जा सकती है. नीचे दिया गया कोड दिखाता है कि आप PFX फ़ाइल से निजी कुंजी को वेब ऐप्लिकेशन में कैसे इंपोर्ट कर सकते हैं:

protected AsymmetricAlgorithm getRsaKey()
{

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

  return privateKey;
}

इस स्निपेट की मदद से तय किए गए getRsaKey() फ़ंक्शन का इस्तेमाल, ऊपर दिखाए गए "rsaKey" वैरिएबल की जगह किया जा सकता है. इसका इस्तेमाल एपीआई की पुष्टि करने के लिए किया जाता है. ज़ाहिर है कि फ़ाइल पाथ को, आपकी जनरेट की गई PFX फ़ाइल की जगह से बदलना चाहिए.

पूरी कोड लिस्टिंग

पिछले सेक्शन में दिए गए तरीकों को इस्तेमाल करने का सबसे आसान तरीका, लाइव उदाहरण से दिखाना है. यह सैंपल कोड एक सामान्य एएसपी पेज है. यह उपयोगकर्ता की पुष्टि करने के लिए, AuthSub का इस्तेमाल करता है. इसके बाद, यह पेज अपने Google Calendar के इवेंट प्रिंट करता है.

<%@ 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 क्लाइंट लाइब्रेरी का इस्तेमाल करके, आप अपनी ASP-आधारित वेबसाइट को Google की सेवाओं के साथ आसानी से जोड़ सकते हैं. यह लेख सिर्फ़ शुरुआत करने के लिए है. हालांकि, हम चाहते हैं कि आप इन संसाधनों को भी लें: