मुझे डेस्कटॉप ऐप में 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 पर है।
मैं भी आश्चर्य है, जब उपयोगकर्ता आवेदन शुरू होता है कहां, कैसे और कब तक मैं पहुँच टोकन और/या अनुरोध स्वीकार कर लेंगे ताकि उपयोगकर्ता हमेशा आगे हर बार पूछा और फिर से नहीं है संग्रहीत करना चाहिए।
उपयोगकर्ता द्वारा प्राधिकरण: https://developers.google.com/accounts/docs/OAuth2InstalledApp https://developers.google.com/accounts/docs/OAuth2Login
टेस्ट (इस तरह मैंने किया है) पसंद? क्या मैं एक बाहरी वेबब्रोसर खोलता हूं और टोकन अधिकृत होने पर किसी भी तरह से बार-बार पुनः जांच करता हूं? उदाहरण कोड में, मैं वास्तव में नहीं देखता कि वेबब्रोसर कहाँ खोला गया है। – Albert
इसके अलावा, ऐसा लगता है कि gdata lib पहले से ही OAuth के कार्यों के साथ आता है। तो मुझे लगता है कि मुझे इसके लिए एक और मुक्ति की आवश्यकता नहीं है? या पाइथन-ओथ 2 क्या करता है जो मेरे पास पहले से ही gdata के साथ है? – Albert
तीन पैर वाले ओएथ इस तरह काम करते हैं: 1. आप प्रदाता (Google) 2 से टोकन और टोकन रहस्य का अनुरोध करते हैं।आप उपयोगकर्ता के लिए वेबब्रोसर खोलते हैं और उसे प्रदाता के प्रमाणीकरण URL पर ले जाते हैं जहां उपयोगकर्ता पुष्टि कर सकता है कि वे आपको एक्सेस देना चाहते हैं, और आप एक सत्यापन कोड वापस ले लेंगे। प्रदाता की साइट या तो आपको सत्यापनकर्ता प्रदान करने वाले यूआरएल के माध्यम से वापस कॉल कर सकती है, या उपयोगकर्ता को आपको सत्यापनकर्ता कोड प्रदान कर सकता है। 3. मूल टोकन और सत्यापनकर्ता के साथ आप प्रदाता से अपना अंतिम टोकन प्राप्त कर सकते हैं। – ldx