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


How can I Verify Android Generated Tokens on my Server Using PHP?

好吧,我一直在努力获得Tim Bray的文章《验证Android应用程序的后端调用》所描述的美妙天堂。我可以通过调用GoogleAuthUtil.getToken()成功地从我的android应用程序中获取令牌。我将令牌作为头授权承载字段传递到我的php服务器。这就是我陷入困境的地方。

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

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

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

我发现的所有验证示例要么假设读者已经知道如何进行验证,要么假设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保存我的应用程序的Audience字符串的值(您可以从应用程序的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());
}

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

https://github.com/googleplus/gplus-verifytoken-php

这是图书馆的电话:

$client->verifyIdToken($id_token, CLIENT_ID)

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