2015-07-10 25 views
6

我試圖通過他們的Google帳戶安全地登錄用戶。 我在使用this cordova插件檢索userID和oAuthToken的階段。如何正確驗證Google令牌的完整性?

現在我需要將這些憑據發送到服務器,然後在服務器端驗證令牌的完整性。本質上,我正在嘗試執行this過程的一部分。

我很困惑我應該嘗試使用Google客戶端API驗證哪個令牌。我應該使用userID還是oAuthToken?

該文檔提到驗證用戶標識,但我覺得這很奇怪。這不意味着如果有人獲得我的用戶ID,他們可以基本上闖入我的服務器?用戶ID永遠不會改變(糾正我,如果我在這裏是錯誤的),所以它似乎不安全的驗證。驗證設置爲過期的oAuthToken是否更有意義?或者用戶ID是否也過期?

任何建議將受到歡迎。

感謝,

編輯:

任何有興趣。我的困惑起因於沒有完全理解Google API可以返回的三個令牌:userId,oAuthToken和idToken。 簡要說明:userId會返回大多數標識用戶的api調用。這似乎是不變的。我的情況下,oAuthToken是作爲Android客戶端訪問google api時返回的。當訪問api作爲Web客戶端時,會返回tokenId。所以那些希望使用移動檢索的令牌進行服務器端驗證的應該訪問api作爲Web客戶端。然後可以使用類似於下面接受的答案的代碼來驗證服務器返回的令牌。

回答

6

您需要驗證IdToken,絕不會在空行上發送userId。 IdToken很快就會過期,而且它幾乎是不可或缺的蠻力假冒攻擊。

這個PHP代碼片段接收與idtoken=啓動一個HTTP請求,驗證您的令牌服務器端,再返回,整個陣列或用戶電子郵件:

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

+1

謝謝澄清@ tony-gil。我使用了錯誤的驗證類型。我使用的是Andoird客戶端,但由於我的應用程序是cordova構建的,它應該是一個Web客戶端。這就是爲什麼我在userId,oAuthToken和tokenId之間感到困惑。所有3個版本都不同,後者僅在Google Developer控制檯上創建Web客戶端纔出現。 –

+0

tks爲upvote和答案@Fido的選擇! :) –

+2

試圖使用谷歌的PHP客戶端API幾個小時,沒有運氣。這工作第一次嘗試! +1 –