La scorsa settimana abbiamo parlato di cos’è il protocollo OAuth 2.0, come funziona e quali sono le sue caratteristiche principali.
Oggi è Fabio Coppola, Responsabile Sviluppo Software del nostro Team, che ci spiega come implementare una classe client affinché le nostre applicazioni possano effettuare il login con uno dei servizi che supportano OAuth, come Facebook, Flickr, Google e molti altri.
1) Registriamo la nostra applicazione alle API
Iniziamo con la registrazione dell’app alle API del provider scelto (qui i link di riferimento per Google API e Facebook App Dashboard), ed otteniamo le nostre credenziali, tra cui:
- client_id: l’equivalente del nostro username
- client_secret: la nostra password
- redirect_uri: impostato da noi, è l’URI a cui verrà reindirizzato l’utente dopo aver concesso l’autorizzazione alla nostra applicazione
2) Richiediamo l’autorizzazione all’authorization server
Ogni resource server specifica per quali dati è possibile richiedere l’accesso, attraverso l’utilizzo del parametro “scope”.
Il primo passo da compiere è la richiesta di autorizzazione, quindi reindirizziamo l’utente verso l’authorization server con i seguenti parametri sulla query string:
- response_type=code (obbligatorio)
- client_id (obbligatorio)
- redirect_uri (opzionale): l’indirizzo a cui verrà inviata la risposta
- scope (opzionale): per specificare i dati di interesse
- state (raccomandato): un parametro che sarà presente inalterato nella risposta che ci permette di verificare l’autenticità della stessa
Effettuata la richiesta possiamo ricevere una risposta di errore oppure il codice di autorizzazione.
Analizziamo prima la risposta di errore:
- error (obbligatorio), una stringa che specifica il tipo di errore
- error_description (opzionale), descrizione dell’errore in forma estesa
- error_uri (opzionale), indirizzo di una pagina contenente informazioni addizionali per aiutare lo sviluppatore
Le specifiche impongono che questi parametri vengano definiti nel corpo della risposta HTTP e in formato JSON, ma alcuni provider usano la query component della redirect URI.
Nel caso in cui otteniamo l’autorizzazione, invece, avremo la seguente risposta con parametri sulla query component:
- code (obbligatorio), il codice di autorizzazione, utilizzabile una sola volta
- state (obbligatorio se presente nella richiesta), lo stesso valore della richiesta
3) Formuliamo la richiesta POST per ottenere un token
Ottenuto il codice di autorizzazione, lo utilizzeremo per richiedere un token, attraverso una richiesta POST con i seguenti parametri:
- client_id (obbligatorio)
- code (obbligatorio): quello ottenuto prima
- grant_type=authorization_code (obbligatorio): specifichiamo il metodo utilizzato per richiedere l’access token
- client_secret (opzionale)
- redirect_uri (opzionale)
Se la nostra richiesta va a buon fine otteniamo un access token e alcuni suoi dati opzionali.
Anche in questo caso, le specifiche indicano come formato di risposta un oggetto JSON ma qualche provider utilizza la query component.
4) Ultimo e tanto atteso passaggio, l’accesso alla risorsa
Effettuiamo una chiamata POST verso il resource server, settiamo l’header HTTP “Authorization: Bearer” concatenandogli l’access token, ottenendo infine una risposta con i dati richiesti in formato JSON.
Dobbiamo ricordarci che alcuni provider utilizzano dei parametri aggiuntivi nei vari passaggi. Ad esempio Google, nella richiesta per il codice di autorizzazione, richiede l’uso dei parametri:
- access_type (default online), uno tra “online” o “offline”
- approval_prompt (default auto), uno tra “auto” o “force”
Facebook e Google login, due esempi diretti
Vediamo ora due esempi pratici, uno riguardante Facebook e l’altro Google, i veri punti di riferimento per chi vive la Rete.
- Facebook e un esempio di utilizzo, assumendo che la redirect_uri punti sempre a questa funzione:
function login() {
require_once ‘OAuth2.php’;
$oauth = new OAuth2();
$oauth->setClientId(‘---your-client-id---’)
->setClientSecret(‘---your-client-secret---’)
->setRedirectUri(‘---this-same-function--’)
->setScope(‘email’)
->setAccessUrl(‘https://graph.facebook.com/me’)
->setAuthUrl(‘https://www.facebook.com/dialog/oauth’)
->setTokenUrl(‘https://graph.facebook.com/oauth/access_token’);
if ($errors = $oauth->handleErrorResponse()) {
echo ‘Error’;
return;
}
try {
$userData = $oauth->authenticate();
print_r($userData);
}
catch (Exception $e) {
echo $e->getMessage();
}
}
- Altro esempio di utilizzo per Google, attraverso un array di configurazione oppure un oggetto Zend_Config per chi utilizza Zend Framework, assumendo che la redirect_uri punti sempre a questa funzione:
function login() {
$config = array(
‘client_id’ => ‘---your-client-id---’,
‘client_secret’ => ‘---your-client-secret---’,
‘redirect_uri’ => ‘---this-same-function---’,
‘scope’ => ‘https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email’,
‘access_url’ => ‘https://www.googleapis.com/oauth2/v1/userinfo’,
‘auth_url’ => ‘https://accounts.google.com/o/oauth2/auth’,
‘token_url’ => ‘https://accounts.google.com/o/oauth2/token’
);
require_once ‘OAuth2Google.php’;
$oauth = new OAuth2Google($config);
if ($errors = $oauth->handleErrorResponse()) {
echo ‘Error’;
return;
}
try {
$userData = $oauth->authenticate();
print_r($userData);
}
catch (Exception $e) {
echo $e->getMessage();
}
}
Pronti? Buon lavoro con OAuth
Anche se molto tecnico, questo post può essere utile a chi cerca un approccio guidato alla materia. Ci piacerebbe sapere cosa ne pensate, avete da aggiungere qualche consiglio?
E per tutti gli altri, che curiosamente ci leggono… ricordate che non è mai troppo tardi per iniziare!









© 2009 Dexma srl. All rights reserved.