2011-02-09 13 views
7

मुझे डेस्कटॉप ऐप में Google डेटा एपीआई के लिए उपयोगकर्ता को प्रमाणित करने का सबसे अच्छा/आसान तरीका है।Google डेटा एपीआई: डेस्कटॉप अनुप्रयोगों के लिए प्रमाणीकरण कैसे करें

मैंने docs के माध्यम से पढ़ा और ऐसा लगता है कि मेरे विकल्प क्लाइंटलॉगिन या ओथ हैं।

क्लाइंटलॉगिन के लिए, ऐसा लगता है कि मुझे लॉगिन/पासवर्ड (और संबंधित चीजों को सहेजने जैसी संबंधित चीजों आदि) के लिए यूआई लागू करना है। मुझे सच में आश्चर्य है कि वहां कुछ और समर्थन है जो कुछ डिफ़ॉल्ट लॉगिन/पासवर्ड स्क्रीन पॉप अप कर सकता है और पासवर्ड स्टोर करने के लिए ओएस कीचेन का उपयोग करता है। मुझे आश्चर्य है कि ऐसा समर्थन क्यों नहीं है? क्या यह मानक प्रक्रिया नहीं होगी? देव को उस कार्यान्वयन को छोड़कर (अच्छी तरह से, देव को उस इम्प्ले को छोड़ने की संभावना निश्चित रूप से अच्छी है), मुझे लगता है कि बहुत से लोग यहां बहुत बदसूरत समाधान के साथ आए हैं (जब वे सिर्फ एक छोटी लिपि को एक साथ जोड़ना चाहते थे)।

ओएथ बेहतर समाधान प्रतीत होता है। हालांकि, ऐसा लगता है कि कुछ कोड गायब हैं और/या मुझे लगता है कि अधिकांश कोड केवल वेब अनुप्रयोगों के लिए प्रासंगिक प्रतीत होता है। एएसपी।, मैंने प्रलेखन का पालन किया और here मिला। परिचय में पहले से ही, यह वेब अनुप्रयोग के बारे में बोलता है। फिर बाद में, मुझे एक कॉलबैक यूआरएल निर्दिष्ट करने की आवश्यकता है जो डेस्कटॉप एप्लिकेशन के लिए समझ में नहीं आता है। मुझे आश्चर्य है कि उपभोक्ता कुंजी/रहस्य मुझे क्या रखना चाहिए क्योंकि यह वास्तव में डेस्कटॉप ऐप के लिए भी समझ में नहीं आता है (esp। ओपन-सोर्स एक के लिए नहीं)। मैंने थोड़ा सा खोज किया और यह here (on SO) कहा गया था कि मुझे उपभोक्ता कुंजी/गुप्त के रूप में "अज्ञात"/"अज्ञात" का उपयोग करना चाहिए; लेकिन यह कहां कहता है कि Google दस्तावेज़ में? और उपयोगकर्ता ने प्रमाणीकृत होने के बाद टोकन कैसे प्राप्त करूं?

क्या कोई नमूना कोड है? (नहीं एक हार्डकोडेड उपयोगकर्ता नाम/पासवर्ड के साथ, लेकिन एक पुन: प्रयोज्य पूर्ण प्रमाणीकरण विधि के साथ।)

धन्यवाद, अल्बर्ट


मेरे कोड अब तक:

import gdata.gauth 
import gdata.contacts.client 

CONSUMER_KEY = 'anonymous' 
CONSUMER_SECRET = 'anonymous' 
SCOPES = [ "https://www.google.com/m8/feeds/" ] # contacts 

client = gdata.contacts.client.ContactsClient(source='Test app') 

import BaseHTTPServer 
import SocketServer 

Handler = BaseHTTPServer.BaseHTTPRequestHandler 
httpd = BaseHTTPServer.HTTPServer(("", 0), Handler) 
_,port = httpd.server_address 

oauth_callback_url = 'http://localhost:%d/get_access_token' % port 
request_token = client.GetOAuthToken(
    SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) 

