2015-07-10 9 views
6

Sto tentando di accedere in modo sicuro a un utente tramite il proprio account Google. Sono allo stage che richiamo userID e oAuthToken usando il plugin cordova this.Come verificare correttamente l'integrità di un token Google?

Ora sono al punto in cui ho bisogno di inviare queste credenziali al mio server e quindi sul lato server convalidare l'integrità del token. In sostanza sto cercando di eseguire la parte this del processo.

Sono confuso su quale token dovrei provare a verificare utilizzando l'API client di Google. Dovrei usare userID o oAuthToken?

La documentazione menziona la convalida del userID ma la trovo strana. Questo non significa che se qualcuno ottiene il mio id utente possono essenzialmente entrare nel mio server? L'ID utente non cambia mai (correggimi se ho torto qui), quindi sembra insicuro convalidare su questo. Non avrebbe più senso convalidare oAuthToken che è impostato per scadere? Oppure scade anche l'ID utente?

Qualsiasi consiglio sarebbe benvenuto.

Grazie,

Fido

Edit:

Per chiunque sia interessato. La mia confusione è sorto a causa della mancata comprensione completa di tre token che possono essere restituiti da google api: userId, oAuthToken e idToken. In breve: L'ID utente viene restituito con la maggior parte delle chiamate API che identificano l'utente. Questo sembra essere costante. L'OAuthToken nel mio caso è stato restituito quando ho effettuato l'accesso a google api come client Android. TokenId viene restituito quando si accede a api come client Web. Pertanto, coloro che desiderano eseguire la convalida lato server utilizzando un token richiamato per dispositivi mobili devono accedere all'api come client Web. Il token restituito può quindi essere convalidato lato server utilizzando il codice simile alla risposta accettata di seguito.

risposta

6

è necessario convalidare IdToken, non inviare mai ID utente su una linea aperta. l'IdToken scade rapidamente ed è praticamente inespugnabile agli attacchi di impersonificazione della forza bruta.

questa php frammento riceve una richiesta HTTP che inizia con idtoken=, convalida la serverside token e restituisce sia la completa array o utente di posta elettronica:

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

solo nel caso in cui ci si trova in dubbio, questo è ciò che un IDToken si presenta come:

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

+1

Grazie per il chiarimento @ tony-gil. Stavo usando il tipo sbagliato di convalida. Stavo usando un client Andoird ma dal momento che la mia app è stata costruita con Cordova, avrebbe dovuto essere un client Web. Ecco perché ero confuso tra userId, oAuthToken e tokenId. Tutti e 3 sono diversi e più tardi appaiono solo creando un client Web sulla Console per gli sviluppatori di Google. –

+0

tks per l'upvote e scelta della risposta @Fido! :) –

+2

ha provato a farlo utilizzando l'API del client php di google per diverse ore, senza fortuna. Questo ha funzionato al primo tentativo! +1 –

Problemi correlati