2012-04-11 11 views
5

Ho letto la documentazione, esempi ed esercitazioni su come usare l'API di Google, ho già una mini-app che mostra le tue ultime attività e informazioni, ma io usa le sessioni per memorizzare il token.Google+ OAuth API archivia e recupera token dopo il primo accesso e autorizzazione

La mia domanda è, come posso archiviare e recuperare il token dal database in modo che quando un utente (chi è già registrato) fa clic su "accesso", può utilizzare immediatamente l'API senza autorizzazione ripetuta? Nota che ho usato l'esempio come punto di partenza per la mia mini-app.

Ecco un frammento di codice:

$client = new apiClient(); 
$client->setApplicationName(APP_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setRedirectUri(REDIRECT_URL); 
$client->setDeveloperKey(DEV_KEY); 

$plus = new apiPlusService($client); 
$google_userinfo = new apiOauth2Service($client); 

$message = ""; 

// In a real application this would be stored in a database, and not in the session! 
if (isset($_SESSION['token'])) 
    $client->setAccessToken($_SESSION['token']); 

$_SESSION['token'] = $client->getAccessToken(); 

if (isset($_GET['code'])) { 
    $client->authenticate(); 
    // In a real application this would be stored in a database, and not in the session! 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 
... 
//Somewhere here, I added a function that ties $_SESSION['token'] to the user's info. 
... 
<form action="" method="post" id="form1" name="form1"> 
    <fieldset> 
     <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;"> 
     <?php 
      $authUrl = $client->createAuthUrl(); 
      print "<p><a class='login' href='$authUrl'>Log me in!</a></p>"; 
     ?>         
     </div> 
    </fieldset> 
</form> 

Grazie mille per l'aiuto!

saluti,

John

risposta

9

Se vuoi Google di saltare la richiesta di autorizzazione per le persone che hanno già autorizzato l'applicazione, aggiungere questo codice nel tuo blocco di configurazione in alto:

$client->setAccessType("online"); 
$client-> setApprovalPrompt("auto"); 

C'è un problema con questa soluzione: non riceverai un token di aggiornamento quando completi la tua danza OAuth. Ciò significa che i tuoi utenti verranno reindirizzati al servizio di autenticazione di Google ogni volta che il loro token di accesso scade per recuperarne uno nuovo. Questo accadrà all'incirca ogni ora.

Informazione

Per impostazione predefinita la libreria client PHP è configurato per fornire offline access. Puoi vederlo nello source code. Quando questa modalità è abilitata, il flusso OAuth produrrà un valore refresh token che può essere utilizzato per richiedere nuovi token di accesso in base alle esigenze. Potresti anche non accorgertene. La libreria client di PHP si prende cura di gran parte di questo per te.

Questo token di aggiornamento ha un costo, però. Sei responsabile per la memorizzazione. Se lo perdi, il tuo utente deve autorizzare nuovamente la tua domanda perché tu ne venga rilasciato un altro. Il modo in cui lo memorizzi dipende molto dai dettagli della tua implementazione. I dati di sessione sono un modo ragionevole per farlo se puoi renderlo abbastanza durevole.

+0

Grazie per questa risposta! Questo è utile e posso usarlo come una soluzione temporanea. :) Ho già controllato. Ma sai o hai un link a qualsiasi post su come memorizzare i token che ottengo in $ client-> getAccessToken()? e li usa quando l'utente effettua il login? – user1239714

+0

@ user1239714: Non conosco un luogo specifico dove collegarti per un consiglio qui. Dipende interamente da come si mantiene il resto dei dati nella propria applicazione. Ad esempio, se stai scrivendo una tipica applicazione LAMP, potrebbe avere senso memorizzare il token di aggiornamento in MySql per il richiamo successivo. – mimming

+1

@JennyMurphy "Puoi vedere questo nel codice sorgente". Il link è rotto Potresti fornire un altro campione – knightrider

0

Questa è una vecchia domanda ma a me sembra che la risposta non fosse completa.

La risposta accettata funziona in modo che l'utente passi attraverso il server di Google Auth, ma non visualizzi la schermata di autenticazione. La domanda riguardava la memorizzazione del token e il suo utilizzo senza inviare l'utente al server di Google.

Quindi, se questo è quello che vuoi fare (e ti permetterà anche di accedere ai dati degli utenti anche quando non stanno attualmente utilizzando la tua app), tutto ciò che devi fare è chiedere un token di accesso che include un token di aggiornamento .

Si esegue questa operazione utilizzando il tipo di accesso offline (che, a proposito, non è più l'impostazione predefinita), ad esempio in php: $client->setAccessType("offline");.

Ricorda che il token di accesso che ricevi includerà il token di aggiornamento solo nella prima autorizzazione iniziale da parte dell'utente, quindi è quello che devi archiviare.

Quindi è possibile utilizzare quel token di accesso con il client, anche quando è scaduto, e il client si prenderà cura di aggiornarlo e ottenerne uno nuovo.

Speranza che aiuta, Amos

Problemi correlati