1

GoogleドライブAndroid APIを使用して、ユーザーがAndroid搭載端末のGoogleドライブから自分のサーバーにファイルをアップロードできるようにします。 この設定を変更して、サーバーがCross Client Authorizationを使用してユーザーのGoogleドライブに直接アクセスできるようにしたいとします。つまり、GoogleAuthUtil.getTokenを使用してID Tokenを生成する必要があります。そして、これはすべてが軌道から外れることです。このトークンを生成するには、Accountオブジェクトが必要です。GoogleドライブAndroid APIとクライアント間の認証

現在、私はこのようなGoogleApiClient設定してい:

mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
    .addApi(Drive.API) 
    .addScope(Drive.SCOPE_FILE) 
    .addConnectionCallbacks(this) 
    .addOnConnectionFailedListener(this) 
    .build(); 

これは素晴らしい作品を、すべての今して、ユーザがと接続するためにアカウントものを選択することができ、アカウントピッカーを示しています。すべてがフレームワークによって管理されます。しかし、ユーザーが接続を選択したAccountにアクセスする方法はありません!

代わりに、私が使用して、それを自分自身を管理する必要があります。

Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, 
    false, null, null, null, null); 
startActivityForResult(intent, RC_ACCOUNT_PICKER); 

そしてonActivityResultに私が使用して、選択したアカウントを取得することができます

Account account = new Account(intent.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME), 
    intent.getExtras().getString(AccountManager.KEY_ACCOUNT_TYPE)); 

そして今、私はAccountオブジェクトを持っているので、私はそれを使って明示的に接続できます:

mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
    .addApi(Drive.API) 
    .addScope(Drive.SCOPE_FILE) 
    .setAccountName(mAccount.name) // Account name! 
    .addConnectionCallbacks(this) 
    .addOnConnectionFailedListener(this) 
    .build(); 

これは私の唯一のoptioですか? n、私の最初のソリューションを使用してAccountを選択する方法はありませんか?

-

使用して、私のID Tokenを生成しようとすると後で、:

String scope = String.format("oauth2:server:client_id:%s:api_scope:%s", 
    "12345.apps.googleusercontent.com", 
    "https://www.googleapis.com/auth/drive.file"); 
String token = GoogleAuthUtil.getToken(getContext(), mAccount, scope); 

を私はまだにもかかわらず、利用者からさらに別の権限を付与する必要がUserRecoverableAuthExceptionを取得しています私は接続時と同じアカウントと同じ認証範囲を使用しています。 そのすべてが処理されたら、同じコードをもう一度実行して、最後に私のID Tokenを取得することができます。

-

私は根本的に誤解してきたものがあるか、これは、動作するようになっていますどのように実際にありますか?

答えて

3

this blog postで説明されているように、GoogleAuthUtil.getToken()はもう使用しないでください。サーバーにトークンを渡すことは危険です。

代わりにEnable Server-Side AccessGoogle Sign Inで使用し、requestServerAuthCode() methodを使用する必要があります。

これはユーザに促すダブル避け、GET_ACCOUNTS許可を使用して、あなたにログインするための単一のユーザー・フローを与えていません。

+0

私は質問をすることができますか?私が正しく理解していれば、 'GoogleAuthUtil.getToken'は依然としてリクエストがあっても安全に使えるということをブログのところでは'一般的に、あなたはAndroidクライアント上でREST API呼び出しをしない限り、GoogleAuthUtil.getTokenを使うべきではありません。 Androidアプリで直接呼び出されるREST API(サーバーなし) – BNK

+0

IDトークンをローカルで使用したい場合は、おそらく[idトークンフロー](https://developers.google。シングルサインオンの利点を得るには、requestIdToken()を使用してください。 – ianhanniballake

+0

しかし、この場合、GoogleAuthUtil.getTokenはまだ保護されていますか?さらに、「ユーザーのID、メールアドレス、名前、プロフィールの画像URL」を取得するためにのみ使用されるIDトークンは、Googleドライブ、YouTube、連絡先などの他のGoogle APIにはアクセスしません。 – BNK

関連する問題