2013-07-23 6 views
27

आमतौर पर, Google OAuth2.0 तंत्र बहुत अच्छा काम कर रहा है।OAuth2.0 टोकन अजीब व्यवहार (अमान्य प्रमाण पत्र 401)

  1. उपयोगकर्ता चयनित स्कोप के साथ Google खाते तक पहुंचने की अनुमति की पुष्टि करता है।
  2. रीफ्रेश टोकन पुनर्प्राप्त किया गया है और लंबे समय तक भंडारण में सहेजा गया है।
  3. प्रत्येक बार आवश्यक (यदि एक्सेस टोकन समाप्त हो गया है) एक्सेस टोकन पुनर्प्राप्त किया जाता है और एपीआई तक पहुंचने के लिए उपयोग किया जाता है।

लेकिन कभी कभी (अब तक केवल दो 6 महीने से अधिक के लिए बार) मैं अजीब व्यवहार का अनुभव किया है: गूगल एपीआई के लिए

अनुरोध अमान्य साख (401) त्रुटि। एक्सेस टोकन को रीफ्रेश करना (संग्रहीत रीफ्रेश टोकन का उपयोग करके) मदद नहीं करता है।

 
    + ------------------------------------------------------------------------- + 
    | 1.TRYING TO REFRESH THE TOKEN.           | 
    | 2.DONE REFRESHING THE TOKEN.            | 
    + ------------------------------------------------------------------------- + 
    | access:   **************************************************** | 
    | refresh:     ********************************************* | 
    | expires:               3600 | 
    | created:           2013-07-23 13:12:36 | 
    + ------------------------------------------------------------------------- + 

मैं भी https://www.googleapis.com/oauth2/v1/tokeninfo

 
    + ------------------------------------------------------------------------- + 
    | 1. TRYING TO CHECK THE TOKEN .           | 
    | 2. DONE CHECKING THE TOKEN THE TOKEN.          | 
    + ------------------------------------------------------------------------- + 
    |  issued_to:     ************.apps.googleusercontent.com | 
    |  audience:     ************.apps.googleusercontent.com | 
    |   user_id:            ************ | 
    |  expires_in:              3600 | 
    |   email:          **********@gmail.com | 
    | verified_email:              1 | 
    |  access_type:             offline | 
    |   scopes::               | 
    + ------------------------------------------------------------------------- + 
    | https://www.googleapis.com/auth/userinfo.email       | 
    | https://www.googleapis.com/auth/userinfo.profile       | 
    | https://www.googleapis.com/auth/plus.me         | 
    | https://www.googleapis.com/auth/drive          | 
    + ------------------------------------------------------------------------- + 
करने के लिए अनुरोध भेजकर "फ्रेश" पहुँच टोकन को सत्यापित करने की कोशिश की है:

यहाँ कुछ संरचित उत्पादन मैं जब इस मुद्दे का परीक्षण मिल गया है है

लेकिन जब मैं ड्राइव फीड तक पहुंचने का प्रयास करता हूं तो प्रतिक्रिया है:

 
    Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials 

    domain:   global 
    reason:   authError 
    message:  Invalid Credentials 
    locationType: header 
    location:  Authorization 

हमने कैलेंडर के साथ एक ही समस्या का अनुभव किया। तो:

  1. टोकन पहले (सबकुछ काम करता था) मान्य था।
  2. ताज़ा टोकन अभी भी काम करता है।
  3. फ़ीड का अनुरोध करना "अमान्य प्रमाण-पत्र" त्रुटि के साथ प्रतिक्रिया करता है।
  4. अन्य सभी टोकन अभी भी बहुत अच्छा काम कर रहे हैं, जिसका अर्थ है कि कोड मान्य है।

आम तौर पर जब टोकन को निरस्त किया जाता है तो टोकन को रीफ्रेश करने का प्रयास करते समय "अवैध_ग्रेंट" त्रुटि लौटा दी जाती है।

