Google App Engineを介したGoogle Drive API
-
12-12-2019 - |
質問
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 回実行し、アクセス トークンと更新トークンをデータストアに保持することです。