function registrationPathsFigure(host) {
ensureStyles();
var steps = [
{ rank: '1', label: 'Pre-registered credentials', detail: 'client id already on file', deprecated: false },
{ rank: '2', label: 'Client ID Metadata Document', detail: 'AS advertises CIMD support', deprecated: false },
{ rank: '3', label: 'Dynamic Client Registration', detail: 'deprecated fallback via DCR', deprecated: true },
{ rank: '4', label: 'Ask the user', detail: 'no automated path available', deprecated: false }
];
var checklist = [
'client_id equals the URL',
'https scheme with a path',
'redirect_uris validated',
'kept keyed by issuer'
];
var rowH = 54;
var gapY = 16;
var top = 18;
var colX = 8;
var colW = 300;
var parts = [];
var i;
for (i = 0; i < steps.length; i++) {
var step = steps[i];
var y = top + i * (rowH + gapY);
var boxClass = step.deprecated ? 'l24bd' : 'l24b';
parts.push('');
parts.push('' + step.rank + '');
parts.push('' + step.label + '');
parts.push('' + step.detail + '');
if (i < steps.length - 1) {
var midX = colX + colW / 2;
var lineY1 = y + rowH;
var lineY2 = y + rowH + gapY - 4;
parts.push('');
parts.push('if unavailable');
}
}
var panelX = colX + colW + 18;
var panelW = 560 - panelX - 8;
var panelTop = top;
var panelH = steps.length * (rowH + gapY) - gapY;
parts.push('');
parts.push('a CIMD checked like this');
for (i = 0; i < checklist.length; i++) {
var cy = panelTop + 46 + i * 46;
parts.push('');
parts.push('' + checklist[i] + '');
}
var shell = document.createElement('div');
shell.className = 'mf-shell';
shell.innerHTML = [
'
Client Registration Paths priority order for a client an authorization server has never met
',
'
',
'',
'
',
'
A client tries each path in order and stops at the first one available: pre-registered credentials, then a Client ID Metadata Document if the authorization server advertises it, then Dynamic Client Registration as a deprecated fallback, then asking the user. Credentials from any path are kept keyed by the issuing authorization server and are never reused against a different one.