2012-04-20 18 views
5

की अनुमति नहीं होने पर अनुरोध टोकन का अनुरोध करें IAAuth 2.0 के साथ Google के दस्तावेज़ सूची API 3.0 तक पहुंचने का प्रयास कर रहा हूं लेकिन मुझे 401 त्रुटि के साथ कुछ समस्याएं आ रही हैं।ओएथ - अमान्य टोकन:

उपयोगकर्ता के बाद स्वीकार कर लिया है, मेरे कोड निम्नलिखित है: -:

com.google.gdata.util.AuthenticationException: Token invalid - Invalid token: Request token used when not allowed. 
<HTML> 
<HEAD> 
<TITLE>Token invalid - Invalid token: Request token used when not allowed.</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Token invalid - Invalid token: Request token used when not allowed.</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 

क्या हो रहा है

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
oauthParameters.setOAuthConsumerKey(CLIENT_ID); 
oauthParameters.setOAuthConsumerSecret(CLIENT_SECRET); 
oauthParameters.setOAuthToken(token); 
oauthParameters.setOAuthTokenSecret(tokenSecret); 
oauthParameters.setScope("https://docs.google.com/feeds/"); 

service = new DocsService("myapp"); 
service.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); 

DocumentListFeed feed = service.getFeed(new URL("https://docs.google.com/feeds/default/private/full/?v=3"), DocumentListFeed.class); 

फिर, अंतिम पंक्ति -getFeed में() अपवाद फेंकता है? एक स्थिर मुख्य परीक्षण वर्ग पर एक आकर्षण की तरह काम करता है, लेकिन जब मैं इसे सर्वर पर चलाता हूं तो यह लाइन अब और काम नहीं करती है। कोई उपाय?


हल पहुँच टोकन एक GoogleOAuthHelper साथ इस तरह से प्राप्त किया जा करने के लिए,, GoogleOAuthParameters सीधे के साथ नहीं की जरूरत है:

String accessToken = oauthHelper.getAccessToken(oauthParameters); 
+0

आप एक जवाब में अपने समाधान कर दिया और कहा कि इस सवाल का जवाब स्वीकार कर सकता है? इस तरह प्रश्न को हल किया गया है और यदि कोई इस पोस्ट पर जाता है (किसी भी कारण से) तो उत्तर मिलना आसान होगा। –

+0

यह ओथ हेल्पर क्या है? –

उत्तर

13

आप OAuth 2.0 लेकिन OAuth 1.0 उपयोग नहीं कर रहे हस्ताक्षर विधि के रूप में एचएमएसी-एसएचए 1 के साथ। OAuth 2.0 का उपयोग करने के लिए, आपको gdata-java-client लाइब्रेरी का कम से कम संस्करण 1.47.0 और google-oauth-java-client लाइब्रेरी का संस्करण 1.8.0-बीटा चाहिए।

google-api-java-client लाइब्रेरी का उपयोग Google के OAuth 2.0 कार्यान्वयन से निपटने के लिए सहायक वर्ग प्रदान करता है।

OAuth 2.0 क्रेडेंशियल्स प्राप्त करने के लिए, तो आप इस कोड का उपयोग कर सकते हैं:

import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.jackson.JacksonFactory; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Arrays; 
import java.util.List; 

public class MyClass { 

    // Retrieve the CLIENT_ID and CLIENT_SECRET from an APIs Console project: 
    //  https://code.google.com/apis/console 
    static String CLIENT_ID = "<YOUR_CLIENT_ID>"; 
    static String CLIENT_SECRET = "<YOUR_CLIENT_SECRET>"; 
    // Change the REDIRECT_URI value to your registered redirect URI for web 
    // applications. 
    static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; 
    // Add other requested scopes. 
    static List<String> SCOPES = Arrays.asList("https://docs.google.com/feeds"); 

    /** 
    * Retrieve OAuth 2.0 credentials. 
    * 
    * @return OAuth 2.0 Credential instance. 
    */ 
    static Credential getCredentials() throws IOException { 
    HttpTransport transport = new NetHttpTransport(); 
    JacksonFactory jsonFactory = new JacksonFactory(); 

    // Step 1: Authorize --> 
    String authorizationUrl = 
     new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, REDIRECT_URI, SCOPES).build(); 