loginurl = request_token.generate_authorization_url(google_apps_domain=None) 
loginurl = str(loginurl) 
import webbrowser 
webbrowser.open(loginurl) 

हालांकि, यह काम नहीं करता । मुझे यह त्रुटि मिलती है:

Sorry, you've reached a login page for a domain that isn't using Google Apps. Please check the web address and try again.

मुझे यह समझ में नहीं आता है। बेशक मैं Google Apps का उपयोग नहीं करता हूं।


आह, कि त्रुटि generate_authorization_url में google_apps_domain=None से आया है। कि दूर छोड़ दो (यानी सिर्फ loginurl = request_token.generate_authorization_url() और यह अब तक काम करता है

मेरे वर्तमान कोड:।

import gdata.gauth 
import gdata.contacts.client 

CONSUMER_KEY = 'anonymous' 
CONSUMER_SECRET = 'anonymous' 
SCOPES = [ "https://www.google.com/m8/feeds/" ] # contacts 

client = gdata.contacts.client.ContactsClient(source='Test app') 

import BaseHTTPServer 
import SocketServer 

httpd_access_token_callback = None 
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def do_GET(self): 
     if self.path.startswith("/get_access_token?"): 
      global httpd_access_token_callback 
      httpd_access_token_callback = self.path 
     self.send_response(200) 
    def log_message(self, format, *args): pass 
httpd = BaseHTTPServer.HTTPServer(("", 0), Handler) 
_,port = httpd.server_address 

oauth_callback_url = 'http://localhost:%d/get_access_token' % port 
request_token = client.GetOAuthToken(
    SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) 

loginurl = request_token.generate_authorization_url() 
loginurl = str(loginurl) 
print "opening oauth login page ..." 
import webbrowser; webbrowser.open(loginurl) 

print "waiting for redirect callback ..." 
while httpd_access_token_callback == None: 
    httpd.handle_request() 

print "done" 

request_token = gdata.gauth.AuthorizeRequestToken(request_token, httpd_access_token_callback) 

# Upgrade the token and save in the user's datastore 
access_token = client.GetAccessToken(request_token) 
client.auth_token = access_token 

कि तल पर संकेत के साथ गूगल OAuth पृष्ठ खुल जाएगा:

This website has not registered with Google to establish a secure connection for authorization requests. We recommend that you deny access unless you trust the website.

यह अभी भी काम नहीं करता है, हालांकि। जब मैं संपर्कों तक पहुंचने की कोशिश करता हूं (यानी केवल client.GetContacts()), मुझे यह त्रुटि मिलती है:

gdata.client.Unauthorized: Unauthorized - Server responded with: 401, <HTML> 
<HEAD> 
<TITLE>Token invalid - AuthSub token has wrong scope</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Token invalid - AuthSub token has wrong scope</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 

ठीक है, ऐसा लगता है कि मैंने वास्तव में गलत दायरा निर्धारित किया था। जब मैं https (यानी SCOPES = [ "http://www.google.com/m8/feeds/" ]) के बजाय http का उपयोग करता हूं, तो यह काम करता है।

लेकिन मैं वास्तव में https का उपयोग करना चाहता हूं। मुझे आश्चर्य है कि मैं यह कैसे कर सकता हूं।


इसके अलावा, इस समाधान के साथ एक और समस्या:

localhost:58630 — Google Contacts [ Revoke Access ]
localhost:58559 — Google Contacts [ Revoke Access ]
localhost:58815 — Google Contacts [ Revoke Access ]
localhost:59174 — Google Contacts [ Revoke Access ]
localhost:58514 — Google Contacts [ Revoke Access ]
localhost:58533 — Google Contacts [ Revoke Access ]
localhost:58790 — Google Contacts [ Revoke Access ]
localhost:59012 — Google Contacts [ Revoke Access ]
localhost:59191 — Google Contacts [ Revoke Access ]

मुझे आश्चर्य है कि कैसे:

अपने Google खाते में प्राधिकृत पहुंच की सूची में, मैं अब इस तरह के स्थानीय होस्ट प्रविष्टियों का एक समूह है मैं इससे बच सकता हूं कि यह ऐसी प्रविष्टियां करेगा।

जब मैं xoauth_displayname का उपयोग करता हूं, तो यह उस नाम को प्रदर्शित करता है लेकिन फिर भी कई प्रविष्टियां बनाता है (संभवतः क्योंकि यूआरएल अभी भी अधिकतर अलग है (बंदरगाह के कारण)। मैं इससे कैसे बच सकता हूं?


मेरा वर्तमान कोड अब Github पर है।


मैं भी आश्चर्य है, जब उपयोगकर्ता आवेदन शुरू होता है कहां, कैसे और कब तक मैं पहुँच टोकन और/या अनुरोध स्वीकार कर लेंगे ताकि उपयोगकर्ता हमेशा आगे हर बार पूछा और फिर से नहीं है संग्रहीत करना चाहिए।

उत्तर

2

ओएथ डेस्कटॉप ऐप्स में भी उपयोग किया जा सकता है। उपभोक्ता कुंजी और गुप्त 'अज्ञात' इस तरह के ऐप के लिए बिल्कुल उपयुक्त है।

उपयोगकर्ता स्वयं को प्रमाणित नहीं करेगा। आपको प्रदाता (Google) से टोकन प्राप्त होगा और फिर उपयोगकर्ता द्वारा एक विश्वसनीय उपभोक्ता (आपका ऐप) के लिए टोकन के रूप में अधिकृत किया जाएगा, जिसके साथ उनकी Google सेवा का उपयोग और उपयोग किया जा सकता है।

http://blog.doityourselfandroid.com/2010/11/07/google-oauth-overview/

यहाँ जावा के लिए एक उदाहरण है जो भी होना करने के लिए चरणों का वर्णन है:

https://github.com/simplegeo/python-oauth2

यहाँ कैसे OAuth काम करता है पर एक अवलोकन है:

यहाँ OAuth के लिए एक अच्छा अजगर पुस्तकालय है OAuth प्रमाणीकरण के लिए लिया गया:

http://nilvec.com/implementing-client-side-oauth-on-android/

एचटीएच।

+0

उपयोगकर्ता द्वारा प्राधिकरण: https://developers.google.com/accounts/docs/OAuth2InstalledApp https://developers.google.com/accounts/docs/OAuth2Login

टेस्ट (इस तरह मैंने किया है) पसंद? क्या मैं एक बाहरी वेबब्रोसर खोलता हूं और टोकन अधिकृत होने पर किसी भी तरह से बार-बार पुनः जांच करता हूं? उदाहरण कोड में, मैं वास्तव में नहीं देखता कि वेबब्रोसर कहाँ खोला गया है। – Albert

+0

इसके अलावा, ऐसा लगता है कि gdata lib पहले से ही OAuth के कार्यों के साथ आता है। तो मुझे लगता है कि मुझे इसके लिए एक और मुक्ति की आवश्यकता नहीं है? या पाइथन-ओथ 2 क्या करता है जो मेरे पास पहले से ही gdata के साथ है? – Albert

+0

तीन पैर वाले ओएथ इस तरह काम करते हैं: 1. आप प्रदाता (Google) 2 से टोकन और टोकन रहस्य का अनुरोध करते हैं।आप उपयोगकर्ता के लिए वेबब्रोसर खोलते हैं और उसे प्रदाता के प्रमाणीकरण URL पर ले जाते हैं जहां उपयोगकर्ता पुष्टि कर सकता है कि वे आपको एक्सेस देना चाहते हैं, और आप एक सत्यापन कोड वापस ले लेंगे। प्रदाता की साइट या तो आपको सत्यापनकर्ता प्रदान करने वाले यूआरएल के माध्यम से वापस कॉल कर सकती है, या उपयोगकर्ता को आपको सत्यापनकर्ता कोड प्रदान कर सकता है। 3. मूल टोकन और सत्यापनकर्ता के साथ आप प्रदाता से अपना अंतिम टोकन प्राप्त कर सकते हैं। – ldx