2015-05-21 4 views
17

देता है मैं प्रमाणीकरण प्राप्त करने के लिए निम्न का उपयोग करता हूं कि मैं एंड्रॉइड ऐप से बैकएंड तक पहुंच सकता हूं। यह यहां https://developers.google.com/identity/protocols/CrossClientAuth वर्णित है।GoogleAuthUtil.getToken अमान्य प्रमाणीकरण कोड

StringBuffer sb = new StringBuffer(); 
sb.append("oauth2:server:client_id:"); 
sb.append(getString(R.string.google_app_id)); 
sb.append(":api_scope:"); 
sb.append("profile email"); 
final String scope = sb.toString(); 
String token = GoogleAuthUtil.getToken(Activity.this, mAuthAccount, scope); 

ऊपर रिटर्न एक अल्पकालिक प्रमाणीकरण कोड है जो कभी कभी समाप्त हो गया है (mAuthAccount पहले AccountPicker.newChooseAccountIntent का उपयोग कर स्थापित किया गया था।)। मैं इसे Google सर्वर के विरुद्ध जांचना चाहता हूं, लेकिन GoogleAuthUtil.getToken से लौटे टोकन स्ट्रिंग के साथ https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= पर कॉल करना "अमान्य टोकन" देता है।

मैं यह कैसे सत्यापित करूं कि प्रमाणीकरण कोड का उपयोग करने से पहले इसे समाप्त नहीं किया गया है?

संपादित करें: लौटाई गई स्ट्रिंग एक टोकन नहीं है, लेकिन एक प्राधिकरण कोड जिसे टोकन प्राप्त करने के लिए Google एपीआई के साथ आदान-प्रदान किया जा सकता है (लौटाई गई स्ट्रिंग "/ 4" से शुरू होती है और नहीं "/ 1" या "/ 2 " अगर मुझे ठीक से याद है)।

कोड हमेशा काम नहीं करता है (मेरे सर्वर पर) और मुझे यह जांचने में सक्षम होना चाहिए कि कोड का उपयोग किया जा सकता है या समाप्त हो गया है या नहीं।

+0

चेकआउट इस उत्तर: http://stackoverflow.com/a/24982688/1484779 – jlopez

+0

मैं { "त्रुटि" मिलती है: GoogleAuthUtil.getToken पर कॉल के बाद https://www.googleapis.com/oauth2/v1/tokeninfo से "invalid_token"} - टोकन * बस * जेनरेट किया गया था और इसके साथ टेम्पर्ड नहीं था। शायद टोकन का प्रकार गलत है? – wojciii

+0

इसके अलावा, मैंने टोकन को अमान्य करने और GoogleAuthUtil.getToken() को फिर से कॉल करने का प्रयास किया। मुझे अभी भी googleapis.com से एक अवैध टोकन जवाब मिला है। यही वह है जो मुझे समझ में नहीं आता है। मैं सोच रहा हूं कि मैं क्या गलत कर रहा हूं। – wojciii

उत्तर

0

आप Validating the token दस्तावेज में देख सकते हैं:

https://www.googleapis.com/oauth2/v1/tokeninfo

टोकन एक्सेस स्वीकार करता है और जो आवेदन इसे करने के लिए जारी किया गया था सहित कि पहुँच टोकन के बारे में जानकारी देता है, टोकन के उद्देश्य से लक्ष्य , उपयोगकर्ता द्वारा दिए गए स्कॉप्स, शेष टोकन का जीवनकाल, और उपयोगकर्ता आईडी।

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg 

TokenInfo endpoint एक JSON सारणी कि टोकन या एक त्रुटि का वर्णन के साथ जवाब देंगे:

नीचे इस तरह का अनुरोध का एक उदाहरण है।

तार पर, प्रतिक्रिया के बाद जैसा दिखता है: टोकन समाप्त हो गया

{ 
    "audience":"8819981768.apps.googleusercontent.com", 
    "user_id":"123456789", 
    "scope":"profile email", 
    "expires_in":436 
} 

हैं, के साथ छेड़छाड़ की गई है, या अनुमतियाँ को निरस्त कर दिया, Google प्राधिकरण सर्वर में कोई त्रुटि के साथ जवाब देंगे। एक 400 स्थिति कोड के रूप में त्रुटि सतहों, और एक JSON शरीर इस प्रकार है:

{"error":"invalid_token"} 

डिजाइन करके, कोई अतिरिक्त जानकारी विफलता के कारण के रूप में दिया जाता है।

तो invalid_token मान्य उत्तर जब टोकन समाप्त हो गया है, के साथ छेड़छाड़ की गई है, या अनुमतियाँ

संपादित रद्द कर दिया

यह invalid_token प्राप्त करने के लिए बस के बाद टोकन दिया जाता है संभव है GoogleAuthUtil.getToken से क्योंकि GoogleAuthUtil ने इसे कैश किया हो सकता है। इस मामले में आपको GoogleAuthUtil.invalidateToken पर कॉल करना चाहिए।

अधिक जानकारी आप यहाँ पा सकते हैं: http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

संपादित 2

मैं सिर्फ नोटिस कि आप अपने दायरे में https://www.googleapis.com/auth/plus.login याद कर रहे हैं। कृपया इसे जोड़ने का प्रयास करें क्योंकि क्रॉस-क्लाइंट पहचान का उपयोग करना अनिवार्य लगता है।

+0

मैं दायरे के हिस्से के रूप में "https://www.googleapis.com/auth/plus.login" का उपयोग कर रहा हूं। लौटा टोकन (स्ट्रिंग) हमेशा https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= के अनुसार अमान्य है। मैंने https://github.com/googledrive/crossclientoauth2-android भी पाया जो एक कामकाजी उदाहरण होना चाहिए। – wojciii

+0

मैं आपके द्वारा पोस्ट किए गए कोड में केवल 'प्रोफ़ाइल ईमेल' को 'api_scope' के रूप में देखता हूं। क्या आप अपने कोड को अंतिम संपादन के साथ अपडेट कर सकते हैं? –

2

आप app_id उपयोग करने के लिए OAuth टोकन प्राप्त करने की जरूरत नहीं है, तुम बस अपने दायरे plus.login हो सकता है

अधिक जानकारी गुंजाइश

"oauth2:" + Scopes.PLUS_LOGIN 

बदलने के लिए इस मामले में की जरूरत है:

Authorizing with Google for REST APIs

Scopes Class

+0

मुझे टोकन नहीं मिल रहा है। मुझे एक अल्पकालिक प्रमाणीकरण कोड मिल रहा है। एक ही कोड प्राप्त करना संभव कैसे दो बार हो सकता है? – wojciii

0

इस फैशन में GoogleAuthUtil.getToken() द्वारा पुनर्प्राप्त टोकन एक एक्सेस टोकन नहीं है, यह एक आईडी टोकन है।

बजाय निम्न URL का प्रयास करें (ध्यान दें access_token के बजाय id_token क्वेरी पैरामीटर):

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN> 
संबंधित मुद्दे