प्रश्न

  1. क्या इस व्यवहार के लिए कारण हो सकता है? यदि रीफ्रेश टोकन निरस्त कर दिया गया था या किसी अन्य तरीके से अमान्य हो गया था, तो क्या नए एक्सेस टोकन के लिए अनुरोध त्रुटि उत्पन्न करनी चाहिए?
  2. ताज़ा टोकन को सत्यापित करने का कोई तरीका है?
+1

मुझे कई परिणामी अनुरोधों के बाद एक ही अजीब व्यवहार का अनुभव होता है। – ageorgios

उत्तर

16
त्रुटियों पर प्रति गूगल एपीआई डॉक्स

& त्रुटि कोड:

https://developers.google.com/drive/handle-errors#401_invalid_credentials

401: Invalid Credentials 

Invalid authorization header. The access token you're using is either expired or invalid. 

error: { 
    errors: [ 
    { 
    "domain": "global", 
    "reason": "authError", 
    "message": "Invalid Credentials", 
    "locationType": "header", 
    "location": "Authorization", 
    } 
    ], 
    "code": 401, 
    "message": "Invalid Credentials" 
    } 
} 

यह ठीक त्रुटि के अपने संस्करण से मेल खाता है, और इसलिए बहुत संभव है कि Google के विचार में है साथ कुछ गड़बड़ है आपके निवेदन।

लेकिन, जैसा कि आप अच्छी तरह से जानते हैं, Google API अनुरोध त्रुटियों को वापस कर सकते हैं जो वास्तव में समस्या का निदान करने के लिए बेहद असहनीय हैं। मुझे कई कारणों से "अवैध प्रमाण-पत्र" त्रुटियां मिली हैं। यह लगभग हमेशा सचमुच है क्योंकि मैंने कुछ प्रकार का परिवर्तन किया है जिसे मैंने सोचा था, इससे कोई फर्क नहीं पड़ता, लेकिन वास्तव में करता है।

मेरी पहली सोचा (अंधेरे यहाँ में गोली मार दी) Google API कंसोल पर जाने के लिए होगा:

https://code.google.com/apis/console

