Open Authorization o più comunemente chiamato OAuth, è un protocollo di comunicazione open mediante il quale un’applicazione (o un servizio web) può gestire in modo sicuro l'accesso autorizzato ai dati sensibili. Il protocollo è compatibile con qualsiasi tipologia di applicazione: desktop, web e mobile.
Il protocollo OAuth è stato ideato da Blaine Cook nel 2006, mentre lavorava all'implementazione Twitter di OpenID, proponendosi come alternativa aperta ai molti protocolli proprietari già esistenti, come Google AuthSub, AOL OpenAuth, Yahoo BBAuth, Flickr API e tanti altri.
Dalla versione 1.0 (pubblicata nel 2007) OAuth, ha subìto diverse revisioni, recependo via via le RFC (Request For Comments) proposte dai vari esperti.
In generale le RFC (Request For Comments) sono un insieme di documenti di riferimento per la Comunità Internet che riportano informazioni o specifiche riguardanti nuove ricerche, innovazioni e metodologie dell'ambito informatico. Gli esperti possono pubblicare dei memorandum per esporre nuove idee da includere negli standard: seguendo questo iter è stata recentemente pubblicata la prima bozza del protocollo OAuth 2.0, la bozza è considerata stabile e la specifica finale è prevista entro la fine dell'anno. I vari principali erogatori di servizi, come ad esempio i social network, Facebook, Twitter, LinkedIn e tanti altri, hanno già annunciato il supporto anche prima che la prima bozza è stata pubblicata ufficialmente.
In questo articolo vediamo praticamente come avviene lo scambio di informazioni con questo protocollo.
L'interazione tra Service Provider e Consumer
Gli attori coinvolti sono 3:
- L’applicazione che richiede le informazioni, o Consumer (la nostra applicazione)
- Il servizio web che fornisce le informazioni, o Service Provider (ad esempio Facebook o Twitter)
- L’utente dell’applicazione iscritto sulla piattaforma del ServiceProvider
Per poter usufruire del servizio predisposto dal Service Provider, è necessario che il Consumer registri la sua applicazione. Con quest’operazione, il Service Provider fornisce al consumer le chiavi segrete (Consumer Key e Consumer Secret) che verranno utilizzate per lo scambio dei dati.
I principali step della comunicazione Consumer – Service Provider, sono i seguenti:
- Il Consumer redirige l’utente ad un URL predisposto dal Service Provider per la fase di autenticazione. Nella richiesta HTTP sono presenti le due chiavi ricevute in fase di registrazione (Consumer Key e Consumer Secret) e un’URL al quale l’utente deve essere rediretto al termine dell’operazione.
- L’utente accede alla pagina di autenticazione predisposta dal Service Provider dove inserisce le proprie credenziali di accesso, di solito username e password. Di solito la pagina di autenticazione lavora con il protocollo HTTPS il quale garantisce che i dati scambiati tra browser e web server sono codificati e non vengono trasferiti in chiaro come invece avviene nel protocollo HTTP. In questo caso la comunicazione risulta molto più sicura in caso di intercettazione.
- Il Service Provider verifica l'identità dell'utente. Se la verifica ha esito positivo, gli presenta il tipo di richiesta avanzata dal Consumer che l'utente deve approvare. Tale richiesta riguarda, di solito, la durata dell'accesso e la tipologia di informazioni che verranno rese disponibili al Consumer.
- Il Service Provider redirige l’utente all’URL inviata precedentemente dal Consumer (al punto 1). Nella richiesta HTTP è presente una stringa (detta token) che deve essere utilizzata successivamente dal Consumer per richiedere eventuali informazioni al Service Provider.
- L’utente accede nuovamente alla pagina del Consumer. Per l’utente meno esperto, il passaggio da un server ad un altro, è praticamente trasparente.
- Il Consumer invia una HTTP al Service Provider nella quale richiede, ad esempio, i dati anagrafici dell’utente corrente. Nella richiesta deve anche fornire il token precedentemente ricevuto. Le informazioni disponibili, dipendono dal Service Provider. Facebook, ad esempio, espone i dati anagrafici dell’utente oppure i suoi ultimi messaggi in bacheca; LinkedIn espone i collegamenti di un utente oppure le sue iscrizioni ai gruppi; Google fornisce moltissime informazioni come ad esempio l’elenco dei contatti in rubrica.
A differenza del protocollo Client/Server, il protocollo OAuth, come abbiamo potuto notare, non obbliga l’utente a fornire le credenziali di accesso al provider (il sistema esterno). L’utente viene rediretto sul server del Service Provider per l’autenticazione al sistema.
Nel prossimo articolo, analizzeremo qualche esempio pratico che ci permetterà di familiarizzare con il protocollo OAuth 2.0 e vedremo come integrare servizi come Facebook e Google nel nostro sito web.
Come creare una semplice applicazione facebook utilizzando OAuth.
Nella prima parte dell’articolo abbiamo presentato le linee teoriche del protocollo OAuth 2.0. In questa seconda parte, mostreremo qualche linea guida per sviluppare un esempio in java, così da mettere in evidenza la potenzialità e la semplicità di questo protocollo: in particolare vogliamo interagire con facebook per acquisire i dati dell’utente corrente.
Prima di tutto, è necessario registrare la nostra applicazione sul sito di Facebook collegandosi all’indirizzo
https://developers.facebook.com/apps.
Creazione della nuova applicazione
Clicchiamo su Crea Applicazione. Si aprirà una piccola finestra nella quale inseriamo il nome della nostra Applicazione. Selezioniamo anche la lingua e accettiamo le condizioni di utilizzo.
Nella seconda schermata occorre inserire alcune informazioni: la descrizione, la lingua e la categoria dell’applicazione, un eventuale logo, un’icona, eventuali url per l’informativa sulla privacy, ecc, ecc.
Registrazione dell'applicazione.
Nel menù di sinistra clicchiamo sulla voce Web, per abilitare le funzioni Web.
In questa schermata dobbiamo inserire l’indirizzo ed il dominio del nostro sito. Tali informazioni sono fondamentali in quanto Facebook effettuerà un controllo sull’url di redirezione. Se il prefisso dell’url non corrisponde, verrà rilanciata un’eccezione.
Poiché eseguiremo la nostra applicazione sulla nostra macchina locale, inseriamo come indirizzo
http://localhost:8080/FacebookIntegration
e come dominio localhost.
Salviamo le modifiche e annotiamoci l’ID dell’applicazione e la chiave segreta che utilizzeremo per invocare i metodi esposti dal servizio Facebook.
Per quanto riguarda la registrazione abbiamo terminato. Analizziamo, adesso, i passi necessari per ottenere le informazioni di cui abbiamo bisogno.
Interazione con facebook.
Per semplificare ulteriormente la procedura, utilizzeremo la libreria RestFB, disponibile a all’indirizzo http://code.google.com/p/restfb/
. Scarichiamo il jar e includiamolo nelle librerie della nostra web application. Nel momento in cui tale articolo viene redatto, la versione stabile è la 1.6.6.
autenticazione
La prima operazione, è richiedere all’utente della nostra applicazione, di autenticarsi al servizio ed autorizzarci ad accedere alle sue informazioni.
Per farlo dobbiamo redirigere l’utente sul sito di Facebook, precisamente all’indirizzo
https://www.facebook.com/dialog/oauth.
E' necessario accodare all’URL i seguenti parametri:
- client_id – corrisponde all’id della nostra applicazione precedentemente registrata sul sito Facebook.
- redirect_uri – l'url alla quale l'utente verrà rediretto dopo aver completato l’autenticazione ed aver autorizzato la nostra applicazione ad accedere alle informazioni riservate. Tale Url deve corrispondere all’Url impostata in fase di registrazione dell’applicazione.
- scope – moduli ai quali la nostra applicazione ha bisogno di accedere.
Naturalmente all’Url di redirezione dobbiamo predisporre una Servlet che intercetterà la chiamata.
Un esempio di chiamata è la seguente:
https://www.facebook.com/dialog/oauth?client_id=1234567890987654321asdfghjkl&redirect_uri=https://www.html.it/examples/facebookCallback&scope=email,read_stream
autorizzazione
Se tutto va a buon fine, Facebook redirige l'utente verso l'url che gli abbiamo passato nella richiesta.
Nell'url accoda il parametro code. Nella nostra Servlet, quindi, intercettiamo il parametro mediante la request.
String code = request.getParameter("code");
Il parametro code ci serve per richiedere a Facebook l'access token, necessario per invocare i servizi.
Se l'utente non concede l’autorizzazione, invece, non passerà il code, ma i seguenti parametri:
error_reason=user_denied
error=access_denied
error_description=The+user+denied+your+request
Mediante la presenza o meno del parametro code, quindi, possiamo capire se l’utente ha concesso o meno l’autorizzazione.
richiesta di access token a facebook
Il passo successivo consiste nel richiedere a Facebook l'access token. La chiamata è la seguente:
https://graph.facebook.com/oauth/access_token
Anche in questo caso, è necessario accodare all’URL i seguenti parametri obbligatori:
- client_id – corrisponde all’id della nostra applicazione precedentemente registrata sul sito Facebook.
- redirect_uri – l’url alla quale l’utente verrà rediretto dopo aver completato l’autenticazione ed aver autorizzato la nostra applicazione ad accedere alle informazioni riservate. Tale Url deve corrispondere all’Url impostata in fase di registrazione dell’applicazione.
- client_secret – corrispondende alla chiave segreta assegnata durante la fase di registrazione.
- code – il parametro appena ricevuto nell’url di risposta.
L'url di redirezione può corrispondere o meno all’url precedente.
Se la richiesta va a buon fine, Facebook redirige nuovamente verso l'utente verso l’url che gli abbiamo passato nella richiesta. Il contenuto di tale pagina contiene una stringa di testo nella quale troviamo l'access token ed il parametro expires, che ci permette di capire se il token è scaduto o meno.
Utilizzo della libreria RestFB.
Ora che abbiamo l'access token possiamo invocare I servizi Facebook utilizzando la libreria RestFB. Naturalmente, se il token è scaduto, occorre aggiornarlo effettuando nuovamente la chiamata precedente.
Prima di tutto creiamo un’istanza della classe FacebookClient
il cui costruttore riceve in ingresso la stringa contenente l'access token.
FacebookClient facebookClient = new DefaultFacebookClient(accessToken);
Per ottenere le informazioni relative all’utente corrente, invochiamo il metodo fetchObject
, passando come parametri, rispettivamente, il nome dell’utente e la classe corrispondente alle informazioni richieste. Poiché abbiamo bisogno delle informazioni dell’utente corrente utilizziamo la parola chiave me.
User user = facebookClient.fetchObject("me", User.class);
Così facendo otteniamo tutte le informazioni disponibili dell’utente. Per motivi di performance, possiamo anche limitare la chiamata ad un gruppo ridotto di informazioni.
User user = facebookClient.fetchObject("luca.santaniello", User.class, Parameter.with("fields", "id, name"));
In questo caso, gli unici parametri della classe User
che troveremo valorizzati saranno id
e name
. Tutti gli altri risulteranno null
.
È possibile anche ottenere l’elenco di tutti i contatti utilizzando la chiamata me/friends
che restituisce una lista di User.
Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class);
List<User> users = myFriends.getData();
for (int i = 0; i < users.size(); i++) {
User u = users.get(i);
...
}
Se invece vogliamo richiedere le informazioni di una Pagina, mappiamo il tutto con la classe Page
.
Page page = facebookClient.fetchObject("cocacola", Page.class);
Le informazioni alle quail possiamo accedere sono tantissime e risulta impossibile esaminarle tutte. Per ulteriori approfondimenti rimandiamo alla documentazione ufficiale della libreria.