2012-04-20 21 views
5

OAuth 2.0でGoogleのドキュメントリストAPI 3.0にアクセスしようとしていますが、401エラーでいくつか問題があります。ユーザーの後OAuth - 無効なトークン:許可されていないときに使用されるリクエストトークン

を受け入れている、私のコードは以下の通りです:

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(中) - 例外をスロー:

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で、GoogleOAuthHelperで、この方法を取得する必要

解決しよう:

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

あなたは答えにあなたのソリューションを入れて、その答えを受け入れるだろうか? このようにして質問が解決されたとマークされ、誰かがこの投稿を取得した場合(何らかの理由で)回答が見つけやすくなります。 –

+0

このoauthHelperとは何ですか? –

答えて

13

あなたはOAuth 2.0のが、OAuthの1.0を使用していませんHMAC-SHA1を署名方法として使用します。 OAuth 2.0を使用するには、少なくともgdata-java-clientライブラリのバージョン1.47.0とgoogle-oauth-java-clientライブラリのバージョン1.8.0-betaが必要です。

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_IDCLIENT_SECRETAPIs Consoleから取得でき、REDIRECT_URIはAPIプロジェクトに登録されているものと一致する必要があります。ここで

+0

ありがとうございます。あなたは正しかった。 OAuth2で既に動作するように修正されました。しかしあなたのコードにはエラーがあります。この文は後方にあります:.setRefreshToken(response.getAccessToken())。setAccessToken(response.getRefreshToken()); – xuso

+0

ありがとう、私はサンプルを修正しました:-) – Alain

+0

あなたはこのjar google-api-java-clientのmaven依存関係のリンクを提供できますか? – Sanket

3

はGDataのサービスにOAuth2.0トークンを追加する方法は次のとおりです。

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

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

が(たくさんある)すべての必要なライブラリをインポートすることを確認します。 GoogleはサービスのOAuthメカニズムを使用して再生し得るべきであるAndroidのトークンに

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

この回答は完璧に最も投票されたものを補完する... @ zavidovychあなたはそれを豊かにするために他の答えを編集すると考えている? –

関連する問題