अगस्त 2007
- परिचय: AuthSub क्यों ज़रूरी है?
- पुष्टि करने की प्रोसेस को मैनेज करना
- Secure (Registered) AuthSub
- कोड की पूरी लिस्टिंग
- निष्कर्ष
परिचय: AuthSub क्यों ज़रूरी है?
Google Data APIs ("GData" for short) की सबसे अच्छी बात यह है कि इनकी मदद से डेवलपर, Google की सेवाओं से इंटरैक्ट करने वाले ऐप्लिकेशन बना सकते हैं. खास तौर पर, ये आपको अपने ऐप्लिकेशन में इस्तेमाल करने के लिए, उपयोगकर्ता के निजी डेटा को ऐक्सेस करने की अनुमति देते हैं. इन एपीआई की मदद से, ऐप्लिकेशन लिखे जा सकते हैं. इनकी मदद से, डेटा को सिंक किया जा सकता है, इंपोर्ट किया जा सकता है, एक्सपोर्ट किया जा सकता है, और मैनेज किया जा सकता है. एपीआई की मदद से आपको ये बेहतरीन सुविधाएं मिलती हैं. हालांकि, आपको इनका इस्तेमाल ज़िम्मेदारी के साथ करना होगा. उपयोगकर्ता का डेटा निजी जानकारी होती है. इसलिए, आपको इसे सुरक्षित तरीके से ऐक्सेस करना चाहिए. इसका मुख्य हिस्सा यह है कि Google के सर्वर पर सुरक्षित तरीके से पुष्टि की जा सके.
मान लें कि आपके पास एक नया वेब ऐप्लिकेशन है. आपको इसे Google की वेब सेवाओं में सेव किए गए डेटा से लिंक करना है. अब आपको इस निजी डेटा को ऐक्सेस करने के लिए, पुष्टि करनी होगी. ClientLogin जैसे किसी आसान तरीके का इस्तेमाल क्यों नहीं किया जाता? ठीक है, इससे काम हो जाएगा. हालांकि, अब आपको ज़्यादा निजी डेटा मैनेज करना होगा: उपयोगकर्ता के लॉगिन क्रेडेंशियल. ClientLogin के लिए, आपके ऐप्लिकेशन को उपयोगकर्ता से उसके Google खाते का उपयोगकर्ता नाम और पासवर्ड पूछना होगा. यह डेस्कटॉप ऐप्लिकेशन के लिए ठीक है, जो उपयोगकर्ता के निजी कंप्यूटर पर चल रहा है. हालांकि, यह वेब पर आधारित ऐप्लिकेशन के लिए सही नहीं है. इन क्रेडेंशियल को अपने सर्वर पर मैनेज करने की ज़िम्मेदारी के अलावा, शायद आपके कुछ ज़्यादा सावधान उपयोगकर्ता इस बात से डरेंगे कि आप उनकी जानकारी सेव कर सकते हैं. उपयोगकर्ताओं की एक और आम समस्या यह है कि अगर उन्हें किसी प्रोग्राम को सिर्फ़ एक सेवा (जैसे, उनके Google Calendar पर मौजूद इवेंट) का ऐक्सेस देना हो, लेकिन किसी दूसरी सेवा (जैसे, उनके Google Documents) का ऐक्सेस न देना हो, तो वे क्या करें. AuthSub इन दोनों समस्याओं को हल करता है. इसकी मदद से, उपयोगकर्ता Google के सर्वर के ज़रिए पुष्टि कर सकता है. साथ ही, आपका प्रोग्राम सिर्फ़ उस ऐक्सेस का अनुरोध कर सकता है जिसकी उसे ज़रूरत है.
आपने AuthSub के बारे में काफ़ी कुछ पढ़ लिया है. अब कोडिंग करने का समय आ गया है! इस लेख में, मैंने हर चीज़ को आसान रखने के लिए, सभी काम एक ही एएसपी पेज में किए हैं. हालाँकि, यहाँ दिखाई गई तकनीकों को अपने ऐप्लिकेशन में आसानी से इंटिग्रेट किया जा सकता है.
पुष्टि करने की प्रोसेस को मैनेज करना
इसलिए, अपने वेब ऐप्लिकेशन में AuthSub का इस्तेमाल करने के लिए क्या ज़रूरी है? सबसे पहले, GData क्लाइंट लाइब्रेरी से कुछ स्टैंडर्ड इंपोर्ट किए जाते हैं:
<%@ Import Namespace="Google.GData.Client" %> <%@ Import Namespace="Google.GData.Extensions" %> <%@ Import Namespace="System.Net" %>
अब आपको सबसे पहले, उपयोगकर्ता को खास तौर पर बनाए गए यूआरएल पर भेजना होगा. इससे Google के सर्वर को पुष्टि करने की प्रोसेस को मैनेज करने और उपयोगकर्ता को वापस आपकी वेबसाइट पर रीडायरेक्ट करने की अनुमति मिलती है. अच्छी बात यह है कि आपको इस यूआरएल को मैन्युअल तरीके से जनरेट करने की ज़रूरत नहीं है. इसके लिए, कई तरीके उपलब्ध हैं. आइए एक उदाहरण देखें:
authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
- target यह एक स्ट्रिंग है. इसमें आपके वेब ऐप्लिकेशन का यूआरएल होता है. पुष्टि करने के बाद, उपयोगकर्ता को यहां रीडायरेक्ट किया जाएगा.
- स्कोप यह स्ट्रिंग इस बात से तय होती है कि कौनसा एपीआई इस्तेमाल किया जा रहा है. यह GData API में मौजूद किसी एक फ़ीड से मेल खाता है. उदाहरण के लिए, किसी उपयोगकर्ता के कैलेंडर की पूरी जानकारी देने वाला फ़ीड "http://www.google.com/calendar/feeds/default/private/full" है.
- secure यह एक बूलियन है. इससे सर्वर को पता चलता है कि आपने Google के साथ रजिस्टर किया है और सर्वर को भेजे जाने वाले अनुरोधों पर क्रिप्टोग्राफ़िक हस्ताक्षर किए जाएंगे. यह तर्क आम तौर पर डिफ़ॉल्ट रूप से गलत होता है. खास तौर पर, टेस्ट एनवायरमेंट में काम करते समय.
- session यह एक और बूलियन है. इससे पता चलता है कि आपको "एक बार इस्तेमाल किया जा सकने वाला टोकन" के बजाय "सेशन टोकन" चाहिए. इस तर्क की भूमिका के बारे में आपको कुछ ही देर में पता चल जाएगा.
उपयोगकर्ता के जनरेट किए गए यूआरएल पर क्लिक करने के बाद, उसे Google खातों के पेज पर ले जाया जाएगा. इस पेज पर, वह अपने Google खाते में साइन इन कर पाएगा. इसके बाद, उन्हें "target" वैरिएबल में बताए गए वेब पेज पर वापस रीडायरेक्ट कर दिया जाएगा. हालांकि, इसमें क्वेरी पैरामीटर "token" शामिल होगा. इसमें एक बार इस्तेमाल किया जा सकने वाला टोकन होता है. आम तौर पर, इस टोकन का इस्तेमाल सिर्फ़ एक बार किया जा सकता है. इसका मतलब है कि इसका इस्तेमाल किसी फ़ीड पर एक कार्रवाई करने के लिए किया जा सकता है. हालांकि, अगर आपने "session" पैरामीटर को true के तौर पर सेट किया है, तो इसे "session token" के लिए बदला जा सकता है. इस टोकन का इस्तेमाल तब तक किया जा सकता है, जब तक उपयोगकर्ता सेशन खत्म नहीं कर देता. इसके लिए, यह तरीका अपनाएं:
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;
यहां CalendarService ऑब्जेक्ट सेट अप किया जाता है, ताकि पुष्टि करने के लिए AuthSub का इस्तेमाल करके Google Calendar API से इंटरैक्ट किया जा सके. ध्यान दें कि GAuthSubRequestFactory
के कंस्ट्रक्टर में इस्तेमाल किया गया "cl", Calendar के लिए सेवा का नाम है. अन्य सेवाओं के नाम जानने के लिए, Google Data API के बारे में अक्सर पूछे जाने वाले सवाल पढ़ें.
सुरक्षित (रजिस्टर किया गया) AuthSub
अगर आपने अपने वेब ऐप्लिकेशन को रजिस्टर करने का विकल्प चुना है, तो AuthSub का इस्तेमाल करते समय सुरक्षा के एक और लेवल को चालू किया जा सकता है. इससे आपको अपने कोड से किए गए सभी अनुरोधों पर डिजिटल हस्ताक्षर करने की अनुमति मिलती है. इससे कोई भी व्यक्ति, आपको जारी किए गए AuthSub टोकन का इस्तेमाल तब तक नहीं कर सकता, जब तक उसके पास आपकी निजी कुंजी न हो. पहला चरण यह पक्का करना है कि AuthSubUtil.getRequestUrl
को कॉल करते समय, सही AuthSub लिंक जनरेट किया जा रहा हो. इसके लिए, "secure" आर्ग्युमेंट को true पर सेट करें. आपको कोड में दो और बदलाव करने होंगे:
String token = Request.QueryString["token"]; Session["token"] = AuthSubUtil.exchangeForSessionToken(token, rsaKey).ToString(); ... authFactory.PrivateKey = rsaKey;
सबसे पहले, ध्यान दें कि अब null
के बजाय, exchangeForSessionToken
तरीके में "rsaKey" वैरिएबल पास किया जाता है. इस वैरिएबल का इस्तेमाल, सेवा से कनेक्शन सेट अप करते समय हमारी GAuthSubRequestFactory
की प्रॉपर्टी को सेट करने के लिए भी किया जाता है. "rsaKey" वैरिएबल, x509 सर्टिफ़िकेट के निजी कुंजी कॉम्पोनेंट से मेल खाने वाला RSACryptoServiceProvider
है. आपने इस सर्टिफ़िकेट को 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"
पहले चरण में, PEM फ़ॉर्मैट में एक निजी कुंजी और एक सार्वजनिक X509 सर्टिफ़िकेट जनरेट होता है. इन्हें क्रमशः "test_key.pem" और "test_cert.pem" कहा जाता है. ध्यान दें कि सर्टिफ़िकेट को अमेरिका के माउंटेन व्यू, कैलिफ़ोर्निया में मौजूद "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()
फ़ंक्शन का इस्तेमाल, एपीआई से पुष्टि करने के लिए ऊपर दिखाए गए "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 की सेवाओं के साथ आसानी से इंटिग्रेट किया जा सकता है. इस लेख में, आपको शुरुआत करने के बारे में बताया गया है. हालांकि, यहां कुछ और संसाधन दिए गए हैं. हमारा सुझाव है कि आप इन्हें भी पढ़ें: