Résumé
Lorsqu'un utilisateur essaie de se connecter sur un site, son navigateur génère un objet de données appelé une assertion. Il s'agit essentiellement d'une adresse mail cryptée. Le navigateur envoie cette assertion au site, qui doit vérifier sa validité avant de connecter l'utilisateur.
Les assertions peuvent être vérifiées localement, ou en utilisant l'API disponible à l'adresse https://verifier.login.persona.org/verify
. Cette page décrit comment utiliser l'API.
Méthode
Envoyez une requête HTTP POST à l'adresse https://verifier.login.persona.org/verify
.
Paramètres
-
assertion
-
L'assertion est fournie par l'utilisateur. Disponible en tant que premier paramètre passé à la fonction
onlogin
dansnavigator.id.watch()
. -
audience
-
Le protocole, nom de domaine et port de votre site. Par exemple : "
https://example.com:443
".
Valeurs de retour
La requête retourne un objet JSON contenant une propriété status
qui peut valoir "okay" ou "failure". En fonction de ces valeurs, l'objet peut contenir des éléments additionels listés ci-dessous.
"okay"
L'assertion est valide.
Dans ce cas, l'objet JSON contient en plus les propriétés suivantes :
"email " |
L'adresse mail contenue dans l'assertion, pour permettre la connexion de l'utilisateur. |
"audience " |
La valeur audience contenue dans l'assertion. Doit être l'URL de votre propre site. |
"expires " |
La date à laquelle expire l'assertion, exprimée The date the assertion expires, exprimé comme une valeur primitive de l'objet Date qui est le nombre de secondes écoulées depuis le 1er Janvier 1970 00h00 GMT. |
"issuer " |
Le nom du fournisseur d'identité ayant fourni l'assertion. |
"failure"
L'assertion n'est pas valide.
Dans ce cas, l'objet JSON contient une propriété additionnelle :
"reason" |
Une chaîne de caractère expliquant pourquoi la validation de l'assertion a échoué |
Exemples
node.js
Cet exemple utilise un serveur node.js utilisant express.js
var express = require("express"), app = express.createServer(), https = require("https"), querystring = require("querystring"); /* ... */ // La variable audience doit correspondre à ce qu'affiche la barre d'adresse du navigateur, // ce qui inclut le protocole, le nom de domaine et le port var audience = "https://localhost:8888"; app.post("/authenticate", function(req, res) { var vreq = https.request({ host: "verifier.login.persona.org", path: "/verify", method: "POST" }, function(vres) { var body = ""; vres.on('data', function(chunk) { body+=chunk; } ) .on('end', function() { try { var verifierResp = JSON.parse(body); var valid = verifierResp && verifierResp.status === "okay"; var email = valid ? verifierResp.email : null; req.session.email = email; if (valid) { console.log("l'assertion a été vérifiée avec succès pour le mail :", email); res.json(email); } else { console.log("l'assertion n'a pas été validée pour la raison suivante :", verifierResp.reason); res.send(verifierResp.reason, 403); } } catch(e) { console.log("le verifier n'a pas renvoyé un objet JSON"); // bogus response from verifier! res.send("bogue de la part du verifier !", 403); } }); }); vreq.setHeader('Content-Type', 'application/x-www-form-urlencoded'); var data = querystring.stringify({ assertion: req.body.assertion, audience: audience }); vreq.setHeader('Content-Length', data.length); vreq.write(data); vreq.end(); console.log("vérification de l'assertion"); });
via Lloyd Hilaiel
PHP
$url = 'https://verifier.login.persona.org/verify'; $assert = filter_input( INPUT_POST, 'assertion', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH ); //utiliser la superglobale $_POST pour PHP < 5.2 et écrire votre propre filtre $params = 'assertion=' . urlencode($assert) . '&audience=' . urlencode('https://example.com:80'); $ch = curl_init(); $options = array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POST => 2, CURLOPT_POSTFIELDS => $params ); curl_setopt_array($ch, $options); $result = curl_exec($ch); curl_close($ch); echo $result;
Note: si vous envoyez les paramètres assertion et audience en tant qu'objet JSON, ils ne doivent pas être encodés. S'ils sont envoyés en tant que paramètres normaux d'une requête HTTP POST, comme dans l'exemple ci-dessus, ils doivent être encodés.