Googles प्रमाणीकरण टोकन सत्यापनकर्ता (https://www.googleapis.com/oauth2/v1/tokeninfo) एक वैध प्रतिक्रिया ग्राहक लौट सकते हैं, लेकिन शायद गुप्त या ग्राहक आईडी बदल दी जाएगी।

प्रतिक्रिया शरीर में भी छोटे बदलाव इस त्रुटि का कारण बन सकते हैं।

मुझे नहीं पता कि आप आरईएसटी कॉल या क्लाइंट लिब द्वारा अनुरोध कैसे कर रहे हैं, लेकिन मैं रूबी लिब का उपयोग करता हूं जो एपीआई कॉल करने के लिए कमांड लाइन इंटरफेस की अनुमति देता है। मुझे यह & मिला है OAuth2 Playground Google API कॉल का निदान करने में बहुत उपयोगी है।

बस एक एफवाईआई: मुझे केवल Google API से 2 त्रुटियां मिली हैं: "अमान्य प्रमाण-पत्र" और "अपर्याप्त अनुमतियां"। उत्तरार्द्ध लगभग हमेशा खराब scopes के साथ करना पड़ा है। पूर्व बस बाकी सब कुछ के बारे में है।

मैं यह भी कहूंगा कि अगर आपने केवल 6 महीनों में 2 त्रुटियों का अनुभव किया है, तो आप भाग्यशाली हैं!

+1

उत्तर के लिए धन्यवाद। त्रुटि मिलान, समस्या यह है कि ** refresh_token ** अभी भी नया ** access_tokens ** लाने की अनुमति देता है, जिसे भी सत्यापित किया जा सकता है। मेरे पास अन्य उपयोगकर्ताओं के लिए भी एक ही त्रुटि (_401 अमान्य प्रमाण-पत्र) थी, लेकिन अंतर यह है कि जब नया ** access_token ** अनुरोध किया जाता है, तो _invalid_grant_ त्रुटि जारी की गई थी। इस प्रकार यह कहना आसान था कि टोकन समाप्त हो गया है या रद्द कर दिया गया है। –

+1

जब मैं google Plus के माध्यम से लॉगिन करने का प्रयास करता हूं, तो मुझे access_token मिल गया, लेकिन उस access_token का उपयोग करते समय मैं उपयोगकर्ता की जानकारी प्राप्त करने के लिए जाता हूं, यह मुझे 401 त्रुटि देता है। यदि मेरा प्रमाण पत्र गलत है तो मैं टोकन तक पहुंच कैसे प्राप्त कर सकता हूं? अगर मेरे पास टोकन पहुंच है तो यह मुझे कोई परिणाम क्यों नहीं देता? कृपया सहायता कीजिए :( –

2

मुझे हाल ही में इस अजीब त्रुटि का अनुभव हुआ। मेरा फिक्स: मैंने उस फ़ंक्शन को रखा है जो पर हस्ताक्षर करने से पहले सभी सत्रों को अनसेट करता है AuthUrl

2

मुझे यह समस्या थी जब मैंने Google कंसोल में रीडायरेक्ट यूआरएल बदलने और सर्वर पर अपनी जेसन क्रेडेंशियल्स फ़ाइल को अपडेट करने का प्रयोग करने का प्रयास किया। मुझे फिर से शुरू करने से पहले सत्र चर को साफ़ करना पड़ा। तो अपनी परियोजना में सिर्फ इस एक बार कार्य करें:

session_start(); //starts a session 
session_unset(); //flushes out all the contents previously set 

एक बार सूखा यह होने के बाद भी session_unset() दूर करने के लिए याद रखें।

3

मैं विकास पर्यावरण पर हूं। मुझे यह समस्या भी हुई।

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

मैंने इसे एक नए ब्राउज़र इंस्टेंस पर खोलकर हल किया जो मेरे Google खाते (निजी ब्राउजिंग, जब से मैं फ़ायरफ़ॉक्स पर हूं) में लॉग इन नहीं किया गया था, एक बार फिर से मेरे Google खाते पर लॉग इन किया, और मेरे क्लाइंट का उपयोग करने की कोशिश की (जो एक वेब अनुप्रयोग है)। मुझे उम्मीद के अनुसार प्राधिकरण स्क्रीन पर रीडायरेक्ट किया गया था और उसके बाद, यह मेरे लिए ठीक काम करता था।

0

मुझे (401) Invalid Credentials प्राप्त हुआ जब मैंने विशेष ऐप के लिए अपने Google खाते तक पहुंच हटा दी। तो मुझे क्या करना था प्राधिकरण URL (वह जो https://accounts.google.com/o/oauth2/auth से शुरू होता है) का अनुरोध करना था।

0

मैं उसी समस्या में भाग गया जब मुझे अपने स्कॉप्स को केवल पढ़ने और पढ़ने के लिए सभी फ़ाइलों को बदलने की आवश्यकता थी।तो, मैं पढ़ें से मेरी फाइल के शीर्ष पर से करने के लिए अपने कार्यक्षेत्रों अद्यतन:

// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json 
var SCOPES = ['https://www.googleapis.com/auth/drive']; 

गूगल, उनके एपीआई गाइड से, इन टिप्पणियों का कहना है कि जब भी आप कार्यक्षेत्र बदलने के लिए, आप साख को अपडेट करना होगा है। मेरा मानना ​​है कि इसका मतलब है, हालांकि मैं निश्चित नहीं हूं कि टोकन को अपडेट किया जाना चाहिए। पुराना टोकन अभी भी Google द्वारा आयोजित किया गया है और यह सोचा था कि मेरे पास केवल पढ़ने के लिए पहुंच थी, इसलिए यह 401 त्रुटि क्यों लौटाएगा। इसलिए, मुझे अपना टोकन रीमेक करने की ज़रूरत है, लेकिन Google ने कभी भी एक नई सहमति स्क्रीन की पेशकश नहीं की जो मुझे अनुमति देने की अनुमति देगी और सभी फाइलों को लिखें। तो, मुझे लगता है कि स्क्रीन पाने के लिए फिर से आने के लिए की जरूरत है, तो यह एक पुरानी की जगह एक नया टोकन बनाने होगा:

fs.readFile(TOKEN_PATH, function(err, token) { 
    if (err) { 
     getNewToken(oauth2Client, callback); 
    } else { 
     getNewToken(oauth2Client, callback); 
    // oauth2Client.credentials = JSON.parse(token); 
    // callback(oauth2Client); 
    } 
    }); 

जब से मैं पहले से ही एक बचाया टोकन था, यह कभी नहीं एक नया बनाने गया था। इसलिए, मैंने पुराने टोकन के उपयोग पर टिप्पणी की और इसे एक नया टोकन प्राप्त करने के लिए कहा, इससे कोई फर्क नहीं पड़ता कि हमारे पास एक है या नहीं। फिर, मैं Google में अपने कनेक्ट किए गए ऐप्स पर गया और अपना पुराना कनेक्टिंग क्रेडेंशियल हटा दिया। मुझे यकीन नहीं है कि यह कदम आवश्यक है, लेकिन मैं केवल अपने व्यक्तिगत खाते तक पहुंचने की कोशिश कर रहा हूं। फिर, जब मैंने अपना प्रोग्राम चलाया, तो उसने मुझे पुनः प्रमाणीकरण करने के लिए प्रेरित किया, और सब कुछ काम किया और मुझे प्रमाणीकरण त्रुटि नहीं मिली। एक बार हो जाने के बाद, पहले से बने टोकन का उपयोग करने के लिए टिप्पणी की गई लाइनों को हटाना सुनिश्चित करें। मैं इन सभी के लिए Google API Quickstart.js फ़ाइल का उपयोग कर रहा था।

इसलिए, जब मैंने अपने स्कॉप्स को अपडेट किया, तो पुराना टोकन अभी भी केवल पढ़ने के दायरे का उपयोग कर रहा था, इसलिए मुझे (401) अमान्य प्रमाण-पत्र प्राप्त होंगे।

0

मैंने इस समस्या का समाधान किया जब मैंने फ़ाइलों में जेसन को हटा दिया: \ उपयोगकर्ता \ [उपयोगकर्ता] \। प्रमाण पत्र। गूगल क्रोम में

0

समाशोधन भंडारण मेरे लिए काम किया (क्या 'साफ़ भंडारण' के सभी विवरण पता नहीं है को साफ करते):

  1. F12 (Ctrl + Shift + मैं)
  2. Application टैब
  3. Clear storage
0

हो सकता है कि इस व्यवहार एक सीमा है जो गूगल describes के रूप में इस प्रकार की वजह से है:

वर्तमान में ग्राहक प्रति उपयोगकर्ता खाता प्रति 50 ताज़ा टोकन के एक सीमा होती है। यदि सीमा तक पहुंच जाती है, तो एक नया टोकन स्वचालित रूप से चेतावनी के बिना सबसे पुराने टोकन को अमान्य कर देता है। यह सीमा सेवा खातों पर लागू नहीं होती है।

टोकन की कुल संख्या पर एक बड़ी सीमा भी है जो किसी उपयोगकर्ता खाते या सेवा खाते में सभी ग्राहकों के पास हो सकती है। अधिकतर सामान्य उपयोगकर्ता इस सीमा से अधिक नहीं होंगे लेकिन डेवलपर का परीक्षण खाता हो सकता है।

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