-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-client.ts
110 lines (98 loc) · 3.09 KB
/
test-client.ts
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
import { randomBytes } from 'crypto';
import { Request, RequestQuery, ResponseToolkit, Server } from 'hapi';
import { SparkOidcIssuerConfig, SparkPartnerServiceClientOptions, SessionManager, SparkPartnerServiceClient } from '../src';
class TestSessionManager implements SessionManager {
constructor(private request: Request, private h: ResponseToolkit) {}
public async getFromSession(key: string): Promise<string> {
const sdk_session = this.request.state.sdk_session || {};
return sdk_session[key];
}
public async storeInSession(key: string, value: string): Promise<void> {
const sdk_session = this.request.state.sdk_session || {};
sdk_session[key] = value;
this.h.state('sdk_session', sdk_session);
}
}
/* tslint:disable:max-classes-per-file */
export class TestClient {
private server: Server;
private oidc_client?: SparkPartnerServiceClient;
private oidc_client_options?: SparkPartnerServiceClientOptions;
constructor() {
this.server = new Server({ host: '0.0.0.0', port: 0 });
this.server.state('sdk_session', {
path: '/',
isSecure: false,
encoding: 'iron',
password: 'must-be-at-least-32-characters-long',
});
this.server.route([
{
method: 'GET',
path: '/',
options: {
handler: async (req, h) => {
const redirect_url = await this.oidc_client!.authorizationUrl(
randomBytes(24).toString('hex'),
new TestSessionManager(req, h),
);
return h.redirect(redirect_url);
},
},
},
{
method: 'GET',
path: '/callback',
options: {
handler: async (req, h) => {
return this.oidc_client!.authorizationCallback(req.query as RequestQuery, new TestSessionManager(req, h));
},
},
},
{
method: 'GET',
path: '/subject',
options: {
handler: async (req, h) => {
return this.oidc_client!.currentSubject(new TestSessionManager(req, h));
},
},
},
{
method: 'GET',
path: '/auth_header',
options: {
handler: async (req, h) => {
return this.oidc_client!.authorizationHeader(new TestSessionManager(req, h));
},
},
},
]);
}
public async start(issuer_config: SparkOidcIssuerConfig) {
await this.server.start();
this.oidc_client = new SparkPartnerServiceClient(this.getOidcClientOptions(), issuer_config);
}
public async stop() {
await this.server.stop();
}
public getOidcClientOptions() {
if (!this.oidc_client_options) {
this.oidc_client_options = {
client_id: randomBytes(12).toString('hex'),
client_secret: randomBytes(24).toString('hex'),
callback_url: `${this.getBaseUrl()}/callback`,
};
}
return this.oidc_client_options;
}
public getBaseUrl() {
return `http://localhost:${this.server.info.port}`;
}
public getSubjectUrl() {
return `${this.getBaseUrl()}/subject`;
}
public getAuthHeaderUrl() {
return `${this.getBaseUrl()}/auth_header`;
}
}