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

如何使用PHP在服务器上验证Android生成的令牌?,php,android,google-oauth,google-play-services,google-api-php-client,Php,Android,Google Oauth,Google Play Services,Google Api Php Client,好的,我一直在努力获得Tim Bray的文章描述的美妙涅盘。我可以通过调用GoogleAuthUtil.getToken()从android应用程序成功获取令牌。我将令牌作为头授权承载字段传递给我的php服务器。这就是我被卡住的地方 我现在应该做什么来验证令牌是从我的android应用程序为与我的服务器项目相同的项目生成的?如何从令牌中获取用户\u id?谢谢 在谷歌控制台上,我的php服务器和android应用程序都在同一个项目上。在我的php服务器上,我可以链接android/google

好的,我一直在努力获得Tim Bray的文章描述的美妙涅盘。我可以通过调用GoogleAuthUtil.getToken()从android应用程序成功获取令牌。我将令牌作为头授权承载字段传递给我的php服务器。这就是我被卡住的地方

我现在应该做什么来验证令牌是从我的android应用程序为与我的服务器项目相同的项目生成的?如何从令牌中获取用户\u id?谢谢


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

好的,我终于找到了解决问题的方法。正如我所怀疑的,答案相当简单。我已经做了很多正确的事情。我的web端点和android应用程序都在同一个Google API控制台项目中。他们分享了项目条目,如观众等

我找到的所有进行验证的示例要么假设读者已经知道如何进行验证,要么假设PHP需要生成令牌。最后,我无意中进入了本文的这一部分,这让我想到了如何在我的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控制台定义页面复制该值)

在我的解决方案中,我决定使用“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());
}
HttpPost-HttpPost=newhttppost(“服务器web端点的uri”);
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“mToken”,mToken));
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
}捕获(例外e){
Log.e(“HTTP”,“HTTP连接中的错误”+e.toString());
}

我们在GitHub上有用于验证服务器令牌的示例代码和说明。下面是PHP中的示例

这是库调用:

$client->verifyIdToken($id_token, CLIENT_ID)

使用客户端库的一个优点是,如果缓存了Google的安全证书,它可以脱机验证ID令牌。这意味着在第一次使用后,图书馆的呼叫速度会快得多,因为图书馆不必再向谷歌进行另一次网络呼叫。使用
oauth2/v1/tokeninfo
端点始终需要网络调用,因此在大多数情况下速度会较慢。

这在locahost中有效,但在我的服务器上它确实返回空响应,但http结果代码为200