好的,我一直试图获得Tim Bray撰写的文章Verifying Back-End Calls from Android Apps所描述的精彩必杀技。我可以通过调用GoogleAuthUtil.getToken()从我的Android应用程序中成功获取令牌。我将令牌传递给我的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库代码。
答案 0 :(得分:5)
好的,我最终偶然发现了解决问题的方法。我怀疑,答案很简单。我已经做了很多正确的事。我的网络端点和我的Android应用都在同一个Google API控制台项目中。他们分享了诸如Audience等项目条目。
我发现用于验证的所有示例都假定读者已经知道如何执行此操作或假设PHP需要生成令牌。最后,我偶然发现了Google OAuth2 documentation on Validating a Token的这一部分,它给了我如何在我的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());
}
答案 1 :(得分:4)
我们在GitHub上有示例代码和说明,用于验证来自服务器的令牌。以下是PHP中的示例。
https://github.com/googleplus/gplus-verifytoken-php
这是图书馆电话:
$client->verifyIdToken($id_token, CLIENT_ID)
使用客户端库的一个优点是,如果已经缓存了Google的安全证书,它可以脱机验证ID令牌。这意味着首次使用后库调用会更快,因为库不需要再向Google发出网络调用。使用oauth2/v1/tokeninfo
端点始终需要网络呼叫,因此在大多数情况下它会变慢。