2012-09-18 8 views
11

Google Drive Quick Start application called DriveCommandLineをインストールして正常に実行しました。また、ドライブアカウントのファイルのうちの1つのファイル情報をGETするために少し修正しました。Googleドライブ/ OAuth - 再利用可能なGoogleCredentialsを入手する方法がわかりません

私が今やってみたいのは、認証コードを何とか保存し、ユーザが認証コードを取得するたびにウェブページにアクセスする必要がなく、それらを再利用することです。私はthis pageをチェックアウトし、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) 

I」はこれらのAPI(GoogleドライブとOAuth)を2日間見ていて、ほとんど進歩が見られませんでした。私は本当に上記のエラーと一般的な永続的な資格情報を取得する問題のいくつかの助けに感謝したいと思います。

この全体の構造は、私にとって不必要に複雑に思えます。誰も私のGoogleのユーザー名とパスワードを渡すだけで簡単な資格情報オブジェクトを作成できない理由を説明してくれますか?

おかげで、 ブライアン・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(); 

を私が今持っている問題は、ということです

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) 

私はこのために使用されなければならないいくつかの他の余地がある:私は認証コードを交換するために、フロー(GoogleAuthorizationCodeFlowオブジェクト)を使用しようとすると、資格情報オブジェクトのために、私は次のエラーを取得しますか?私は現在、MyClassで提供されているスコープの配列を使用しています。

ありがとう!

答えて

13

私はあなたの痛みを感じます。私は2ヶ月で、まだ驚いています。あなたはユーザー権限を要求すると

私の教訓のいくつか...

  • 、 "真のオフライン=" を指定します。これにより、リフレッシュトークンが返されます(リフレッシュトークンは制限付きのアクセス権を持つパスワードと同じくらい良い)。これを保存し、アクセストークンを取得するためにいつでも(ユーザーがそれを取り消すまで)再利用することができます。

  • 私の気持ちは、Google SDKがヘルプよりも障害だということです。 1つ1つ、私はそれらを使用して停止し、今すぐREST APIを直接呼び出します。

  • 最後に、Google clientloginプロトコルを使用して、以前の世代のAPIにアクセスできます。しかし、これはまったく廃止され、間もなく無効になります。 OAuthは、本質的に複雑な認証のきめ細かな制御を提供するように設計されています。だから私はそれが複雑であることに同意するが、私はそれが不必要にそうだとは思わない。私たちは、あなたと私の経験は、開発コミュニティは、私たちに焦点を当てることができますので、当社のリアビューミラーにこのようなものを得るために、統合文書やレシピの必要性にまだあることを示して

:-)複雑な世界に住んでいます手近な課題。

+0

おかげで、申し訳ありません私は誤って代わりに私自身のあなたのポストに編集/更新を追加しました。私はまだここに投稿するのに慣れている!私はあなたの提案を実装しようとし、それがどのように行くのか教えてください。 PS - 残念ながら、私はこれに取り組むのに2ヶ月もかかりません。私はすでに2日間過ごしたことに腹が立っている!! : -/ –

+0

frefreshtokenのリターンについて。私は設定後にユーザーのやりとりなしに実行するためのサーバーアプリケーションを作成しました。しかし、数日前(問題なく2か月間稼働していました)、アプリケーションがGoogleドライブを使用するためのアクセスをリクエストするために、複数の認証ページがサーバー上で開かれていることがわかりました。たとえそれがAuthを求めていたとしても、それはまだ働いていました。これがどうして起こるのか? –

+0

はおそらく別の質問です。私もこれを見て、リフレッシュトークンが無作為に期限切れになるまでGoogleに伝えます。それが原因であるかどうかを確認するには、ログに400-invalid grantがあるかどうかを確認します。アプリが複数の場所からリフレッシュトークンをリクエストしている可能性はありますか?そのような場合、新しいリフレッシュトークンが古いものを期限切れにする可能性があると私は信じています。 – pinoyyid

1

私はようやく上記の2番目の問題を解決しました。そして、私は最終的に、アクセストークンとリフレッシュトークンを持つ有効なGoogleCredentialオブジェクトを取得しています。

スコープのリストをMyClass(資格情報を管理するもの)に変更することで、スコープの問題を解決しようとし続けました。最終的には、DriveCommandLine(当初は認証コードを取得するために使用されていたもの)の変更バージョンでスコープを調整する必要がありました。私はOauth2Scopesから2つのスコープを追加しました:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, 
    Arrays.asList(DriveScopes.DRIVE, Oauth2Scopes.USERINFO_EMAIL, Oauth2Scopes.USERINFO_PROFILE)) 
    .setAccessType("offline").setApprovalPrompt("force").build(); 

は私がMyClassの中で、後にユーザーIDを取得するために許可されたユーザ情報のスコープを追加します。ユーザーIDを使用して、資格情報をデータベースに格納して再利用できるようになりました(毎回ユーザーにURLを渡す必要はありません)。また、pinoyyidが提案したように、アクセスタイプを「オフライン」に設定しました。次のように

3

Oath2Scopesがインポートされます。

import com.google.api.services.oauth2.Oauth2Scopes; 

あなたがあなたのクラスパスにjarファイルの 'Google-API-サービス-のOAuth2-V2-rev15-1.8.0-beta.jar' を持っている必要がありますそのパッケージにアクセスしてください。 hereをダウンロードできます。

いいえ、少なくとも一度は認証URLにアクセスせずにコードをコピーする必要がなく、資格情報を取得する方法がわかりません。私はMyClassを変更してデータベースから資格情報を取得していました(私の場合は、userid、accesstoken、refreshtokenを含む単純なテーブルです)。このようにすれば、認証コードを一度取得するだけで、アクセストークンやリフレッシュトークンを取得したら、それらを再利用してGoogleCredentialオブジェクトを作成できます。

GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory) 
      .setTransport(httpTransport).setClientSecrets(clientid, clientsecret).build(); 
    credential.setAccessToken(accessToken); 
    credential.setRefreshToken(refreshToken); 

ちょうどあなたのClientID、clientsecret、accessTokenと上記refreshTokenを入力します。ここでImakeにはGoogleCredentialオブジェクトがどのようです。

私はコードを分割して整理して、ここに掲載するのにはあまり時間がありませんが、まだ問題がある場合は私に教えてください。しかし、あなたは事実上、盲人に指示を求めています。このシステム全体の理解は非常にスケッチです!

乾杯、 ブライアン

pinoyyid
関連する問題