如何正确验证Google令牌的完整性?

时间:2015-07-10 17:11:05

标签: android oauth google-signin

我正在尝试通过他们的Google帐户安全登录用户。 我正处于使用this cordova插件检索userID和oAuthToken的阶段。

现在,我需要将这些凭据发送到我的服务器,然后在服务器端验证令牌的完整性。基本上我正在尝试执行this部分过程。

我很困惑我应该尝试使用Google客户端API验证哪个令牌。我应该使用userID还是oAuthToken?

文档提到验证userID但我发现这很奇怪。这不意味着,如果有人获得我的用户ID,他们基本上可以闯入我的服务器吗?用户ID永远不会改变(如果我在这里错了,请纠正我)所以对此进行验证似乎不安全。验证设置为过期的oAuthToken是否更有意义?或者用户ID是否也会过期?

欢迎任何建议。

谢谢,

菲多

修改

对任何有兴趣的人。由于不完全理解google api可以返回的三个令牌,我产生了混乱:userId,oAuthToken和idToken。 简而言之:返回userId,其中大多数api调用标识用户。这似乎是不变的。当我访问谷歌api作为Android客户端时,我的案例中的oAuthToken被返回。访问api作为Web客户端时返回tokenId。因此,那些希望使用移动检索令牌进行服务器端验证的人应该将api作为Web客户端访问。然后,返回的令牌可以使用类似于下面接受的答案的代码在服务器端验证。

1 个答案:

答案 0 :(得分:6)

you need to validate the IdToken, never send the userId on an open line. the IdToken expires quickly and it is virtually impregnable to brute force impersonation attacks.

this php snippet receives an HTTP request that starts with idtoken=, validates your token serverside and returns either the complete array or user email:

<?php
$inputRaw =  file_get_contents('php://input');
$idToken= substr($inputRaw,8);
$fp = fopen('twoStepOutput.txt', 'a');

$url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='.$idToken;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$json = json_decode($response, true);
curl_close($ch);

$userEmail = $json["email"];
$clientId = $json["azp"];
//fwrite($fp, date("YmdHis")."\r\n$idToken\r\n");
fwrite($fp, date("YmdHis")."\r\n");
fwrite($fp, "email Confirmed by GOOGLE:[$userEmail]\r\n");
//print_r($json); // returns array console readable
print_r($clientId); // returns google client id for verification (without transfering user data)
fclose($fp);
?>

just in case you are in doubts, this is what an IdToken looks like:

eypZCI6OiJSUzI1JhbGciNiIsImtIjk4MzQxMzgyMWJmMzhiNTJlM4OTI2YTllMTc0YTc5MWMwNGMifQ.eyJpc3MiOi3VizExYJhY2NvdW50cy5nb29nbGUuY29tIiwicmEIjoiMTAzNDUyNjAwODM5NzY3MjU2MDE0IiwiYXpwIjoiMTA3OTMxMTEyNTc1OS1lYWJhbWV0b2ZldjIwY28zbGQ5b2o1YWQwMzFuZG9nMC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoidG9ueWdpbGJyQGdtYWlsLmNvbSIsImF0X2hhc2giOiJaSkhxbUZHcnR5Y29kdEhhOGJvMEYWY1NTk2NzUsImV4cCVBIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjEwNzkzMTExMjU3NTkt1ldG9mZXYyMGNvM2xkOW9qNWFkMDMxbmRvZzAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJpYXQiOjE0MzZWFiI6MTQzNjU2MzI3NSwibmFtZSI6IlRvbnkgR2lsIiwicGljdHVyZSI6Imh0dHBzOi8vbGg0Lmdvb2dsZXVzZXJjb250ZW50LmNvbS8tQVREckRSbF9UdFEvQUFBQUFBQUFBQUkvQUFBQUFBQUFBRncvOVdDQnZkYlpUTEEvczk2LWMvcGhvdG8uanBnIiwiZ2l2ZW5fbmFtZSI6IlRvbnkiLCJmYW1pbHlfbmFtZSI6IkdpbCIsImxvY2FsZSI6ImVuIn0.L4peW11TD0bDOlvYKNY60ieZ1sbZfW9gEImcuxVA5f9U_4N49Io1CFXoGKmEPR_ij4q38tF2drPMOKijQePwlrxDui37ubzAdVkuksCJUobzjD1_eccF_8GldP5Y1_XsU8xrZeEnfabfiYpr-VwoLzIeNNUdy9SUbUWjMHNcvf4dGFMzE_SONHr57igjHK3rGkbvLo-UduFngm3e-EL0YR2zOKOVj1Qs8g8_qpWgkn8XABTme1thmuU8OfC-HaF9_B2Zk2UCsnOu4ApiYZk3DPIKgeX6AF11kYnzgvciYheWeddly0foT4G00C7w_wgtd-LSRw0XZltec_MPMa2QSA