@shad-claiborne/basic-oidc 1.0.3 → 1.0.4

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.
@@ -0,0 +1,285 @@
1
+ export interface IdentityProviderConfiguration {
2
+ issuer: string;
3
+ authorization_endpoint: string;
4
+ token_endpoint: string;
5
+ userinfo_endpoint: string;
6
+ registration_endpoint: string;
7
+ jwks_uri: string;
8
+ response_types_supported: string[];
9
+ response_modes_supported: string[];
10
+ grant_types_supported: string[];
11
+ subject_types_supported: string[];
12
+ id_token_signing_alg_values_supported: string[];
13
+ scopes_supported: string[];
14
+ token_endpoint_auth_methods_supported: string[];
15
+ claims_supported: string[];
16
+ code_challenge_methods_supported: string[];
17
+ introspection_endpoint: string;
18
+ introspection_endpoint_auth_methods_supported: string[];
19
+ revocation_endpoint: string;
20
+ revocation_endpoint_auth_methods_supported: string[];
21
+ end_session_endpoint: string;
22
+ request_parameter_supported: boolean;
23
+ request_object_signing_alg_values_supported: string[];
24
+ device_authorization_endpoint: string;
25
+ pushed_authorization_request_endpoint: string;
26
+ backchannel_token_delivery_modes_supported: string[];
27
+ backchannel_authentication_request_signing_alg_values_supported: string[];
28
+ dpop_signing_alg_values_supported: string[];
29
+ }
30
+ export interface AuthorizationResponse {
31
+ code?: string;
32
+ id_token?: string;
33
+ state?: string;
34
+ }
35
+ export interface TokenSet {
36
+ token_type: string;
37
+ access_token: string;
38
+ expires_in: number;
39
+ refresh_token: string;
40
+ id_token?: string;
41
+ }
42
+ export interface Identity {
43
+ sub: string;
44
+ name?: string;
45
+ email?: string;
46
+ }
47
+ /**
48
+ * class AuthorizationRequest
49
+ */
50
+ export declare class AuthorizationRequest {
51
+ private client;
52
+ private responseType;
53
+ private responseMode;
54
+ private redirectUri;
55
+ private scope;
56
+ private state;
57
+ private codeChallenge;
58
+ private codeChallengeMethod;
59
+ /**
60
+ * constructor
61
+ * @param client Client
62
+ */
63
+ constructor(client: Client);
64
+ /**
65
+ * setRedirectUri
66
+ * @param uri string
67
+ */
68
+ setRedirectUri(uri: string): AuthorizationRequest;
69
+ /**
70
+ * setState
71
+ * @param state string
72
+ */
73
+ setState(state: string): AuthorizationRequest;
74
+ /**
75
+ * setResponseMode
76
+ * @param mode string
77
+ */
78
+ setResponseMode(mode: string): AuthorizationRequest;
79
+ /**
80
+ * setResponseType
81
+ * @param type string[]
82
+ */
83
+ setResponseType(type: string): AuthorizationRequest;
84
+ /**
85
+ * setScope
86
+ * @param scope string[]
87
+ */
88
+ setScope(scope: string[]): AuthorizationRequest;
89
+ /**
90
+ * setCodeChallenge
91
+ * @param challenge string
92
+ * @param method string
93
+ */
94
+ setCodeChallenge(challenge: string, method?: string): AuthorizationRequest;
95
+ /**
96
+ * toURLSearchParams
97
+ * @returns URLSearchParams
98
+ */
99
+ toURLSearchParams(): URLSearchParams;
100
+ /**
101
+ * toURL
102
+ * @returns URL
103
+ */
104
+ toURL(): URL;
105
+ }
106
+ /**
107
+ * class TokenRequest
108
+ */
109
+ export declare class TokenRequest {
110
+ private client;
111
+ private code;
112
+ private codeVerifier;
113
+ private redirectUri;
114
+ private grantType;
115
+ private refreshToken;
116
+ /**
117
+ * constructor
118
+ * @param client Client
119
+ */
120
+ constructor(client: Client);
121
+ /**
122
+ * setCode
123
+ * @param code string
124
+ */
125
+ setCode(code: string): TokenRequest;
126
+ /**
127
+ * setRedirectUri
128
+ * @param uri string
129
+ */
130
+ setRedirectUri(uri: string): TokenRequest;
131
+ /**
132
+ * setCodeVerifier
133
+ * @param verifier string
134
+ */
135
+ setCodeVerifier(verifier: string): TokenRequest;
136
+ /**
137
+ * setGrantType
138
+ * @param type string
139
+ */
140
+ setGrantType(type: string): TokenRequest;
141
+ /**
142
+ * setRefreshToken
143
+ * @param token string
144
+ */
145
+ setRefreshToken(token: string): TokenRequest;
146
+ /**
147
+ * toURLSearchParams
148
+ * @returns URLSearchParams
149
+ */
150
+ toURLSearchParams(): URLSearchParams;
151
+ }
152
+ /**
153
+ * class IdentityProvider
154
+ */
155
+ export declare class IdentityProvider {
156
+ private config;
157
+ /**
158
+ * constructor
159
+ * @param config IdentityProviderConfiguration
160
+ */
161
+ constructor(config: IdentityProviderConfiguration);
162
+ /**
163
+ * getAuthorizationEndpoint
164
+ * @returns string
165
+ */
166
+ getAuthorizationEndpoint(): string;
167
+ /**
168
+ * getTokenEndpoint
169
+ * @returns string
170
+ */
171
+ getTokenEndpoint(): string;
172
+ /**
173
+ * getUserinfoEndpoint
174
+ * @returns string
175
+ */
176
+ getUserinfoEndpoint(): string;
177
+ /**
178
+ * getRevocationEndpoint
179
+ * @returns string
180
+ */
181
+ getRevocationEndpoint(): string;
182
+ /**
183
+ * isResponseModeSupported
184
+ * @param mode string
185
+ * @returns boolean
186
+ */
187
+ isResponseModeSupported(mode: string): boolean;
188
+ /**
189
+ * isResponseTypeSupported
190
+ * @param type string[]
191
+ * @returns boolean
192
+ */
193
+ isResponseTypeSupported(type: string): boolean;
194
+ /**
195
+ * isScopeSupported
196
+ * @param scope string[]
197
+ * @returns boolean
198
+ */
199
+ isScopeSupported(scope: string[]): boolean;
200
+ /**
201
+ * isChallengeMethodSupported
202
+ * @param method string
203
+ * @returns boolean
204
+ */
205
+ isChallengeMethodSupported(method: string): boolean;
206
+ /**
207
+ * isGrantTypeSupported
208
+ * @param method string
209
+ * @returns boolean
210
+ */
211
+ isGrantTypeSupported(type: string): boolean;
212
+ /**
213
+ * createClient
214
+ * @returns Client
215
+ */
216
+ createClient(id: string, secret: string): Client;
217
+ /**
218
+ * getIdentity
219
+ * @param client Client
220
+ * @param tokenSet TokenSet
221
+ * @returns Promise<Identity | null>
222
+ */
223
+ getIdentity(client: Client, tokenSet: TokenSet): Promise<Identity | null>;
224
+ }
225
+ /**
226
+ * class Client
227
+ */
228
+ export declare class Client {
229
+ private provider;
230
+ private clientId;
231
+ private clientSecret;
232
+ /**
233
+ * constructor
234
+ * @param provider IdentityProvider
235
+ * @param id string
236
+ * @param secret string
237
+ */
238
+ constructor(provider: IdentityProvider, id: string, secret: string);
239
+ /**
240
+ * getProvider
241
+ * @returns IdentityProvider
242
+ */
243
+ getProvider(): IdentityProvider;
244
+ /**
245
+ * getClientId
246
+ * @returns string
247
+ */
248
+ getClientId(): string;
249
+ /**
250
+ * getClientSecret
251
+ * @returns string
252
+ */
253
+ getClientSecret(): string;
254
+ /**
255
+ * newAuthorizationRequest
256
+ * @returns AuthorizationRequest
257
+ */
258
+ newAuthorizationRequest(): AuthorizationRequest;
259
+ /**
260
+ * requestAccess
261
+ * @param authResponse AuthorizationResponse
262
+ * @param codeVerifier string
263
+ * @returns Promise<TokenSet>
264
+ */
265
+ requestAccess(authResponse: AuthorizationResponse, codeVerifier?: string): Promise<TokenSet>;
266
+ /**
267
+ * refreshAccess
268
+ * @param tokenSet TokenSet
269
+ * @returns Promise<TokenSet>
270
+ */
271
+ refreshAccess(tokenSet: TokenSet): Promise<TokenSet>;
272
+ /**
273
+ * revokeAccess
274
+ * @param tokenSet TokenSet
275
+ * @returns Promise<void>
276
+ */
277
+ revokeAccess(tokenSet: TokenSet): Promise<void>;
278
+ }
279
+ /**
280
+ * createIdentityProvider
281
+ * @param issuer string
282
+ * @returns IdentityProvider
283
+ */
284
+ export declare const createIdentityProvider: (issuer: string) => Promise<IdentityProvider>;
285
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,486 @@
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.createIdentityProvider = exports.Client = exports.IdentityProvider = exports.TokenRequest = exports.AuthorizationRequest = void 0;
7
+ const sha256_1 = __importDefault(require("crypto-js/sha256"));
8
+ const enc_base64url_1 = __importDefault(require("crypto-js/enc-base64url"));
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const jose_1 = require("jose");
11
+ /**
12
+ * class AuthorizationRequest
13
+ */
14
+ class AuthorizationRequest {
15
+ client;
16
+ responseType;
17
+ responseMode;
18
+ redirectUri;
19
+ scope;
20
+ state;
21
+ codeChallenge;
22
+ codeChallengeMethod;
23
+ /**
24
+ * constructor
25
+ * @param client Client
26
+ */
27
+ constructor(client) {
28
+ this.client = client;
29
+ }
30
+ /**
31
+ * setRedirectUri
32
+ * @param uri string
33
+ */
34
+ setRedirectUri(uri) {
35
+ this.redirectUri = uri;
36
+ return this;
37
+ }
38
+ /**
39
+ * setState
40
+ * @param state string
41
+ */
42
+ setState(state) {
43
+ this.state = state;
44
+ return this;
45
+ }
46
+ /**
47
+ * setResponseMode
48
+ * @param mode string
49
+ */
50
+ setResponseMode(mode) {
51
+ if (this.client.getProvider().isResponseModeSupported(mode)) {
52
+ this.responseMode = mode;
53
+ }
54
+ else
55
+ throw new Error('invalid or unsupported response mode');
56
+ return this;
57
+ }
58
+ /**
59
+ * setResponseType
60
+ * @param type string[]
61
+ */
62
+ setResponseType(type) {
63
+ if (this.client.getProvider().isResponseTypeSupported(type)) {
64
+ this.responseType = type;
65
+ }
66
+ else
67
+ throw new Error('invalid or unsupported response type');
68
+ return this;
69
+ }
70
+ /**
71
+ * setScope
72
+ * @param scope string[]
73
+ */
74
+ setScope(scope) {
75
+ if (this.client.getProvider().isScopeSupported(scope)) {
76
+ this.scope = ['openid', ...scope];
77
+ }
78
+ else
79
+ throw new Error('invalid or unsupported scope');
80
+ return this;
81
+ }
82
+ /**
83
+ * setCodeChallenge
84
+ * @param challenge string
85
+ * @param method string
86
+ */
87
+ setCodeChallenge(challenge, method = 'S256') {
88
+ if (this.client.getProvider().isChallengeMethodSupported(method)) {
89
+ if (method === 'plain') {
90
+ this.codeChallenge = challenge;
91
+ }
92
+ else if (method === 'S256') {
93
+ this.codeChallenge = enc_base64url_1.default.stringify((0, sha256_1.default)(challenge));
94
+ }
95
+ else
96
+ throw new Error('code challenge method not yet implemented');
97
+ this.codeChallengeMethod = method;
98
+ }
99
+ else
100
+ throw new Error('invalid or unsupported code challenge method');
101
+ return this;
102
+ }
103
+ /**
104
+ * toURLSearchParams
105
+ * @returns URLSearchParams
106
+ */
107
+ toURLSearchParams() {
108
+ const params = new URLSearchParams();
109
+ params.append('client_id', this.client.getClientId());
110
+ if (this.responseType === undefined)
111
+ throw new Error('response type is required');
112
+ params.append('response_type', this.responseType);
113
+ if (this.responseMode)
114
+ params.append('response_mode', this.responseMode);
115
+ if (this.redirectUri)
116
+ params.append('redirect_uri', this.redirectUri);
117
+ if (this.scope === undefined)
118
+ throw new Error('scope is required');
119
+ params.append('scope', this.scope.join(' '));
120
+ if (this.state)
121
+ params.append('state', this.state);
122
+ const isCodeResponseTypeIncluded = this.responseType.includes('code');
123
+ if (this.codeChallenge === undefined) {
124
+ if (isCodeResponseTypeIncluded)
125
+ throw new Error("code challenge required for 'code' response type");
126
+ }
127
+ else
128
+ params.append('code_challenge', this.codeChallenge);
129
+ if (this.codeChallengeMethod === undefined) {
130
+ if (isCodeResponseTypeIncluded)
131
+ throw new Error("code challenge method required for 'code' response type");
132
+ }
133
+ else
134
+ params.append('code_challenge_method', this.codeChallengeMethod);
135
+ return params;
136
+ }
137
+ /**
138
+ * toURL
139
+ * @returns URL
140
+ */
141
+ toURL() {
142
+ const endpointUrl = new URL(this.client.getProvider().getAuthorizationEndpoint());
143
+ endpointUrl.search = this.toURLSearchParams().toString();
144
+ return endpointUrl;
145
+ }
146
+ }
147
+ exports.AuthorizationRequest = AuthorizationRequest;
148
+ /**
149
+ * class TokenRequest
150
+ */
151
+ class TokenRequest {
152
+ client;
153
+ code;
154
+ codeVerifier;
155
+ redirectUri;
156
+ grantType;
157
+ refreshToken;
158
+ /**
159
+ * constructor
160
+ * @param client Client
161
+ */
162
+ constructor(client) {
163
+ this.client = client;
164
+ }
165
+ /**
166
+ * setCode
167
+ * @param code string
168
+ */
169
+ setCode(code) {
170
+ this.code = code;
171
+ return this;
172
+ }
173
+ /**
174
+ * setRedirectUri
175
+ * @param uri string
176
+ */
177
+ setRedirectUri(uri) {
178
+ this.redirectUri = uri;
179
+ return this;
180
+ }
181
+ /**
182
+ * setCodeVerifier
183
+ * @param verifier string
184
+ */
185
+ setCodeVerifier(verifier) {
186
+ this.codeVerifier = verifier;
187
+ return this;
188
+ }
189
+ /**
190
+ * setGrantType
191
+ * @param type string
192
+ */
193
+ setGrantType(type) {
194
+ if (this.client.getProvider().isGrantTypeSupported(type)) {
195
+ this.grantType = type;
196
+ }
197
+ else
198
+ throw new Error('grant type not supported');
199
+ return this;
200
+ }
201
+ /**
202
+ * setRefreshToken
203
+ * @param token string
204
+ */
205
+ setRefreshToken(token) {
206
+ this.refreshToken = token;
207
+ return this;
208
+ }
209
+ /**
210
+ * toURLSearchParams
211
+ * @returns URLSearchParams
212
+ */
213
+ toURLSearchParams() {
214
+ const params = new URLSearchParams();
215
+ params.append('client_id', this.client.getClientId());
216
+ params.append('client_secret', this.client.getClientSecret());
217
+ if (this.grantType === undefined)
218
+ throw new Error('grant type is required');
219
+ params.append('grant_type', this.grantType);
220
+ if (this.grantType === 'authorization_code') {
221
+ if (this.code === undefined)
222
+ throw new Error('code is required for authorization code flow');
223
+ params.append('code', this.code);
224
+ if (this.codeVerifier)
225
+ params.append('code_verifier', this.codeVerifier);
226
+ if (this.redirectUri)
227
+ params.append('redirect_uri', this.redirectUri);
228
+ }
229
+ else if (this.grantType === 'refresh_token') {
230
+ if (this.refreshToken === undefined)
231
+ throw new Error('refresh token required for grant type');
232
+ params.append('refresh_token', this.refreshToken);
233
+ }
234
+ return params;
235
+ }
236
+ }
237
+ exports.TokenRequest = TokenRequest;
238
+ /**
239
+ * class IdentityProvider
240
+ */
241
+ class IdentityProvider {
242
+ config;
243
+ /**
244
+ * constructor
245
+ * @param config IdentityProviderConfiguration
246
+ */
247
+ constructor(config) {
248
+ this.config = config;
249
+ }
250
+ /**
251
+ * getAuthorizationEndpoint
252
+ * @returns string
253
+ */
254
+ getAuthorizationEndpoint() {
255
+ return this.config.authorization_endpoint;
256
+ }
257
+ /**
258
+ * getTokenEndpoint
259
+ * @returns string
260
+ */
261
+ getTokenEndpoint() {
262
+ return this.config.token_endpoint;
263
+ }
264
+ /**
265
+ * getUserinfoEndpoint
266
+ * @returns string
267
+ */
268
+ getUserinfoEndpoint() {
269
+ return this.config.userinfo_endpoint;
270
+ }
271
+ /**
272
+ * getRevocationEndpoint
273
+ * @returns string
274
+ */
275
+ getRevocationEndpoint() {
276
+ return this.config.revocation_endpoint;
277
+ }
278
+ /**
279
+ * isResponseModeSupported
280
+ * @param mode string
281
+ * @returns boolean
282
+ */
283
+ isResponseModeSupported(mode) {
284
+ return this.config.response_modes_supported.includes(mode);
285
+ }
286
+ /**
287
+ * isResponseTypeSupported
288
+ * @param type string[]
289
+ * @returns boolean
290
+ */
291
+ isResponseTypeSupported(type) {
292
+ return this.config.response_types_supported.includes(type);
293
+ }
294
+ /**
295
+ * isScopeSupported
296
+ * @param scope string[]
297
+ * @returns boolean
298
+ */
299
+ isScopeSupported(scope) {
300
+ return scope.length === scope.filter(s => this.config.scopes_supported.includes(s)).length;
301
+ }
302
+ /**
303
+ * isChallengeMethodSupported
304
+ * @param method string
305
+ * @returns boolean
306
+ */
307
+ isChallengeMethodSupported(method) {
308
+ return this.config.code_challenge_methods_supported.includes(method);
309
+ }
310
+ /**
311
+ * isGrantTypeSupported
312
+ * @param method string
313
+ * @returns boolean
314
+ */
315
+ isGrantTypeSupported(type) {
316
+ return this.config.grant_types_supported.includes(type);
317
+ }
318
+ /**
319
+ * createClient
320
+ * @returns Client
321
+ */
322
+ createClient(id, secret) {
323
+ const client = new Client(this, id, secret);
324
+ return client;
325
+ }
326
+ /**
327
+ * getIdentity
328
+ * @param client Client
329
+ * @param tokenSet TokenSet
330
+ * @returns Promise<Identity | null>
331
+ */
332
+ async getIdentity(client, tokenSet) {
333
+ let id = null;
334
+ if (tokenSet.id_token) {
335
+ const jwks = (0, jose_1.createRemoteJWKSet)(new URL(this.config.jwks_uri));
336
+ const { payload } = await (0, jose_1.jwtVerify)(tokenSet.id_token, jwks, { issuer: this.config.issuer });
337
+ id = payload;
338
+ }
339
+ else {
340
+ const api = new IdentityProviderApi(this, tokenSet);
341
+ id = await api.fetchUserinfo();
342
+ }
343
+ return id;
344
+ }
345
+ }
346
+ exports.IdentityProvider = IdentityProvider;
347
+ /**
348
+ * class IdentityProviderApi
349
+ */
350
+ class IdentityProviderApi {
351
+ provider;
352
+ tokenSet;
353
+ /**
354
+ * constructor
355
+ * @param provider IdentityProvider
356
+ * @param client Client
357
+ */
358
+ constructor(provider, tokenSet) {
359
+ this.provider = provider;
360
+ this.tokenSet = tokenSet;
361
+ }
362
+ /**
363
+ * setTokenSet
364
+ * @param tokenSet TokenSet
365
+ */
366
+ setTokenSet(tokenSet) {
367
+ this.tokenSet = tokenSet;
368
+ }
369
+ /**
370
+ * fetchUserinfo
371
+ * @returns Promise<Identity>
372
+ */
373
+ async fetchUserinfo() {
374
+ const res = await axios_1.default.get(this.provider.getUserinfoEndpoint(), {
375
+ headers: {
376
+ 'Authorization': `Bearer ${this.tokenSet.access_token}`
377
+ }
378
+ });
379
+ return res.data;
380
+ }
381
+ }
382
+ /**
383
+ * class Client
384
+ */
385
+ class Client {
386
+ provider;
387
+ clientId;
388
+ clientSecret;
389
+ /**
390
+ * constructor
391
+ * @param provider IdentityProvider
392
+ * @param id string
393
+ * @param secret string
394
+ */
395
+ constructor(provider, id, secret) {
396
+ this.provider = provider;
397
+ this.clientId = id;
398
+ this.clientSecret = secret;
399
+ }
400
+ /**
401
+ * getProvider
402
+ * @returns IdentityProvider
403
+ */
404
+ getProvider() {
405
+ return this.provider;
406
+ }
407
+ /**
408
+ * getClientId
409
+ * @returns string
410
+ */
411
+ getClientId() {
412
+ return this.clientId;
413
+ }
414
+ /**
415
+ * getClientSecret
416
+ * @returns string
417
+ */
418
+ getClientSecret() {
419
+ return this.clientSecret;
420
+ }
421
+ /**
422
+ * newAuthorizationRequest
423
+ * @returns AuthorizationRequest
424
+ */
425
+ newAuthorizationRequest() {
426
+ const req = new AuthorizationRequest(this);
427
+ return req;
428
+ }
429
+ /**
430
+ * requestAccess
431
+ * @param authResponse AuthorizationResponse
432
+ * @param codeVerifier string
433
+ * @returns Promise<TokenSet>
434
+ */
435
+ async requestAccess(authResponse, codeVerifier) {
436
+ const tokenRequest = new TokenRequest(this);
437
+ if (authResponse.code === undefined)
438
+ throw new Error('authorization response did not include a code');
439
+ tokenRequest.setCode(authResponse.code)
440
+ .setGrantType('authorization_code');
441
+ if (codeVerifier)
442
+ tokenRequest.setCodeVerifier(codeVerifier);
443
+ const res = await axios_1.default.post(this.provider.getTokenEndpoint(), tokenRequest.toURLSearchParams());
444
+ return res.data;
445
+ }
446
+ /**
447
+ * refreshAccess
448
+ * @param tokenSet TokenSet
449
+ * @returns Promise<TokenSet>
450
+ */
451
+ async refreshAccess(tokenSet) {
452
+ const tokenRequest = new TokenRequest(this)
453
+ .setRefreshToken(tokenSet.refresh_token)
454
+ .setGrantType('refresh_token');
455
+ const res = await axios_1.default.post(this.provider.getTokenEndpoint(), tokenRequest.toURLSearchParams());
456
+ return res.data;
457
+ }
458
+ /**
459
+ * revokeAccess
460
+ * @param tokenSet TokenSet
461
+ * @returns Promise<void>
462
+ */
463
+ async revokeAccess(tokenSet) {
464
+ const params = new URLSearchParams();
465
+ params.append('client_id', this.clientId);
466
+ params.append('client_secret', this.clientSecret);
467
+ params.append('token', tokenSet.access_token);
468
+ params.append('token_type_hint', 'access_token');
469
+ await axios_1.default.post(this.provider.getRevocationEndpoint(), params);
470
+ }
471
+ }
472
+ exports.Client = Client;
473
+ /**
474
+ * createIdentityProvider
475
+ * @param issuer string
476
+ * @returns IdentityProvider
477
+ */
478
+ const createIdentityProvider = async (issuer) => {
479
+ const discoveryUrl = `${issuer}/.well-known/openid-configuration`;
480
+ const res = await axios_1.default.get(discoveryUrl);
481
+ const config = res.data;
482
+ const provider = new IdentityProvider(config);
483
+ return provider;
484
+ };
485
+ exports.createIdentityProvider = createIdentityProvider;
486
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shad-claiborne/basic-oidc",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Basic OpenID Connect library",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",