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

How to properly verify the integrity of a Google token?

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

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

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

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

欢迎任何建议。

谢谢,

菲多

编辑:

任何感兴趣的人。我的困惑是由于没有完全理解 google api 可以 return 的三个标记:userId、oAuthToken 和 idToken。 Briefly:The userId return 与大多数 api 调用识别用户。这似乎是不变的。当我作为 Android 客户端访问 google api 时,我的 oAuthToken 被 returned。当作为 Web 客户端访问 api 时,tokenId 被 returned。因此,那些希望使用移动检索令牌进行服务器端验证的人应该将 api 作为 Web 客户端访问。然后可以使用类似于下面接受的答案的代码在服务器端验证令牌 returned。

您需要验证 IdToken,切勿在开放线路上发送 userId。 IdToken 很快就会过期,而且它几乎无法抵御暴力模拟攻击。

此 php 片段接收以 idtoken= 开头的 HTTP 请求,验证您的令牌服务器端和 returns 完整数组或用户电子邮件:

<?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);
?>

以防万一,IdToken 看起来像这样:

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