5

यह पोस्ट How to make 'access_type=offline'/server-only OAuth2 operations on GAE/Python पर एक फ़ॉलोअप है। http = credentials.authorize(httplib2.Http()) हिस्सा नहीं रह गया है जब परीक्षण में विफल रहता है, लेकिन यह यह अभी भी करता है GAE के क्रॉन, जहां यह रीफ्रेश नहीं कर सकती है द्वारा जब चलाने लगता है मेरी access_token:कैसे बचें 'एक्सेस टोकन पुनर्प्राप्त करने में विफल: {"त्रुटि": "अवैध_ग्रेंट"}' ऑफलाइन जीएई क्रॉन कार्यों में?

  1. मैं मैन्युअल /fetch फोन करके अपना काम चला सकते हैं, 11:45 पर कहते हैं कि ।
  2. 1112 पर तत्काल /cronfetch नौकरी का समय निर्धारण, access_token समस्या के बिना।
  3. लेकिन फिर भी, मैं देख आज सुबह उठा कि ही/cronfetch कार्य (समय है, जो मेरी गैर-परीक्षण दैनिक कार्य के लिए 01:00 पर है वही) विफल:

    I 2013-06-10 05:53:51.324 make: Got type <class 'google.appengine.api.datastore_types.Blob'> 
    I 2013-06-10 05:53:51.325 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 05:53:51.327 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus 
    I 2013-06-10 05:53:51.397 Refreshing due to a 401 
    I 2013-06-10 05:53:51.420 make: Got type <class 'google.appengine.api.datastore_types.Blob'> 
    I 2013-06-10 05:53:51.421 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 05:53:51.421 Refreshing access_token 
    I 2013-06-10 05:53:51.458 Failed to retrieve access token: { "error" : "invalid_grant" } 
    I 2013-06-10 05:53:51.468 make: Got type <class 'google.appengine.api.datastore_types.Blob'> 
    I 2013-06-10 05:53:51.468 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 05:53:51.471 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 05:53:51.471 get: Got type <class 'oauth2client.appengine.CredentialsModel'> 
    E 2013-06-10 05:53:51.480 invalid_grant Traceback (most recent call last): File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in 
    

यह Getting "invalid_grant" error on token refresh मेलिंग सूची संदेश (+ SO post 1, SO post 2, SO post 3) मेरी समस्या के समान दिखता है, लेकिन ऐसा लगता है कि यह access_type=online टोकन के साथ हो रहा है। मेरे मामले में मैं केवल डिफ़ॉल्ट access_type=offline का उपयोग करता हूं, और मुझे दिखाई देता है "जब मैं एप्लिकेशन का उपयोग नहीं कर रहा हूं तो इन परिचालनों को निष्पादित करें" प्रारंभिक पहुंच अनुरोध में उल्लेख करें।

मैंने आपके लिए गिटहब के लिए प्रतिबद्ध डीबग प्रिंट स्टेटमेंट्स के साथ 08:25 पर एक क्रॉन रन (मैन्युअल लॉन्च न करने की देखभाल करना) को फिर से निर्धारित किया है। यहां मुझे जो मिलता है, वह समान है लेकिन समान नहीं है (ध्यान दें कि कुछ आखिरी पंक्तियां गलत तरीके से आदेशित होती हैं, मैं निश्चित रूप से create_playlist में OAuth2 सामान नहीं कर रहा हूं जब तक कि सभी स्रोत पढ़े जाएं)। तो विषम क्रम (? GAE प्रवेश विरूपण साक्ष्य) अनदेखी, ऐसा लगता है my http = credentials.authorize(Http()) call in create_playlist(self), currently at line 144 गलत है:

... 
    E 2013-06-10 08:26:12.817 http://www.onedayonemusic.com/page/2/ : found embeds ['80wWl_s-HuQ', 'kb1Nu75l1vA', 'kb1Nu75l1vA', 'RTWcNRQtkwE', 'RTWcNRQtkwE', 'ZtDXezAhes8', 'ZtDXezAhes8', 'cFGxNJhKK9c', 'cFGxNJhKK9c' 
    I 2013-06-10 08:26:14.019 make: Got type <class 'google.appengine.api.datastore_types.Blob'> 
    I 2013-06-10 08:26:14.020 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 08:26:14.022 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus 
    I 2013-06-10 08:26:14.100 Refreshing due to a 401 
    I 2013-06-10 08:26:14.105 make: Got type <class 'google.appengine.api.datastore_types.Blob'> 
    I 2013-06-10 08:26:14.106 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> 
    I 2013-06-10 08:26:14.106 Refreshing access_token 
    E 2013-06-10 08:26:18.994 Deadline exceeded while waiting for HTTP response from URL: https://accounts.google.com/o/oauth2/token Traceback (most recent call last): File "/pyt 
    E 2013-06-10 08:26:18.996 http://www.onedayonemusic.com/page/3/ : found embeds ['80wWl_s-HuQ', '6VNu2MLdE0c', '6VNu2MLdE0c', 'YwQilKbK9Mk', 'YwQilKbK9Mk', 'KYdB3rectmc', 'KYdB3 
    E 2013-06-10 08:26:18.996 crawl_videos end 
    E 2013-06-10 08:26:18.996 create_playlist start 
    E 2013-06-10 08:26:18.996 create_playlist got creds 
    E 2013-06-10 08:26:18.996 create_playlist authorized creds 

