6

मेरा लक्ष्य किसी प्रकार का दीर्घकालिक पहुंच टोकन होना है ताकि मेरा एंड्रॉइड ऐप बिना किसी आवश्यकता के उपयोगकर्ता के Google कैलेंडर की घटनाओं को पढ़ सके हर बार उपयोगकर्ता अनुमोदन।Google OAuth2 - एक्सेस टोकन और रीफ्रेश टोकन -> अमान्य_ग्रेंट/कोड पहले से ही रिडीम किया गया है

मैं उत्पन्न करने में सक्षम हूं - मुझे क्या लगता है - एक बार प्राधिकरण कोड; हालांकि, जब मैं अपने सर्वर साइड को यह भेजने के लिए, एप्लिकेशन इंजन, मैं निम्नलिखित त्रुटि प्रतिक्रिया मिल:

400 OK { "error" : "invalid_grant", "error_description" : "Code was already redeemed." }

अपवाद है कि फेंक दिया जा रहा है यही कारण है कि। मैं बस इसे पकड़ रहा हूं और इसे डिबगिंग के तरीके के रूप में वापस भेज रहा हूं।

मुझे एक बार का कोड 4/VUr से शुरू होता है, इसलिए मुझे लगता है कि यह एक बार कोड है और नियमित एक्सेस टोकन नहीं है।

वर्तमान में, एंड्रॉइड पर, मैं उपयोगकर्ता को Google+ का उपयोग करके साइन इन करने की अनुमति देता हूं ताकि मेरा ईमेल पता हो। वहां से मैं निम्नलिखित कोड के साथ एक एक बार प्राधिकरण कोड अनुरोध करते हैं:

try { 
    Bundle appActivities = new Bundle(); 
    appActivities.putString(GoogleAuthUtil.KEY_REQUEST_VISIBLE_ACTIVITIES, "http://schemas.google.com/AddActivity"); 
    String scopes = "oauth2:server:client_id:" + Constants.SERVER_CLIENT_ID + ":api_scope:https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/calendar"; 
    //Plus.SCOPE_PLUS_LOGIN + " " + CalendarScopes.CALENDAR_READONLY; 
    String acctName = "myGmail"; 
    String token = GoogleAuthUtil.getToken(getApplicationContext(), acctName, scopes, appActivities); 

} catch (UserRecoverableAuthException e) { 
     startActivityForResult(e.getIntent(), 257/*REQUEST_AUTHORIZATION/*/); 
} catch (Exception e) { 
     e.printStackTrace(); 
} 

इस कोड here से है और ऐसा लगता है कि यह मैं क्या कर करना चाहिए।

मैं फिर यह कोड अपने ऐप इंजन एंडपॉइंट पर भेजता हूं। मैं एक्सेस का अनुरोध करने और टोकन रीफ्रेश करने के लिए here से कोड का उपयोग करता हूं।

निम्नलिखित कोड है कि मैं एक साधारण परीक्षण के रूप में उपयोग करते हैं:

HttpTransport transport = new NetHttpTransport(); 
JsonFactory jsonFactory = new JacksonFactory(); 
//ArrayList<String> scopes = new ArrayList<>(); 
//scopes.add("https://www.googleapis.com/auth/plus.login"); 
//scopes.add("https://www.googleapis.com/auth/calendar"); 

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, 
        SERVER_CLIENT_ID, SERVER_CLIENT_SECRET, code, "postmessage")/*.setScopes(scopes)*/.execute(); 

      //urn:ietf:wg:oauth:2.0:oob 
      //postmessage 
code = tokenResponse.getRefreshToken(); 

यह सही विफल हो रहा है जब मैं का दृष्टांत GoogleAuthorizationCodeTokenRequest

कुछ मैंने देखा है नाम https://developers.google.com/accounts/docs/CrossClientAuth#offlineAccess
Google-api-php Refresh Token returns invalid_grant
getting Google oauth authorization token from Android- return with invalid_scope/ Unknown error

पुनर्निर्देशन यूरी सेट करना अलग काम नहीं किया। मैंने अपने ऐप इंजन प्रोजेक्ट के लिए सहमति स्क्रीन भर दी। दोनों स्थापित एंड्रॉइड क्लाइंट आईडी और वेब एप्लिकेशन क्लाइंट आईडी एक ही प्रोजेक्ट में हैं। मेरे ऐप के लिए xxxxxxxx.appspot.com पर सेट किए गए वेब एप्लिकेशन के लिए मेरे पास रीडायरेक्ट यूरी है।

