2

Google ドライブのフォルダから画像のギャラリーを読み込む App Engine Web アプリケーションを作成しています。このコードは、ローカルで実行すると問題なく動作します (画像が取得され、Web ページに正しく表示されます) が、Google App Engine にデプロイすると機能しなくなります。具体的には、次のメソッドを起動すると、返される Drive サービスは null であり、例外はスローされません。資格情報 (SERVICE_ACCOUNT_EMAIL および PKCS12 ファイル) は、コードをローカルで実行するときに機能するため、正しい必要があります。ここで何が欠けていますか?前もって感謝します。

public static Drive getDriveService() {
    HttpTransport httpTransport = new NetHttpTransport();
    GsonFactory jsonFactory = new GsonFactory();
    GoogleCredential credential;
    Drive service = null;
    List<String> scopes = Arrays.asList(DriveScopes.DRIVE);
    try {
        credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
                .setServiceAccountScopes(scopes)
                .setServiceAccountPrivateKeyFromP12File(
                        new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
                .build();
        service = new Drive.Builder(httpTransport, jsonFactory, null).setApplicationName("MyAppName")
                .setHttpRequestInitializer(credential).build();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return service;
}
4

2 に答える 2

1

Drive Api を使用してサービス アカウントで認証するには、実際には 2 つの方法があります。Dev App Server を使用してローカル マシンでデバッグしている場合は、使用しているもので問題ありませんが、GAE に展開すると機能しません。ドライブ API リファレンスから取得したこのコード スニペットで認証できます。

https://developers.google.com/drive/service-accounts#google_app_engine_project_service_accounts

コンソールから取得した API キーをコードに入れるだけです。これは、Drive API の GAE 認証について私が見つけた唯一の有効なソリューションです。

これは、プロジェクトに追加するために探しているコードです。

import com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential;
import com.google.api.client.googleapis.services.CommonGoogleClientRequestInitializer;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
...

/** The API Key of the project */
private static final String API_KEY = "the_api_key_of_the_project";

/**
 * Build and returns a Drive service object authorized with the
 * application's service accounts.
 *
 * @return Drive service object that is ready to make requests.
 */
public static Drive getDriveService() throws GeneralSecurityException,
    IOException, URISyntaxException {
  HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();
  return service;
}
于 2013-09-25T12:18:06.290 に答える
0

一般に、Oauth をデバッグするには、ロギングをオンにして、ネットワーク上で何が起こっているかを確認します。明らかに、ローカルとGAEの両方でそれを行い、違いを探しています。

コードは両方の環境で同じであるため、それが問題の原因であるとは考えられません。確認事項をいくつか...

  1. スコープ、clientId、秘密鍵などが正しく設定されていることを確認しましたか
  2. あなたのコードでは、資格情報は null ですか、それともサービスのみですか?
  3. ユーザー/資格証明ストアに不足しているものはありますか?
  4. ユーザー セッションを管理するコードは正しく機能していますか?
于 2013-09-25T09:19:22.193 に答える