@nsshunt/stsoauth2plugin 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/stsoauth2plugin.mjs +1525 -0
  2. package/dist/stsoauth2plugin.mjs.map +1 -0
  3. package/dist/stsoauth2plugin.umd.js +2 -0
  4. package/dist/stsoauth2plugin.umd.js.map +1 -0
  5. package/package.json +24 -23
  6. package/types/Utils/CryptoUtils.d.ts +1 -1
  7. package/types/Utils/CryptoUtils.d.ts.map +1 -1
  8. package/types/Utils/QueryParams.d.ts +5 -4
  9. package/types/Utils/QueryParams.d.ts.map +1 -1
  10. package/types/index.d.ts.map +1 -1
  11. package/types/stores/stsoauth2store.d.ts +1 -1
  12. package/types/stores/stsoauth2store.d.ts.map +1 -1
  13. package/types/stsoauth2manager.d.ts.map +1 -1
  14. package/types/stsoauth2types.d.ts +1 -1
  15. package/types/stsoauth2types.d.ts.map +1 -1
  16. package/types/stsoauth2worker.d.ts.map +1 -1
  17. package/dist/Utils/CryptoUtils.js +0 -58
  18. package/dist/Utils/CryptoUtils.js.map +0 -1
  19. package/dist/Utils/QueryParams.js +0 -49
  20. package/dist/Utils/QueryParams.js.map +0 -1
  21. package/dist/index.js +0 -44
  22. package/dist/index.js.map +0 -1
  23. package/dist/index.test.js +0 -8
  24. package/dist/index.test.js.map +0 -1
  25. package/dist/stores/stsoauth2store.js +0 -57
  26. package/dist/stores/stsoauth2store.js.map +0 -1
  27. package/dist/stores/testStore.js +0 -32
  28. package/dist/stores/testStore.js.map +0 -1
  29. package/dist/stsPluginKeys.js +0 -6
  30. package/dist/stsPluginKeys.js.map +0 -1
  31. package/dist/stsoauth2launcher.js +0 -10
  32. package/dist/stsoauth2launcher.js.map +0 -1
  33. package/dist/stsoauth2manager.js +0 -455
  34. package/dist/stsoauth2manager.js.map +0 -1
  35. package/dist/stsoauth2types.js +0 -38
  36. package/dist/stsoauth2types.js.map +0 -1
  37. package/dist/stsoauth2worker.js +0 -611
  38. package/dist/stsoauth2worker.js.map +0 -1