अपने मुख्य अनुप्रयोग के लिए Gradle:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    // compile 'com.google.api-client:google-api-client:1.18.0-rc' 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'org.altbeacon:android-beacon-library:2.1.3' 
    compile 'com.google.apis:google-api-services-calendar:v3-rev118-1.19.1' 
    compile 'com.google.api-client:google-api-client-android:1.18.0-rc' 
    compile 'com.google.android.gms:play-services:6.5.87' 
    compile 'com.google.http-client:google-http-client-jackson:1.19.0' 
    compile project(path: ':beaconBackend', configuration: 'android-endpoints') 
} 

Gradle मेरी बैकएंड के लिए:

dependencies { 
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.14' 
    compile 'com.google.appengine:appengine-endpoints:1.9.14' 
    compile 'com.google.appengine:appengine-endpoints-deps:1.9.14' 
    compile 'javax.servlet:servlet-api:2.5' 
} 

किसी भी मदद वास्तव में सराहना की होगी! धन्यवाद!

साथ ही, ध्यान दें कि मैंने वर्तमान एक्सेस टोकन को अमान्य/निरस्त करने का प्रयास किया है (या एक बार कोड?)।

मुझे पहली बार उपयोगकर्ता इंटरैक्शन के बिना किसी प्रकार की लंबी जीवित पहुंच टोकन रखने का एक तरीका चाहिए।

+0

"कोड पहले से ही रिडीम किया गया था।" त्रुटि तब फेंक दी जाती है जब आप किसी प्राधिकरण कोड का उपयोग करने का प्रयास कर रहे हैं जिसका पहले से उपयोग किया जा चुका है। दिए गए प्राधिकरण कोड का उपयोग केवल एक बार किया जा सकता है। अपने दूसरे प्रश्नों के बारे में, यदि आप नहीं चाहते हैं कि उपयोगकर्ता आपके ऐप को अधिकृत करने के बाद सहमति स्क्रीन से संकेत दिया जाए तो ऑफ़लाइन एक्सेस https://developers.google.com/accounts/docs/OAuth2WebServer#offline – SGC

+0

पर जाएं आपकी टिप्पणी और लिंक, एसजीसी के लिए धन्यवाद। मैं प्राधिकरण कोड का उपयोग करके ऑफलाइन पहुंच प्राप्त करने का प्रयास कर रहा हूं ताकि मैं रीफ्रेश और टोकन एक्सेस कर सकूं। शायद मेरी समस्या यह है कि मैं वर्तमान प्राधिकरण कोड को सही तरीके से अमान्य नहीं कर रहा हूं। ऐसा लगता है कि आपके द्वारा दिया गया लिंक वही काम करता है लेकिन मैं उपयोग कर रहे एपीआई पुस्तकालयों के बजाय आरईएसटी का उपयोग करता हूं। – Markymark

+0

मैंने अपने क्लाइंट_सेक्रेट को रीसेट करने का प्रयास किया और मुझे एक नया प्रमाणीकरण कोड मिला लेकिन फिर भी वही त्रुटि मिली:/इसलिए यह तरीका होना चाहिए कि मैं एक्सेस/रीफ्रेश टोकन का अनुरोध कर रहा हूं – Markymark

उत्तर

2

यह कुछ समय हो गया है क्योंकि मैंने इस परियोजना पर काम किया था - इसकी अब आवश्यकता नहीं थी।

समस्या सर्वर साइड ऐप के भीतर थी।मैं बस इसे सही तरीके से अनुरोध नहीं कर रहा था। एक बार मेरे सर्वर साइड ऐप (ऐप इंजन एंडपॉइंट) को एंड्रॉइड ऐप से ताज़ा टोकन प्राप्त हुआ, मैंने सर्वर पक्ष पर निम्नलिखित किया।

private String refreshAccessToken(String refreshToken, String clientId, String clientSecret) throws IOException { 
    try { 
     TokenResponse response = 
       new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(), 
         refreshToken, clientId, clientSecret).execute(); 
     return response.getAccessToken(); 
    } catch (TokenResponseException e) { 
     return null; 
    } 
} 
+0

http://stackoverflow.com/questions/33754177/google-analytics-custom-plugin-getting-error-invalid-grant यह मेरी वास्तविक समस्या है, लेकिन आपकेकेस से विचार प्राप्त करने का प्रयास कर रहा है। –

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