7

GoogleAppEngineで提供されるAppIdentityインターフェースを介してGoogleDriveAPIを使用しようとしています。これにより、基本的に、私のWebアプリケーションがサーバー間でGoogleのAPIと通信できるようになります。

ユーザーがログインする必要はありません。自分のGoogleドライブドキュメントを表示するだけです。

ただし、適切な値とスコープをすべて設定し、コンソールページで適切なGoogleドライブのノブをすべて有効にした後でも、次の単純なGETリクエストでこれを取得できますhttps://www.googleapis.com/drive/v2/files

{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}

どうしたの?私は何が欠けていますか?実際にリクエストを実行するコードは次のとおりです。面白いことに、URL短縮APIなどの他のAPIを使用するとうまく機能します。

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());

編集

たとえば、APIを変更してAPIを使用するとurlshortner、次のように機能します。

var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

そして出力:

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

では、GoogleドライブとアプリIDで機能しないものがあるはずですか?

編集2

私はここで正しい答えからいくつかの助けを見つけました:https ://stackoverflow.com/a/12526286/50394

しかし、それはGoogle AppsでのクライアントAPIスコープの設定について話しているので、私はGoogle Appsを使用しておらず、単にGoogleAppEngineのドメインを使用しています。foo.appspot.com

4

5 に答える 5

6

取得している 403 エラーは、GET に Authorization ヘッダーがなかったことを意味します。ロジックは、Authorization ヘッダーがなければ、あなたは匿名であるということです (あなたは軍団何とか何とか :-))。匿名使用のドライブ クォータがゼロであるため、このメッセージが表示されます。URL 短縮サービスは匿名のクォータが高いため、機能します。

独自の http サーバーを指すように URL を変更し、実際に送信しているヘッダーを確認することをお勧めします。

于 2012-10-05T13:45:32.980 に答える
1

BearerAuthorizationヘッダーで使用する必要があるAFAICT 。

keyおそらく何が起こっているのかというと、ドライブ API がサービス アカウントを認識せず (ヘッダーが間違っているため?)、パラメータも指定されていないため、匿名のリクエストとして処理されます (一般的なクエリパラメータを参照)。

これを試して:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

または、トークンをaccess_tokenクエリ パラメータとして追加してみてください。

于 2012-10-02T16:56:25.317 に答える
1

私がここ (サービス アカウント経由の Google ドライブ) で読んだことは、開発者コンソールから取得した API KEY を使用する、わずかに異なるスタイルを使用しているということでした。
私にとって適切な部分は、「サーバーアプリケーションのキー」を生成し、この手法を使用することでした。これは他では読んだことがありませんでし!

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();
于 2014-02-05T16:19:31.340 に答える
1

少なくともhttps://code.google.com/apis/consoleで Drive API を有効にして API コンソール エントリをセットアップする必要があると思います 。これを作成すると、GoogleCredential オブジェクトで使用できる ID が取得されます。GoogleCredential オブジェクトから、リクエストに追加できるアクセス トークンを取得できます。

于 2012-10-03T15:10:48.403 に答える
0

この回答は次のように主張しています。

Drive SDK のセキュリティ モデルにより、サービス アカウントはサポートされていません。

それでも問題が解決しない場合、回避策の 1 つは、通常の Google アカウントで通常の OAuth ダンスを 1 回実行し、アクセス トークンとリフレッシュ トークンをデータストアに保持することです。

于 2012-10-11T23:41:10.573 に答える