3

わかりました、Tim Bray の記事Android アプリからのバックエンド コールの検証で説明されている素晴らしい涅槃を得ようとしています。GoogleAuthUtil.getToken() を呼び出すことで、Android アプリからトークンを正常に取得できます。トークンをヘッダー Authorization Bearer フィールドとして php サーバーに渡します。これは私が立ち往生するところです。

サーバー プロジェクトと同じプロジェクトの Android アプリからトークンが生成されたことを確認するには、どうすればよいですか? トークンから user_id を取得するにはどうすればよいですか? ありがとう。

Google コンソールでは、php サーバーと Android アプリの両方が同じプロジェクトにあります。私のphpサーバーでは、android/google-api-php-client/src/Google_Client.phpとandroid/google-api-php-client/src/contrib/Google_PlusService.phpライブラリコードの両方にリンクできます。

4

2 に答える 2

4

わかりました、私はついに私の問題の解決策に出くわしました。私が思ったように、答えはかなり単純でした。私はすでに多くのことを正しく行っていました。Web エンドポイントと Android アプリの両方が同じ Google API コンソール プロジェクトにありました。Audience などのプロジェクト エントリを共有しました。

検証を行うために私が見つけたすべての例は、読者がこれを行う方法を既に知っていることを前提としているか、PHP がトークンを生成する必要があることを前提としています。最後に、トークンの検証に関する Google OAuth2 ドキュメントのこのセクションに出くわし、php サーバーでクリーンに検証を行う方法を思いつきました。確認だけで、他には何もありません、お母さん!OAuth は十分に紛らわしいです。コマンド ラインから curl を使用して確認する例は他にもあります。ただし、これは PHP で tokeninfo を呼び出して、(1) トークンが有効であり、(2) アプリ用であることを確認する方法です。

$mToken = $_POST['mToken'];
$userinfo = 'https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=' . $mToken;
$json = file_get_contents($userinfo);
$userInfoArray = json_decode($json,true);
$googleEmail = $userInfoArray['email'];
$tokenUserId = $userInfoArray['user_id'];
$tokenAudience = $userInfoArray['audience'];
$tokenIssuer = $userInfoArray['issuer'];    

if ( strcasecmp( $tokenAudience, GOOGLE_FULL_CLIENT_ID ) != 0) {
        error_log ( "ERROR:'" . $tokenAudience . "' did not match." );
}

変数 GOOGLE_FULL_CLIENT_ID には、アプリの対象ユーザー文字列の値が保持されます (これは、アプリの Google API コンソール定義ページからコピーできます)。

私のソリューションでは、_POST 値ペア「mToken」を使用して、Android アプリから生成されたトークンをサーバー エンドポイントに渡すことにしました。Android でこれを行うためのコードは次のとおりです。

HttpPost httppost = new HttpPost("uri for your server web endpoint");
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("mToken", mToken));
try {
        HttpClient httpclient = new DefaultHttpClient();
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
} catch (Exception e) {
        Log.e("HTTP", "Error in http connection " + e.toString());
}
于 2013-07-06T22:13:17.090 に答える