    // Point or redirect your user to the authorizationUrl. 
    System.out.println("Go to the following link in your browser:"); 
    System.out.println(authorizationUrl); 

    // Read the authorization code from the standard input stream. 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    System.out.println("What is the authorization code?"); 
    String code = in.readLine(); 
    // End of Step 1 <-- 

    // Step 2: Exchange --> 
    GoogleTokenResponse response = 
     new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, 
      code, REDIRECT_URI).execute(); 
    // End of Step 2 <-- 

    // Build a new GoogleCredential instance and return it. 
    return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET) 
     .setJsonFactory(jsonFactory).setTransport(transport).build() 
     .setAccessToken(response.getAccessToken()).setRefreshToken(response.getRefreshToken()); 
    } 

    // … 
} 

एक बार जब आप OAuth 2.0 क्रेडेंशियल है, तो आप इस प्रकार एक सेवा वस्तु अधिकृत कर सकते हैं:

// ... 
import com.google.api.client.auth.oauth2.Credential; 
import com.google.gdata.client.docs.DocsService; 
import com.google.gdata.data.docs.DocumentListEntry; 
import com.google.gdata.data.docs.DocumentListFeed; 
import com.google.gdata.util.ServiceException; 
// ... 
import java.io.IOException; 
import java.net.URL; 
// ... 

public class MyClass { 
    // … 

    /** 
    * Print document entries using the provided authorized DocsService. 
    * 
    * @param credential OAuth 2.0 credential to use to authorize the requests. 
    * @throws IOException 
    * @throws ServiceException 
    */ 
    static void printDocuments(Credential credential) throws IOException, ServiceException { 
    // Instantiate and authorize a new DocsService object. 
    DocsService service = new DocsService("<YOUR_APPLICATION_NAME>"); 
    service.setOAuth2Credentials(credential); 

    // Send a request to the Documents List API to retrieve document entries. 
    URL feedUri = new URL("https://docs.google.com/feeds/default/private/full/"); 
    DocumentListFeed feed = service.getFeed(feedUri, DocumentListFeed.class); 

    for (DocumentListEntry entry : feed.getEntries()) { 
     System.out.println("Title: " + entry.getTitle().getPlainText()); 
    } 
    } 

    // ... 
} 

CLIENT_ID , CLIENT_SECRET को APIs Console से पुनर्प्राप्त किया जा सकता है और REDIRECT_URI आपके एपीआई प्रोजेक्ट के साथ पंजीकृत एक से मेल खाना चाहिए।

+0

धन्यवाद। तुम सही थे। OAuth2 के साथ चलाने के लिए पहले ही तय किया गया है। लेकिन आपके कोड में एक त्रुटि है, यह वाक्य पीछे की ओर है: .setRefreshToken (response.getAccessToken())। SetAccessToken (response.getRefreshToken()); – xuso

+0

धन्यवाद, मैंने नमूना तय किया :-) – Alain

+0

क्या आप इस जार google-api-java-client के लिए मेवेन निर्भरता के लिए लिंक प्रदान कर सकते हैं? – Sanket

3

यहाँ GData सेवा करने के लिए OAuth2.0 टोकन कैसे जोड़ा जाता है:

SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1"); 

service.setOAuth2Credentials(new Credential(BearerToken 
    .authorizationHeaderAccessMethod()) 
    .setFromTokenResponse(new TokenResponse().setAccessToken(mToken))); 

सभी आवश्यक पुस्तकालयों (जो एक बहुत है) आयात करने के लिए सुनिश्चित करें।

एंड्रॉयड टोकन पर Google Play सेवाओं OAuth तंत्र का उपयोग कर प्राप्त किया जाना चाहिए:

String token = GoogleAuthUtil.getToken(String email, String scopes); 
+0

यह उत्तर पूरी तरह से सबसे अधिक मतदान किया गया है ... @ zavidovych क्या आपने इसे समृद्ध करने के लिए अन्य उत्तर संपादित करने पर विचार किया है? –

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