Le specifiche di OpenID che abbiamo introdotto in un precedente articolo potrebbero non essere la panacea per il fatto che pù di qualche provider usa degli Identifier per gli utenti, che non sono quanto di più leggibile possa esistere.La questione è molto semplice ed intuitiva: perchè non permettere di ottenere anche ulteriori informazioni oltre che il solo identificatore?
L’estensione Attribute Exchange serve proprio a questo, ad ottenere una serie di attributi ovvero delle unità di informazione sull’identità del soggetto autenticato.
La specifica in realtà prevederebbe anche la possibilità di impostare o aggiornare tali attributi da remoto, tuttavia più di qualche implementazione non lo permette per ragioni di sicurezza.
Se vi ricordate nell’ultimo post su OpenID eravamo riusciti ad ottenere solamente informazione sull’avvenuto login dell’utente, ripendiamo il codice precedente aggiungendo la possibilità di ottenere qualche informazione personale sempre tramite la libreria LightOpenID.
Quello che vogliamo ottenere è la possibilità di avere Nome e Cognome della persona che si sta loggando ed inoltre ottenere la sua e-mail; per fare questo dobbiamo impostare un array in cui specificheremo ciò.
Non tutti i provider però memorizzano gli stessi dati con la stesso tipo di identificatore di attributo, concentriamoci sui più noti Yahoo e Google:
- Yahoo: permette di ottenere l’email dell’utente tramite l’attributo “contact/email” e permette di avere nome e cognome con quello “namePerson”;
- Google: ugualmente permette di ottenere l’email con “contact/email” ma consente di avere nome e cognome rispettivamente con “namePerson/first” e “namePerson/last”‘.
Predisponiamo quindi gli array nei due diversi casi:
if ($provider == "google") //imposto il corretto url { $ax_attributes=array('namePerson/first','namePerson/last','contact/email'); $provider_url = "https://www.google.com/accounts/o8/id"; } elseif ($provider == "yahoo") { $provider_url = "http://www.yahoo.com/"; $ax_attributes=array('namePerson','contact/email'); }
ora è necessario dire a Light OpenID di richiedere ai provider questi attributi, impostando la proprietà “required” della classe LightOpenID :
$openid->required = $ax_attributes;
et voilà il gioco è fatto.
Ci basterà leggere gli attributi nel caso di buon esito: $attributes = $openid->getAttributes(); //preleviamo gli attributi $email = $attributes["contact/email"]; if (isset($attributes["namePerson/first"])) $user = $attributes["namePerson/first"] . " " . $attributes["namePerson/last"]; else $user = $attributes["namePerson"];
Abbiamo sviscerato ben bene i principi di base e non solo di OpenID, ora sta a voi sfruttarlo appieno, ripostiamo per completezza tutto il codice dell’esempio così che potete prendervi spunto
<!--?php require 'openid.php'; if (!isset($_REQUEST["action"])) { //Stampo la form ?--></pre> <form action="?action=login" method="post"><input id="provider_google" type="radio" name="provider" value="google" checked="checked" /> <label for="provider_google">Google</label> <input id="provider_yahoo" type="radio" name="provider" value="yahoo" /> <label for="provider_yahoo">Yahoo</label> <button>Log In</button></form> <pre> <!--?php } else { //Eseguo operazioni di login $openid = new LightOpenID('localhost'); //inizializzo la classe di comunicazione di LightOpenID if(!$openid----->mode) { $provider = $_REQUEST["provider"]; //prelevo il provider if ($provider == "google") //imposto il corretto url { $ax_attributes=array('namePerson/first','namePerson/last','contact/email'); $provider_url = "https://www.google.com/accounts/o8/id"; } elseif ($provider == "yahoo") { $provider_url = "http://www.yahoo.com/"; $ax_attributes=array('namePerson','contact/email'); } $openid->required = $ax_attributes; $openid->identity = $provider_url; header('Location: ' . $openid->authUrl()); //Rendirizzamento verso L'endpoint URL del Provider } else { if ( $openid->mode =="cancel" || !$openid->validate()) { //in caso di annullamento ?>L'utente non si è loggato correttamente <a href="?"> riprova </a><!--?php } else { $attributes = $openid----->getAttributes(); //preleviamo gli attributi $email = $attributes["contact/email"]; if (isset($attributes["namePerson/first"])) $user = $attributes["namePerson/first"] . " " . $attributes["namePerson/last"]; else $user = $attributes["namePerson"]; ?> L'utente<strong><!--?php echo $user; ?--></strong> ed email<strong></strong> ha effettuto l'accesso<!--?php <br ?--> } } }