OWASP et HTML5Mtl : Une introduction à JWT (JSON Web Tokens)
Avant de commencer : Un peu sur moi
Architecte de solutions Web
Dans le domaine depuis 1996
A travaillé pour CGI, Nurun, ACCEO, Tink
Mandats pour Molson, Loto-Québec, SAQ, Desjardins, Bombardier, Wizard of the Coast, Metro, CAE, Via Rail, AMT, Banque Nationale, AIMIA
Président Résoeuvra depuis 2015
Co-organisateur HTML5Mtl
Avant de commencer : Les références
Cette présentation reprend du contenu et suit plusieurs autres présentations et articles sur le Web.
Vous trouverez de plus amples informations en y accédant. Elles sont toutefois en anglais :-) Les voici :
Liste d'informations sur l'utilisateur / l'identité
Le nom, l'age, le courriel, la liste d'amis
Anatomie d'un JSON Web Token : payload, Registered Claims
Ils sont tous facultatifs.
iat:
Moment où le jeton a été émis.
iss:
L'émetteur du jeton
sub:
Le sujet du jeton
aud:
À qui s'adresse le jeton
exp:
Moment où le jeton expire. La date actuelle doit être avant ce moment.
nbf:
Moment où le jeton devient actif. Ne doit pas être accepté avant ce moment.
jti:
identifiant unique pour le jeton
Anatomie d'un JSON Web Token : la signature
La signature utilise un algorithme (ex: HMAC SHA256) où l'en-tête et le payload sont encodés, puis signés à partir d'un secret connu seulement de l'émetteur du jeton (serveur d'authentification) et du consommateur (l'application Web - côté serveur)
// Encodage de chaînes de catactères UTF-8
var encoder = new TextEncoder("utf-8");
// encode en arraybuffer de int8
var encodedText = encoder.encode("Bonjour le monde ééé");
// Décode en chaînes de catactères iso-8859-1
var decoder = new TextDecoder("iso-8859-1");
var decodedText = decoder.decode(encodedText);
function hashe() {
var encoder = new TextEncoder("utf-8");
// encode en arraybuffer de int8
var encodedText = encoder.encode(document.getElementById("el1").value);
window.crypto.subtle.digest(
{
name: "SHA-1"
}, encodedText
).then(function(hash){
var encodedHash = new Uint8Array(hash);
var decoder = new TextDecoder("utf-8");
var decodedText = decoder.decode(encodedHash);
document.getElementById("hashed").innerHTML = decodedText;
}).catch(function(err){
console.error(err);
});
}