DriveCommandLine という Google Drive Quick Start アプリケーションを正常にインストールして実行しました。また、ドライブ アカウント内のファイルの 1 つのファイル情報を取得するように少し調整しました。
私が今やりたいことは、資格情報を何らかの方法で保存し、ユーザーが毎回 Web ページにアクセスして認証コードを取得することなく再利用することです。OAuth 2.0 資格情報を取得して使用する手順が記載されたこのページを確認しました。サンプル クラス (MyClass) を使用するために、Credential オブジェクトがインスタンス化されている DriveCommandLine の行を変更しました。
Credential credential = MyClass.getCredentials(code, "");
これにより、次の例外がスローされます。
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:187)
at com.google.api.client.json.jackson.JacksonFactory.createJsonParser(JacksonFactory.java:84)
at com.google.api.client.json.JsonFactory.fromInputStream(JsonFactory.java:247)
at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(GoogleClientSecrets.java:168)
at googledrive.MyClass.getFlow(MyClass.java:145)
at googledrive.MyClass.exchangeCode(MyClass.java:166)
at googledrive.MyClass.getCredentials(MyClass.java:239)
at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)
私はこれらの API (Google ドライブと OAuth) を 2 日間調べてきましたが、ほとんど進歩していません。上記のエラーと、一般的に永続的な資格情報を取得する際の問題について、助けていただければ幸いです。
この全体の構造は、私には不必要に複雑に思えます。Google のユーザー名とパスワードを渡して単純な Credential オブジェクトを作成できない理由を説明したい人はいますか?
ありがとう、ブライアン O キャロル、ダブリン、アイルランド
* アップデート *
OK、上記のエラーを回避したばかりで、新しいエラーが発生しました。
最初の問題を回避する方法は、MyClass.getFlow() を変更することでした。json ファイルから GoogleClientServices オブジェクトを作成する代わりに、クライアント ID とクライアント シークレットを文字列として直接入力できる別のバージョンの GoogleAuthorizationCodeFlow.Builder を使用しました。
flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();
私が今抱えている問題は、フロー (GoogleAuthorizationCodeFlow オブジェクト) を使用して Credentials オブジェクトの認証コードを交換しようとすると、次のエラーが発生することです。
An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_scope"
}
googledrive.MyClass$CodeExchangeException
at googledrive.MyClass.exchangeCode(MyClass.java:185)
at googledrive.MyClass.getCredentials(MyClass.java:262)
at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)
これに使用する必要がある他のスコープはありますか? 現在、MyClass で提供されているスコープの配列を使用しています。
private static final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile");
ありがとう!