In un precedente articolo abbiamo introdotto OpenID, il fantastico protocollo di autenticazione che è diventato uno standard di fatto, tanto da essere utilizzato da grandi corporation quali Google, Yahoo, ed altri. Potreste dunque avere già a disposizione un Identifier presso uno dei OpenID provider elencati nel link precedente.
Oggi vogliamo mettere un po’ le mani in pasta lasciando a casa tutta la teoria, a patto che abbiate una minima conoscenza di PHP.
Utilizzeremo la libreria PHP LightOpenID disponibile a questo indirizzo, scarichiamola e decomprimiamola in una qualsiasi directory. Preleviamo il file openid.php che è quello contenente la libreria e copiamolo nella directory di lavoro del nostro webserver ( nel mio caso /var/www/openid ).
Ora creiamo un nuovo file php denominato index.php sempre nella nostra directory di lavoro e inseriamo al suo interno il seguente contenuto:
require ‘openid.php’;
if (!isset($_REQUEST["action"])) { //Stampo la form } else { //Eseguo operazioni di login }
Stiamo dicendo a PHP di includere la libreria che gestisce la comunicazione con il provider, e definiamo una variabile via url (“action”) che ci consentirà di discriminare tra la stampa della form grafica tramite la quale scateneremo il login nel caso si sta visitando la pagina per la prima volta e la parte della logica negli altri casi.
Vi ricorderete del fatto che ciascun soggetto ha a disposizione un proprio Identifier tramite il quale il protocollo può scoprire il punto di accesso del Provier, tuttavia spesso e volentieri l’Identifier è una stringa abbastanza complessa da ricordare ragion per cui difficilmente un utente la può ricordare a memoria. In questo tutorial utilizzeremo un approccio diverso, piuttosto che fornire un approccio universale ci concentreremo solamente su due OpenID provider: Yahoo e Google, per i quali conosciamo già i punti di accesso.
Iniziamo a creare la form tramite la quale faremo scegliere all’utente con quale Provider accedere, inserendo due selettori alternativi ed un pulsante che impostera la variabile action con il valore login:
if (!isset($_REQUEST["action"])) { //Stampo la form?></pre> <form action="?action=login" method="post"> <input id="provider_google" type="radio" name="provider" value="Google" /> <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> }
A questo punto siamo pronti per catturare l’azione nel secondo blocco di codice:
- Inizializziamo la classe di comunicazione di OpenID
$openid = new LightOpenID('localhost');
- controlliamo se abbiamo già effettuato una richiesta al provider o meno
if(!$openid->mode) { {
- nel caso in cui non è stata effettuata la richiesta:
- controlliamo quale provider ha scelto l’utente e imposteremo l’indirizzo corretto del provider selezionato
$provider = $_REQUEST["provider"]; echo $provider; if ($provider == "google") $provider_url = "https://www.google.com/accounts/o8/id"; elseif ($provider == "yahoo") $provider_url = "http://www.yahoo.com/";
- inizieremo la procedura di autenticazione reindirizzando l’utente verso la schermata di login del provider
$openid->identity = $provider_url; header('Location: ' . $openid->authUrl()); //Rendirizzamento verso L'endpoint URL del Provider
- controlliamo quale provider ha scelto l’utente e imposteremo l’indirizzo corretto del provider selezionato
- nel caso in cui è stata effettuata la richiesta:
- controlliamo se l’utente ha cancellato la richiesta di autenticazione o se il provider ha dato esito negativo
if ( $openid->mode =="cancel" || !$openid->validate()) { //in caso di annullamento o credenziali invalide ?>L'utente non si è loggato correttamente <a href="?"> riprova </a>< ?php }
- se invece l’autenticazione è andata a buon fine allora visualizzeremo l’identificatore dell’utente
else { ?>L'utente con identificatore <strong>< ?php echo $openid->identity; ?></strong> ha effettuto l'accesso < ?php }
- controlliamo se l’utente ha cancellato la richiesta di autenticazione o se il provider ha dato esito negativo
Che vi dicevo dell’immemorizzabilità dell’itendificatore? Alla prossima puntata nel viaggio attraverso OpenID.
PS. Eccovi il codice completo:
<?php require 'openid.php'; if (!isset($_REQUEST["action"])) { //Stampo la form?> <html><body> <form action="?action=login" method="post"> <input id="provider_google" type="radio" checked name="provider" value="google" /><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> </body></html> <?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 echo $provider; if ($provider == "google") //imposto il corretto url $provider_url = "https://www.google.com/accounts/o8/id"; elseif ($provider == "yahoo") $provider_url = "http://www.yahoo.com/"; $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 ?> <html><body>L'utente non si è loggato correttamente <a href="?" > riprova </a></body></html><?php } else { ?> <html><body>L'utente con identificatore <strong><?php echo $openid->identity; ?></strong> ha effettuto l'accesso</body></html><?php } } } ?>
Pingback: OpenID: estensioni per scambio di informazioni - prometheusproject