→ क्यों एक मैनुअल चलाने के बाद क्रॉन जॉब काम 5min, लेकिन बाद में विफल रहता है 6hours करता है? मैंने सोचा कि रीफ्रेश टोकन कभी समाप्त नहीं हुआ है। मैं क्या गलत कर रहा हूं?

नोट बिल्कुल मेरी पहली GAE काम करते हैं, और मेरी दूसरी अजगर कार्यक्रम है कि, सामान्य कोड की समीक्षा/सलाह बहुत स्वागत है, लेकिन कृपया कोमल :) हो

कोड GitHub चालू है और मेरे उदाहरण dailygrooves.org पर पहुंचा जा सकता है । आपकी सहायताके लिए धन्यवाद!

उत्तर

3

एक invalid_grant वापस लौटाया जाता है जब रीफ्रेश टोकन का उपयोग वर्तमान उपयोगकर्ता से नया एक्सेस टोकन प्राप्त करने के लिए नहीं किया जा सकता है। यह आप के लिए

>>> credentials.refresh_token is None 
True 

रूप नोट में उल्लेख किया How to make 'access_type=offline'/server-only OAuth2 operations on GAE/Python? में हो रहा है, क्योंकि संग्रहीत Credentials वस्तु एक अशक्त ताज़ा टोकन है यानी,: एक उपयोगकर्ता पहले से ही अपने ग्राहक आईडी अधिकृत किया है

हैं, बाद में आप इन उपयोगकर्ताओं के लिए OAuth निष्पादित करते हैं, उन्हें OAuth संवाद नहीं दिखाई देगा और आपको रीफ्रेश टोकन नहीं दिया जाएगा।

आप जब बनाने अपने Credentials के रूप में सभी 3 प्रश्न में अपने आखिरी सवाल में उल्लेख किया है और साथ ही, एक वैध ताज़ा टोकन और आसान तरीका है यह करने के लिए के साथ जमा हो जाती है आप के लिए approval_prompt=force उपयोग करने के लिए है जुड़ा हुआ सुनिश्चित करने की आवश्यकता आपके OAuth2WebServerFlow या OAuth2Decorator ऑब्जेक्ट (जो भी आप उपयोग कर रहे हैं)।

+0

ठीक है, मैंने सोचा कि मुझे इसकी आवश्यकता नहीं है, क्योंकि मेरे क्रॉन कार्य ने एक बार काम किया था! मैन्युअल कार्य के कुछ ही मिनट बाद एक ही क्रॉन कार्य कैसे काम कर सकता है, लेकिन 6 घंटे बाद विफल हो सकता है? और दूसरा प्रश्न: चूंकि मैं 'OAuth2DecoratorFromClientSecrets' का उपयोग कर रहा हूं, जो अतिरिक्त '** kwargs' को' OAuth2Decorator 'पर अग्रेषित नहीं करता है, तो आप मेरी अतिरिक्त' approval_prompt = force' पैरामीटर को सेट करने की अनुशंसा कैसे करते हैं? क्या इसे init समय पर किया जाना है, या यह ठीक है अगर मैं अपना 'सजावट = OAuth2DecoratorFromClientScretss ...' बना देता हूं और 'decorator.params.update ({approval_prompt = 'force'}) 'बाद में करता हूं? धन्यवाद। –

+1

क्रॉन कार्य तब काम करेगा जब 'credentials.access_token' मान्य है, लेकिन एक्सेस टोकन 1 घंटे के बाद समाप्त हो जाएगा। इसकी समाप्ति के बाद, एक नया एक्सेस टोकन प्राप्त करने के लिए 'credentials.refresh_token' की आवश्यकता होती है। आप 'decorator.params.update ({'approval_prompt': 'force'} चाहते हैं) 'लेकिन कन्स्ट्रक्टर को पास न करने का कोई अच्छा कारण नहीं है। – bossylobster

+0

ठीक है, धन्यवाद 1 घंटा सीमा के बारे में नहीं, धन्यवाद। * * कन्स्ट्रक्टर को पास करने के लिए कोई अच्छा कारण नहीं है "*, मैं भी चाहूंगा! लेकिन 'OAuth2DecoratorFromClientSecrets' अतिरिक्त '** kwargs' का सम्मान/अग्रेषित नहीं करता है (यही वह स्रोत है जो मैं स्रोत से समझता हूं और अगर मैं कोशिश करता हूं तो अपवाद फेंकता है), इस प्रकार मेरा प्रश्न। क्या मैं कुछ भूल रहा हूँ? –

संबंधित मुद्दे