質問

Google Drive APIを使用しようとしています アプリのアイデンティティ Google App Engine で提供されるインターフェース。これにより、基本的に 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 を変更するだけの場合、 urlshortner たとえば、API は次のように動作します。

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

そして出力:

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

ということは、Google ドライブと App Identity で何か問題が発生しているのではないでしょうか?

編集2

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

ただし、これは Google Apps でのクライアント API スコープの設定についての話であり、Google Apps を使用しているのではなく、単に Google App Engine のドメインを使用しているだけです。 foo.appspot.com

役に立ちましたか?

解決

表示されている 403 エラーは、GET に Authorization ヘッダーがなかったことを意味します。そのロジックは、Authorization ヘッダーがなければあなたは匿名であるということです (あなたは何と何と :-))。匿名で使用するドライブの割り当てがゼロであるため、メッセージが表示されます。URL 短縮ツールには匿名の割り当てが大きいため、機能します。

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

他のヒント

AFAICTを使用する必要があります Bearer Authorizationヘッダーに。

おそらく、何が起こっているのかというと、Drive API がサービス アカウントを認識せず (ヘッダーが間違っているため?)、そのため、サービス アカウントが存在しないため、匿名リクエストとして受け取られます。 key パラメータも提供されていませんでした(「 一般的なクエリパラメータ).

これを試して:

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

または、次のようにトークンを追加してみることもできます access_token クエリパラメータ。

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

ここで読んだこと(サービスアカウント経由の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();

これ 答え 次のように主張します:

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

それでもそうなる場合、回避策の 1 つは、通常の Google アカウントを使用して通常の OAuth ダンスを 1 回実行し、アクセス トークンと更新トークンをデータストアに保持することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top