わかりました、私はついに私の問題の解決策に出くわしました。私が思ったように、答えはかなり単純でした。私はすでに多くのことを正しく行っていました。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());
}