如何使用PHP在我的服务器上验证Android生成的令牌?

Sun*_*nny 3 php android google-play-services google-oauth google-api-php-client

好吧,我一直试图获得Tim Bray的文章"从Android应用程序验证后端呼叫"所描述的精彩必杀技.我可以通过调用GoogleAuthUtil.getToken()从我的Android应用程序中成功获取令牌.我将令牌传递给我的php服务器作为头部授权承载字段.这是我被卡住的地方.

我现在该怎么做才能验证令牌是从我的Android应用程序生成的,用于与我的服务器项目相同的项目?如何从令牌获取user_id?谢谢.

在谷歌控制台上我的php服务器和Android应用程序都在同一个项目上.在我的php服务器上,我可以链接android/google-api-php-client/src/Google_Client.php和android/google-api-php-client/src/contrib/Google_PlusService.php库代码.

Sun*_*nny 5

好吧,我终于偶然发现了解决问题的方法.我怀疑,答案很简单.我已经做了很多正确的事.我的网络端点和我的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." );
}
Run Code Online (Sandbox Code Playgroud)

变量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());
}
Run Code Online (Sandbox Code Playgroud)