-
-
Notifications
You must be signed in to change notification settings - Fork 209
Expand file tree
/
Copy pathmock-oidc-server.mjs
More file actions
125 lines (111 loc) · 4.18 KB
/
mock-oidc-server.mjs
File metadata and controls
125 lines (111 loc) · 4.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import http from 'node:http';
const host = process.env.NEO_TEST_OIDC_HOST || '0.0.0.0';
const port = Number(process.env.NEO_TEST_OIDC_PORT || 4000);
const validAudiences = [
'http://127.0.0.1:13002',
'http://127.0.0.1:13003',
'http://127.0.0.1:13090'
];
/**
* @summary Reads a form-urlencoded request body.
* Reads a form-urlencoded request body.
* @param {http.IncomingMessage} request The incoming HTTP request.
* @returns {Promise<URLSearchParams>} The parsed payload.
*/
function readFormUrlEncoded(request) {
return new Promise((resolve, reject) => {
let body = '';
request.on('data', chunk => body += chunk);
request.on('error', reject);
request.on('end', () => {
try {
resolve(new URLSearchParams(body));
} catch (error) {
reject(error);
}
});
});
}
/**
* @summary Sends a JSON response.
* Sends a JSON response.
* @param {http.ServerResponse} response The outgoing HTTP response.
* @param {Number} statusCode The HTTP status code.
* @param {Object} payload The JSON payload.
* @returns {void}
*/
function sendJson(response, statusCode, payload) {
response.writeHead(statusCode, {'content-type': 'application/json'});
response.end(JSON.stringify(payload));
}
const server = http.createServer(async (request, response) => {
if (request.method === 'GET' && request.url === '/health') {
sendJson(response, 200, {status: 'ok'});
return;
}
if (request.method === 'GET' && request.url === '/.well-known/openid-configuration') {
const reqHost = request.headers.host || `127.0.0.1:${port}`;
sendJson(response, 200, {
issuer : `http://${reqHost}`,
introspection_endpoint: `http://${reqHost}/introspect`
});
return;
}
if (request.method === 'POST' && request.url === '/introspect') {
try {
const params = await readFormUrlEncoded(request);
const token = params.get('token');
if (token === 'valid-test-token') {
sendJson(response, 200, {
active : true,
aud : validAudiences,
exp : Math.floor(Date.now() / 1000) + 3600,
preferred_username: 'neo-test-oidc-user',
client_id : params.get('client_id')
});
return;
}
if (token === 'valid-test-token-bob') {
sendJson(response, 200, {
active : true,
aud : validAudiences,
exp : Math.floor(Date.now() / 1000) + 3600,
preferred_username: 'neo-test-oidc-bob',
client_id : params.get('client_id')
});
return;
}
if (token === 'valid-test-token-no-username') {
sendJson(response, 200, {
active : true,
aud : validAudiences,
exp : Math.floor(Date.now() / 1000) + 3600,
sub : 'neo-test-oidc-sub',
client_id: params.get('client_id')
});
return;
}
if (token === 'wrong-audience-token') {
sendJson(response, 200, {
active : true,
aud : ['http://evil-server:13002'],
exp : Math.floor(Date.now() / 1000) + 3600,
preferred_username: 'neo-test-oidc-user',
client_id : params.get('client_id')
});
return;
}
// Fallback: invalid token
sendJson(response, 200, {
active: false
});
} catch (error) {
sendJson(response, 400, {error: error.message});
}
return;
}
sendJson(response, 404, {error: 'Not found'});
});
server.listen(port, host, () => {
console.log(`[mock-oidc-server] listening on ${host}:${port}`);
});