@@ -1,611 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.STSOAuth2Worker = void 0;
7
- const debug_1 = __importDefault(require("debug"));
8
- require("colors");
9
- const detect_node_1 = __importDefault(require("detect-node"));
10
- //import 'colors'
11
- const axios_1 = __importDefault(require("axios"));
12
- const stsutils_1 = require("@nsshunt/stsutils");
13
- const CryptoUtils_1 = __importDefault(require("./Utils/CryptoUtils"));
14
- const QueryParams_1 = __importDefault(require("./Utils/QueryParams"));
15
- const jwt_decode_1 = __importDefault(require("jwt-decode"));
16
- //import { IStsStorage, ClientStorageType, ClientStorageFactory } from './stsStorage'
17
- const stsvueutils_1 = require("@nsshunt/stsvueutils");
18
- const http_status_codes_1 = require("http-status-codes");
19
- const stsoauth2types_1 = require("./stsoauth2types");
20
- const stsinstrumentation_1 = require("@nsshunt/stsinstrumentation");
21
- const https_1 = __importDefault(require("https"));
22
- let debug = null;
23
- if (detect_node_1.default) {
24
- debug = (0, debug_1.default)(`proc:${process.pid}:stsoauth2worker.ts`);
25
- }
26
- else {
27
- debug = (0, debug_1.default)(`proc:0:stsoauth2worker.ts`);
28
- }
29
- // STS Client SDK for SPAs
30
- class STSOAuth2Worker {
31
- //#storageManager = null;
32
- #clientSessionStore = null; // In memory tokens while the client is logged in
33
- #cUtils = new CryptoUtils_1.default();
34
- #qParams = new QueryParams_1.default();
35
- #STORAGE_SESSION_KEY = 'session.stsmda.com.au';
36
- #aic = null;
37
- #oauthWorkerPort = null;
38
- #options = null;
39
- #httpsAgent = null;
40
- constructor(workerPort, options) {
41
- debug_1.default.enable('proc:*'); //@@
42
- this.#options = options;
43
- debug(`STSOAuth2Worker:constructor:#options: [${JSON.stringify(this.#options)}]`);
44
- // In memory storage for OAuth2 tokens for our valid session
45
- this.#clientSessionStore = new stsvueutils_1.ClientStorageFactory({ clientStorageType: stsvueutils_1.ClientStorageType.MEMORY_STORAGE, usePrefix: false }).GetStorage();
46
- //@@ needs to be sent the instrument manager controller port
47
- //@@this.#aic = app.config.globalProperties.$sts.aic.PrimaryPublishInstrumentController;
48
- //this.#handleAuthenticateEvent = handleAuthenticateEvent;
49
- this.#oauthWorkerPort = workerPort;
50
- debug(`STSOAuth2Worker:constructor:#oauthWorkerPort: [${JSON.stringify(this.#oauthWorkerPort)}]`);
51
- if (detect_node_1.default) {
52
- this.#httpsAgent = new https_1.default.Agent({
53
- keepAlive: this.#options.agentOptions.keepAlive,
54
- maxSockets: this.#options.agentOptions.maxSockets,
55
- maxTotalSockets: this.#options.agentOptions.maxTotalSockets,
56
- maxFreeSockets: this.#options.agentOptions.maxFreeSockets,
57
- timeout: this.#options.timeout,
58
- rejectUnauthorized: this.#options.agentOptions.rejectUnauthorized // Allows self-signed certificates if non-production
59
- });
60
- }
61
- this.SetupListener();
62
- this.#UpdateInstrument(stsinstrumentation_1.Gauge.LOGGER, {
63
- LogMessage: `STSOauth2 Plugin - Successfully Loaded`
64
- });
65
- /*
66
- setInterval(() => { // Used for testing purposes only.
67
- this.#UpdateInstrument(Gauge.LOGGER, {
68
- LogMessage: `--> [${Date.now().toString()}] <--`
69
- } as InstrumentLogTelemetry);
70
- }, 1000);
71
- */
72
- }
73
- // Attempt to restore a previous session using the STSBroker
74
- /*
75
- { parameterType: OAuth2ParameterType.CLIENT_ID, errorType: authErrorType.CLIENT_ID_MISMATCH },
76
- { parameterType: OAuth2ParameterType.SCOPE, errorType: authErrorType.SCOPE_MISMATCH }
77
- { parameterType: OAuth2ParameterType.REDIRECT_URI, errorType: authErrorType.REDIRECT_URI_MISMATCH },
78
- { parameterType: OAuth2ParameterType.AUDIENCE, errorType: authErrorType.SCOPE_MISMATCH }
79
-
80
- Successful Response
81
- {
82
- "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
83
- "token_type": "Bearer",
84
- "expires_in": 3599,
85
- "scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
86
- "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
87
- "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD...",
88
- }
89
-
90
- Error Response
91
- {
92
- "error": "invalid_scope",
93
- "error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 255d1aef-8c98-452f-ac51-23d051240864\r\nCorrelation ID: fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7\r\nTimestamp: 2016-01-09 02:02:12Z",
94
- "error_codes": [
95
- 70011
96
- ],
97
- "timestamp": "2016-01-09 02:02:12Z",
98
- }
99
-
100
- */
101
- #HandleAuthenticateEvent = (id_token) => {
102
- const message = {
103
- messageId: -1,
104
- command: stsoauth2types_1.IOauth2ListenerCommand.AUTHENTICATE_EVENT
105
- };
106
- this.#ProcessCommand(message, id_token);
107
- };
108
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
- #HandleErrorEvent = (error) => {
110
- const message = {
111
- messageId: -1,
112
- command: stsoauth2types_1.IOauth2ListenerCommand.ERROR
113
- };
114
- this.#ProcessCommand(message, error);
115
- };
116
- #LogMessage = (messageToSend) => {
117
- const message = {
118
- messageId: -1,
119
- command: stsoauth2types_1.IOauth2ListenerCommand.LOG
120
- };
121
- this.#ProcessCommand(message, messageToSend);
122
- };
123
- #GetAccessToken = () => {
124
- const sessionData = this.#clientSessionStore.get(this.#STORAGE_SESSION_KEY);
125
- if (sessionData) {
126
- const tokens = sessionData.tokenResponse;
127
- return tokens.access_token;
128
- }
129
- else {
130
- return null;
131
- }
132
- };
133
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
- #GetCookies = () => {
135
- if (detect_node_1.default) {
136
- const sessionData = this.#clientSessionStore.get(this.#STORAGE_SESSION_KEY);
137
- if (sessionData) {
138
- return sessionData.brokerCookie;
139
- }
140
- else {
141
- return null;
142
- }
143
- }
144
- else {
145
- return null;
146
- }
147
- };
148
- #UpdateInstrument = (instrumentName, telemetry) => {
149
- const message = {
150
- messageId: -1,
151
- command: stsoauth2types_1.IOauth2ListenerCommand.UPDATE_INSTRUMENT
152
- };
153
- this.#ProcessCommand(message, {
154
- instrumentName,
155
- telemetry
156
- });
157
- };
158
- SetupListener = () => {
159
- this.#oauthWorkerPort.onmessage = async (data) => {
160
- const auth2ListenerMessage = data.data;
161
- debug(`STSOAuth2Worker:SetupListener:onmessage: [${auth2ListenerMessage.command}]`);
162
- switch (auth2ListenerMessage.command) {
163
- case stsoauth2types_1.IOauth2ListenerCommand.RESTORE_SESSION:
164
- this.#ProcessCommand(auth2ListenerMessage, await this.#RestoreSession());
165
- break;
166
- case stsoauth2types_1.IOauth2ListenerCommand.AUTHORIZE:
167
- this.#ProcessCommand(auth2ListenerMessage, await this.#Authorize());
168
- break;
169
- case stsoauth2types_1.IOauth2ListenerCommand.HANDLE_REDIRECT:
170
- this.#ProcessCommand(auth2ListenerMessage, await this.#HandleRedirect(auth2ListenerMessage.payload));
171
- break;
172
- case stsoauth2types_1.IOauth2ListenerCommand.LOGOUT:
173
- this.#ProcessCommand(auth2ListenerMessage, await this.#Logout());
174
- break;
175
- //@@ Need a way of keeping this out of the main thread - should always stay within the worker
176
- case stsoauth2types_1.IOauth2ListenerCommand.ACCESS_TOKEN:
177
- this.#ProcessCommand(auth2ListenerMessage, await this.#GetAccessToken());
178
- break;
179
- case stsoauth2types_1.IOauth2ListenerCommand.EXECUTE_REFRESH_TOKEN:
180
- this.#ProcessCommand(auth2ListenerMessage, await this.#RefreshToken());
181
- break;
182
- case stsoauth2types_1.IOauth2ListenerCommand.COOKIES:
183
- this.#ProcessCommand(auth2ListenerMessage, await this.#GetCookies());
184
- break;
185
- default:
186
- throw new Error(`Command: [${auth2ListenerMessage.command}'] not found.`);
187
- }
188
- };
189
- };
190
- /*
191
- #GetIDToken = async(): Promise<string> => {
192
- return '-- ID Token --';
193
- }
194
- */
195
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
196
- #ProcessCommand = async (auth2ListenerMessage, response) => {
197
- const messageResponse = {
198
- messageId: auth2ListenerMessage.messageId,
199
- command: auth2ListenerMessage.command,
200
- payload: response
201
- };
202
- this.#oauthWorkerPort.postMessage(messageResponse);
203
- };
204
- #RestoreSession = async () => {
205
- //@@ attempt to get from client storage first
206
- let restoredSessionData = null;
207
- const sessionData = this.#clientSessionStore.get(this.#STORAGE_SESSION_KEY);
208
- if (sessionData) {
209
- restoredSessionData = sessionData.tokenResponse;
210
- console.log('Session restored from client storage.');
211
- if (this.#aic) {
212
- this.#aic.UpdateInstrument('m', { LogMessage: 'Session restored from client storage.' });
213
- }
214
- this.#LogMessage('Session restored from client storage.');
215
- }
216
- else {
217
- const url = `${this.#options.brokerendpoint}:${this.#options.brokerport}${this.#options.brokerapiroot}/session`;
218
- console.log('RestoreSession');
219
- console.log(url);
220
- if (this.#aic) {
221
- this.#aic.UpdateInstrument('m', { LogMessage: 'RestoreSession' });
222
- this.#aic.UpdateInstrument('m', { LogMessage: url });
223
- }
224
- this.#LogMessage('RestoreSession.');
225
- this.#LogMessage(url);
226
- try {
227
- const rConfig = {
228
- method: "post",
229
- url: url,
230
- data: {
231
- [stsutils_1.OAuth2ParameterType.CLIENT_ID]: this.#options.client_id,
232
- [stsutils_1.OAuth2ParameterType.SCOPE]: this.#options.scope,
233
- [stsutils_1.OAuth2ParameterType.REDIRECT_URI]: this.#options.redirect_uri,
234
- [stsutils_1.OAuth2ParameterType.AUDIENCE]: this.#options.audience
235
- },
236
- withCredentials: true,
237
- timeout: this.#options.timeout
238
- };
239
- debug(`#RestoreSession:session request detail: [${JSON.stringify(rConfig)}]`.magenta);
240
- if (detect_node_1.default) {
241
- rConfig.httpsAgent = this.#httpsAgent;
242
- }
243
- const retVal = await (0, axios_1.default)(rConfig);
244
- if (retVal.data.status === http_status_codes_1.StatusCodes.OK) {
245
- restoredSessionData = retVal.data.detail;
246
- const newSessionData = {
247
- tokenResponse: restoredSessionData
248
- };
249
- if (detect_node_1.default) {
250
- newSessionData.brokerCookie = retVal.headers['set-cookie'];
251
- }
252
- this.#clientSessionStore.set(this.#STORAGE_SESSION_KEY, newSessionData);
253
- console.log('Session restored from server side cookie.');
254
- }
255
- else {
256
- //@@ handle error better
257
- console.log('Could not restore previous session:-');
258
- console.log(JSON.stringify(retVal.data));
259
- }
260
- }
261
- catch (error) {
262
- //@@ handle error better
263
- console.log('Could not restore previous session (error state):-');
264
- console.log(error);
265
- console.log(JSON.stringify(error));
266
- }
267
- }
268
- //@@ must only use in-memory for this ...
269
- if (restoredSessionData !== null) {
270
- this.#HandleAuthenticateEvent(restoredSessionData.id_token);
271
- console.log('Refreshing tokens ...');
272
- return await this.#RefreshToken();
273
- }
274
- else {
275
- this.#HandleAuthenticateEvent(null);
276
- return false;
277
- }
278
- };
279
- #Authorize = async () => {
280
- console.log('Authorize ...');
281
- /* MS Example
282
- --------------
283
- https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
284
- client_id=6731de76-14a6-49ae-97bc-6eba6914391e
285
- &response_type=code
286
- &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
287
- &response_mode=query
288
- &scope=offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read%20api%3A%2F%2F
289
- &state=12345
290
- &code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
291
- &code_challenge_method=S256
292
-
293
- Successful Response
294
-
295
- GET http://localhost?
296
- code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
297
- &state=12345
298
-
299
- Error Response
300
- GET http://localhost?
301
- error=access_denied
302
- &error_description=the+user+canceled+the+authentication
303
-
304
- << Hybrid Flow >>
305
-
306
- https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
307
- client_id=6731de76-14a6-49ae-97bc-6eba6914391e
308
- &response_type=code%20id_token
309
- &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
310
- &response_mode=fragment
311
- &scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
312
- &state=12345
313
- &nonce=abcde
314
- &code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
315
- &code_challenge_method=S256
316
-
317
- Successful Response
318
-
319
- GET https://login.microsoftonline.com/common/oauth2/nativeclient#
320
- code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
321
- &id_token=eYj...
322
- &state=12345
323
-
324
- Notes:
325
- The nonce is included as a claim inside the returned id_token
326
- Ref: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
327
- */
328
- const client_id = this.#options.client_id;
329
- const nonce = this.#cUtils.CreateRandomString();
330
- const response_type = [stsoauth2types_1.AuthorizeOptionsResponseType.CODE];
331
- const redirect_uri = this.#options.redirect_uri;
332
- const response_mode = stsoauth2types_1.AuthorizeOptionsResponseMode.QUERY;
333
- const scope = this.#options.scope;
334
- const state = this.#cUtils.CreateRandomString();
335
- const code_verifier = this.#cUtils.CreateRandomString();
336
- const code_challenge = await this.#cUtils.DigestMessage(code_verifier);
337
- const code_challenge_method = 'S256';
338
- //let audience = this.#options.AUDIENCE;
339
- const authorizeOptions = {
340
- client_id,
341
- nonce,
342
- response_type,
343
- redirect_uri,
344
- response_mode,
345
- scope,
346
- state,
347
- code_challenge,
348
- code_challenge_method
349
- };
350
- const authorizeOptionsClientCopy = { ...authorizeOptions };
351
- const url = `${this.#options.authorizeendpoint}:${this.#options.authorizeport}${this.#options.authorizeapiroot}${this.#options.authorizeapi}?${this.#qParams.CreateQueryParams(authorizeOptions)}`;
352
- console.log(url);
353
- // Now add the code_verifier to the transaction data
354
- authorizeOptions.code_verifier = code_verifier; //@@ Is this is the only thing required across the transaction ?
355
- console.log(`Authorize:authorizeOptions: [${JSON.stringify(authorizeOptions)}]`);
356
- return {
357
- url,
358
- authorizeOptions,
359
- authorizeOptionsClientCopy
360
- };
361
- //window.location.assign(url);
362
- //@@ this may need to be a message back to the plugin to re-direct
363
- //window.location.replace(url);
364
- };
365
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
366
- #HandleRedirect = async (payload) => {
367
- const queryVars = payload.queryVars;
368
- const authorizeOptions = payload.authorizeOptions;
369
- debug(`#HandleRedirect: HandleRedirect`.magenta);
370
- // We have been re-direct back here from the /authorize end-point
371
- debug(`#HandleRedirect: HandleRedirect:Query Vars: [${JSON.stringify(queryVars)}]`.magenta);
372
- if (queryVars[stsutils_1.OAuth2ParameterType.CODE]) {
373
- const response = queryVars;
374
- console.log(`authorizeOptions from transaction state: [${JSON.stringify(authorizeOptions)}]`);
375
- const redirectState = response.state;
376
- const authorizeOptionsState = authorizeOptions.state;
377
- if (authorizeOptionsState.localeCompare(redirectState) === 0) {
378
- console.log('redirected state (from queryVars) matched previously saved transaction authorizeOptions state'); // green
379
- return await this.#GetToken(authorizeOptions, response);
380
- }
381
- else {
382
- console.log('redirected state (from queryVars) did NOT match previously saved transaction authorizeOptions state'); // red
383
- console.log(`authorizeOptionsState: [${authorizeOptionsState}]`); // red
384
- console.log(`redirectState: [${redirectState}]`); // red
385
- this.#HandleErrorEvent({ message: 'State un-matched' });
386
- return false;
387
- }
388
- }
389
- else if (queryVars[stsutils_1.OAuth2ParameterType.ERROR]) {
390
- //const response: IAuthorizeErrorResponse = queryVars as IAuthorizeErrorResponse;
391
- //@@ pass error back to parent thread (to the plugin) as a message
392
- //const error = response.error;
393
- //const errorDescription = response.error_description;
394
- this.#HandleErrorEvent({ message: 'State un-matched' });
395
- return false;
396
- }
397
- else {
398
- // Invalid redirect query params
399
- //const error = 'Invalid redirect query params'; //@@ fix
400
- //const errorDescription = 'Invalid redirect query params description'; //@@ fix
401
- this.#HandleErrorEvent({ message: 'State un-matched' });
402
- return false;
403
- }
404
- };
405
- /*
406
- client_id=6731de76-14a6-49ae-97bc-6eba6914391e
407
- &scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
408
- &code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
409
- &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
410
- &grant_type=authorization_code
411
- &code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
412
- &client_secret=JqQX2PNo9bpM0uEihUPzyrh // NOTE: Only required for web apps. This secret needs to be URL-Encoded.
413
-
414
- Successful Response
415
- {
416
- "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
417
- "token_type": "Bearer",
418
- "expires_in": 3599,
419
- "scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
420
- "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
421
- "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD...",
422
- }
423
- */
424
- // Get access_token, refresh_token and id_token using OAuth2 Authorization Code Flow
425
- #GetTokenFromBroker = async (authorizationCodeFlowParameters) => {
426
- debug(`#GetTokenFromBroker`.magenta);
427
- this.#clientSessionStore.remove(this.#STORAGE_SESSION_KEY);
428
- const url = `${this.#options.brokerendpoint}:${this.#options.brokerport}${this.#options.brokerapiroot}/token`;
429
- try {
430
- const rConfig = {
431
- method: "post",
432
- url: url,
433
- data: authorizationCodeFlowParameters,
434
- withCredentials: true,
435
- timeout: this.#options.timeout
436
- };
437
- debug(`#GetTokenFromBroker: request config: [${JSON.stringify(rConfig)}]`.magenta);
438
- if (detect_node_1.default) {
439
- rConfig.httpsAgent = this.#httpsAgent;
440
- }
441
- debug(`#GetTokenFromBroker: axios API call`.magenta);
442
- const retVal = await (0, axios_1.default)(rConfig);
443
- debug(`#GetTokenFromBroker: axios API call result: [${retVal.status}]`.magenta);
444
- if (retVal.status === http_status_codes_1.StatusCodes.OK) {
445
- debug(`#GetTokenFromBroker: storing tokens`.magenta);
446
- const tokenResponse = retVal.data;
447
- this.#HandleAuthenticateEvent(tokenResponse.id_token);
448
- const newSessionData = {
449
- tokenResponse: tokenResponse
450
- };
451
- if (detect_node_1.default) {
452
- newSessionData.brokerCookie = retVal.headers['set-cookie'];
453
- }
454
- this.#clientSessionStore.set(this.#STORAGE_SESSION_KEY, newSessionData);
455
- return true;
456
- }
457
- else if (retVal.status === http_status_codes_1.StatusCodes.UNAUTHORIZED) {
458
- debug(`#GetTokenFromBroker: NOT storing tokens, status: [${retVal.status}]`.magenta);
459
- this.#HandleAuthenticateEvent(null);
460
- //const response: ITokenErrorResponse = retVal.data as ITokenErrorResponse;
461
- //@@ store response in state
462
- //@@ go to error page ??
463
- return false;
464
- }
465
- else {
466
- // General error
467
- debug(`#GetTokenFromBroker: NOT storing tokens (general error 1), status: [${retVal.status}]`.magenta);
468
- this.#HandleAuthenticateEvent(null);
469
- console.log('Could not obtain access_token from token end-point:-');
470
- console.log(JSON.stringify(retVal.data));
471
- //@@ store error in state to show in error page
472
- return false;
473
- }
474
- }
475
- catch (error) {
476
- debug(`#GetTokenFromBroker: NOT storing tokens (general error 2), status: [${error}]`.red);
477
- this.#HandleAuthenticateEvent(null);
478
- //@@ store error in state to show in error page
479
- return false;
480
- }
481
- };
482
- // Get access_token, refresh_token and id_token using OAuth2 Authorization Code Flow
483
- #GetToken = async (authorizeOptions, authorizeResponse) => {
484
- console.log("#GetToken");
485
- console.log(authorizeResponse);
486
- this.#clientSessionStore.set(this.#STORAGE_SESSION_KEY, null);
487
- const authorizationCodeFlowParameters = {
488
- client_id: this.#options.client_id,
489
- scope: this.#options.scope,
490
- code: authorizeResponse.code,
491
- redirect_uri: this.#options.redirect_uri,
492
- grant_type: stsoauth2types_1.OAuthGrantTypes.AUTHORIZATION_CODE,
493
- code_verifier: authorizeOptions.code_verifier
494
- };
495
- return await this.#GetTokenFromBroker(authorizationCodeFlowParameters);
496
- };
497
- /*
498
- // Line breaks for legibility only
499
-
500
- POST /{tenant}/oauth2/v2.0/token HTTP/1.1
501
- Host: https://login.microsoftonline.com
502
- Content-Type: application/x-www-form-urlencoded
503
-
504
- client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
505
- &scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
506
- &refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
507
- &grant_type=refresh_token
508
- &client_secret=sampleCredentia1s // NOTE: Only required for web apps. This secret needs to be URL-Encoded
509
-
510
- Error Response
511
- {
512
- "error": "invalid_scope",
513
- "error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 255d1aef-8c98-452f-ac51-23d051240864\r\nCorrelation ID: fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7\r\nTimestamp: 2016-01-09 02:02:12Z",
514
- "error_codes": [
515
- 70011
516
- ],
517
- "timestamp": "2016-01-09 02:02:12Z",
518
- "trace_id": "255d1aef-8c98-452f-ac51-23d051240864",
519
- "correlation_id": "fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7"
520
- }
521
- */
522
- #RefreshToken = async () => {
523
- // Get access_token, refresh_token and id_token using OAuth2 Authorization Code Flow
524
- debug(`STSOAuth2Worker:#RefreshToken:start`.cyan);
525
- const sessionData = this.#clientSessionStore.get(this.#STORAGE_SESSION_KEY);
526
- if (sessionData) {
527
- debug(`STSOAuth2Worker:#RefreshToken:sessionData: [${JSON.stringify(sessionData)}]`.cyan);
528
- const currentSessionData = sessionData.tokenResponse;
529
- const refreshFlowParameters = {
530
- client_id: this.#options.client_id,
531
- scope: this.#options.scope,
532
- refresh_token: currentSessionData.refresh_token,
533
- grant_type: stsoauth2types_1.OAuthGrantTypes.REFRESH_TOKEN
534
- };
535
- return await this.#GetTokenFromBroker(refreshFlowParameters);
536
- }
537
- else {
538
- debug(`STSOAuth2Worker:#RefreshToken:sessionData not found within clientSessionStore`.red);
539
- // show error
540
- //@@ no valid session exists for refresh
541
- return false;
542
- }
543
- };
544
- // call broker to logout
545
- // broker to logout of server
546
- // delete cookie
547
- // clear session storage
548
- // clear all state from $store
549
- #Logout = async () => {
550
- console.log('Logout');
551
- const url = `${this.#options.brokerendpoint}:${this.#options.brokerport}${this.#options.brokerapiroot}/logout`;
552
- console.log(url);
553
- const sessionData = this.#clientSessionStore.get(this.#STORAGE_SESSION_KEY);
554
- if (sessionData) {
555
- const currentSessionData = sessionData.tokenResponse;
556
- const refresh_token = currentSessionData.refresh_token;
557
- console.log(refresh_token);
558
- const decodedRefreshToken = (0, jwt_decode_1.default)(refresh_token);
559
- console.log(decodedRefreshToken);
560
- const sessionId = decodedRefreshToken.sts_session;
561
- console.log(sessionId);
562
- this.#clientSessionStore.remove(this.#STORAGE_SESSION_KEY);
563
- this.#HandleAuthenticateEvent(null);
564
- try {
565
- const rConfig = {
566
- method: "post",
567
- url: url,
568
- data: {
569
- sessionId
570
- },
571
- withCredentials: true,
572
- timeout: this.#options.timeout,
573
- };
574
- debug(`#Logout: request config: [${rConfig}]`.magenta);
575
- if (detect_node_1.default) {
576
- rConfig.httpsAgent = this.#httpsAgent;
577
- }
578
- const retVal = await (0, axios_1.default)(rConfig);
579
- if (retVal.data.status === http_status_codes_1.StatusCodes.OK) {
580
- return true;
581
- }
582
- else {
583
- console.log('Error during logout (1: server side)');
584
- console.log(JSON.stringify(retVal.data));
585
- return false;
586
- }
587
- }
588
- catch (error) {
589
- console.log('Error during logout (2: server side)');
590
- console.log(error);
591
- console.log(JSON.stringify(error));
592
- return false;
593
- }
594
- }
595
- else {
596
- console.log('Error during logout. Could not restore session from session storage.');
597
- return false;
598
- }
599
- };
600
- }
601
- exports.STSOAuth2Worker = STSOAuth2Worker;
602
- /*
603
- let oAuth2Worker: STSOAuth2Worker = null;
604
-
605
- onmessage = async function(data: MessageEvent)
606
- {
607
- const workerPort = data.data as MessagePort;
608
- oAuth2Worker = new STSOAuth2Worker(workerPort);
609
- }
610
- */
611
- //# sourceMappingURL=stsoauth2worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stsoauth2worker.js","sourceRoot":"","sources":["../src/stsoauth2worker.ts"],"names":[],"mappings":"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"}