Skip to content

Commit 7b20e49

Browse files
committed
Fixes #232: support getting public key signatures from x5c, x5u, jku,
jwk claims along with Auth0's own scheme.
1 parent c629b8f commit 7b20e49

File tree

1 file changed

+74
-42
lines changed

1 file changed

+74
-42
lines changed

js/app.js

Lines changed: 74 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -348,61 +348,93 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
348348

349349
}
350350

351-
function downloadPublicKeyIfPossible(token, callback) {
352-
var decoded = window.decodeJWT(token);
353-
if(decoded.error) {
354-
console.error(decoded.error);
355-
callback();
356-
return;
351+
function setKeyFromX5Claims(json, callback) {
352+
function setKeyFromX5c(x5c) {
353+
if(!x5c) {
354+
return;
355+
}
356+
357+
if(!(x5c instanceof Array)) {
358+
x5c = [ x5c ];
359+
}
360+
361+
var certChain = '';
362+
x5c.forEach(function(cert) {
363+
certChain += '-----BEGIN CERTIFICATE-----\n';
364+
certChain += cert + '\n';
365+
certChain += '-----END CERTIFICATE-----\n';
366+
});
367+
368+
var publicKeyElement = $('textarea[name="public-key"]');
369+
publicKeyElement.val(certChain);
370+
371+
var privateKeyElement = $('textarea[name="private-key"]');
372+
privateKeyElement.val('');
373+
374+
validateKey.apply($('textarea[name="public-key"]'));
357375
}
358376

359-
if(decoded.result.header.alg.indexOf('RS') !== 0 ||
360-
!decoded.result.header.kid ||
361-
!decoded.result.payload.iss) {
377+
if(json.x5c) {
378+
setKeyFromX5c(json.x5c);
379+
callback();
380+
} else if(json.x5u) {
381+
$.get(json.x5u, function(data) {
382+
setKeyFromX5c(data);
383+
callback();
384+
});
385+
} else {
362386
callback();
363-
return;
364387
}
388+
}
365389

366-
var url = decoded.result.payload.iss + '.well-known/jwks.json';
390+
function setKeyFromJwkKeySetUrl(kid, url, callback) {
367391
$.get(url, function(data) {
368-
try {
369-
if(!data.keys || !(data.keys instanceof Array)) {
370-
callback();
392+
if(!data || !data.keys || !(data.keys instanceof Array)) {
393+
callback();
394+
return;
395+
}
396+
397+
for(var i = 0; i < data.keys.length; ++i) {
398+
var jwk = data.keys[i];
399+
if(jwk.kid === kid) {
400+
setKeyFromX5Claims(jwk, callback);
371401
return;
372402
}
403+
}
373404

374-
for(var i = 0; i < data.keys.length; ++i) {
375-
if(data.keys[i].kid === decoded.result.header.kid) {
376-
var x5c = data.keys[i].x5c;
377-
if(!(x5c instanceof Array)) {
378-
x5c = [ x5c ];
379-
}
380-
381-
var certChain = '';
382-
x5c.forEach(function(cert) {
383-
certChain += '-----BEGIN CERTIFICATE-----\n';
384-
certChain += cert + '\n';
385-
certChain += '-----END CERTIFICATE-----\n';
386-
});
387-
388-
var publicKeyElement = $('textarea[name="public-key"]');
389-
publicKeyElement.val(certChain);
405+
callback();
406+
});
407+
}
390408

391-
var privateKeyElement = $('textarea[name="private-key"]');
392-
privateKeyElement.val('');
409+
function downloadPublicKeyIfPossible(token, callback) {
410+
var decoded = window.decodeJWT(token);
411+
if(decoded.error) {
412+
console.error(decoded.error);
413+
callback();
414+
return;
415+
}
393416

394-
break;
395-
}
396-
}
417+
var header = decoded.result.header;
418+
var payload = decoded.result.payload;
397419

398-
validateKey.apply($('textarea[name="public-key"]'));
420+
if(header.alg.indexOf('RS') !== 0) {
421+
callback();
422+
return;
423+
}
399424

400-
callback();
401-
} catch(e) {
402-
console.error(e);
403-
callback();
404-
}
405-
});
425+
if(header.x5c || header.x5u) {
426+
setKeyFromX5Claims(header, callback);
427+
} else if(header.jku) {
428+
setKeyFromJwkKeySetUrl(header.kid, header.jku, callback);
429+
} else if(header.jwk) {
430+
setKeyFromX5Claims(header.jwk, callback);
431+
} else if(header.kid && payload.iss) {
432+
//Auth0-specific scheme
433+
var url = payload.iss + '.well-known/jwks.json';
434+
setKeyFromJwkKeySetUrl(header.kid, url, callback);
435+
} else {
436+
callback();
437+
}
406438
}
407439

408440
function tokenEditorOnChangeListener(instance) {

0 commit comments

Comments
 (0)