@versini/auth-provider 2.2.0 → 3.0.0
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.
- package/dist/index.d.ts +2 -3
- package/dist/index.js +204 -197
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -9,12 +9,11 @@ type AuthProviderProps = {
|
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
type AuthState = {
|
|
12
|
+
isLoading: boolean;
|
|
12
13
|
isAuthenticated: boolean;
|
|
13
|
-
idToken?: string;
|
|
14
|
-
accessToken?: string;
|
|
15
|
-
refreshToken?: string;
|
|
16
14
|
logoutReason?: string;
|
|
17
15
|
userId?: string;
|
|
16
|
+
idTokenClaims?: any;
|
|
18
17
|
};
|
|
19
18
|
|
|
20
19
|
type AuthContextProps = {
|
package/dist/index.js
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
import { jsx as ne } from "react/jsx-runtime";
|
|
2
2
|
import * as I from "react";
|
|
3
|
-
import { useRef as ae, useEffect as F, createContext as se, useState as ie,
|
|
3
|
+
import { useRef as ae, useEffect as F, createContext as se, useState as ie, useCallback as ce, useContext as ue } from "react";
|
|
4
4
|
/*!
|
|
5
|
-
@versini/auth-provider
|
|
5
|
+
@versini/auth-provider v3.0.0
|
|
6
6
|
© 2024 gizmette.com
|
|
7
7
|
*/
|
|
8
8
|
try {
|
|
9
9
|
window.__VERSINI_AUTH_CLIENT__ || (window.__VERSINI_AUTH_CLIENT__ = {
|
|
10
|
-
version: "
|
|
11
|
-
buildTime: "06/
|
|
10
|
+
version: "3.0.0",
|
|
11
|
+
buildTime: "06/25/2024 08:53 AM EDT",
|
|
12
12
|
homepage: "https://github.com/aversini/auth-client",
|
|
13
13
|
license: "MIT"
|
|
14
14
|
});
|
|
15
15
|
} catch {
|
|
16
16
|
}
|
|
17
17
|
/*!
|
|
18
|
-
@versini/auth-common v2.
|
|
18
|
+
@versini/auth-common v2.3.0
|
|
19
19
|
© 2024 gizmette.com
|
|
20
20
|
*/
|
|
21
21
|
try {
|
|
22
22
|
window.__VERSINI_AUTH_COMMON__ || (window.__VERSINI_AUTH_COMMON__ = {
|
|
23
|
-
version: "2.
|
|
24
|
-
buildTime: "06/
|
|
23
|
+
version: "2.3.0",
|
|
24
|
+
buildTime: "06/25/2024 08:53 AM EDT",
|
|
25
25
|
homepage: "https://github.com/aversini/auth-client",
|
|
26
26
|
license: "MIT"
|
|
27
27
|
});
|
|
28
28
|
} catch {
|
|
29
29
|
}
|
|
30
|
-
const
|
|
31
|
-
function
|
|
30
|
+
const N = crypto, G = (e) => e instanceof CryptoKey, _ = new TextEncoder(), T = new TextDecoder();
|
|
31
|
+
function de(...e) {
|
|
32
32
|
const t = e.reduce((n, { length: a }) => n + a, 0), o = new Uint8Array(t);
|
|
33
33
|
let r = 0;
|
|
34
34
|
for (const n of e)
|
|
35
35
|
o.set(n, r), r += n.length;
|
|
36
36
|
return o;
|
|
37
37
|
}
|
|
38
|
-
const
|
|
38
|
+
const le = (e) => {
|
|
39
39
|
const t = atob(e), o = new Uint8Array(t.length);
|
|
40
40
|
for (let r = 0; r < t.length; r++)
|
|
41
41
|
o[r] = t.charCodeAt(r);
|
|
42
42
|
return o;
|
|
43
|
-
},
|
|
43
|
+
}, C = (e) => {
|
|
44
44
|
let t = e;
|
|
45
45
|
t instanceof Uint8Array && (t = T.decode(t)), t = t.replace(/-/g, "+").replace(/_/g, "/").replace(/\s/g, "");
|
|
46
46
|
try {
|
|
47
|
-
return
|
|
47
|
+
return le(t);
|
|
48
48
|
} catch {
|
|
49
49
|
throw new TypeError("The input to be decoded is not correctly encoded.");
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
|
-
class
|
|
52
|
+
class b extends Error {
|
|
53
53
|
static get code() {
|
|
54
54
|
return "ERR_JOSE_GENERIC";
|
|
55
55
|
}
|
|
@@ -58,7 +58,7 @@ class A extends Error {
|
|
|
58
58
|
super(t), this.code = "ERR_JOSE_GENERIC", this.name = this.constructor.name, (o = Error.captureStackTrace) == null || o.call(Error, this, this.constructor);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
class
|
|
61
|
+
class m extends b {
|
|
62
62
|
static get code() {
|
|
63
63
|
return "ERR_JWT_CLAIM_VALIDATION_FAILED";
|
|
64
64
|
}
|
|
@@ -66,7 +66,7 @@ class f extends A {
|
|
|
66
66
|
super(t), this.code = "ERR_JWT_CLAIM_VALIDATION_FAILED", this.claim = r, this.reason = n, this.payload = o;
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
class
|
|
69
|
+
class L extends b {
|
|
70
70
|
static get code() {
|
|
71
71
|
return "ERR_JWT_EXPIRED";
|
|
72
72
|
}
|
|
@@ -74,7 +74,7 @@ class N extends A {
|
|
|
74
74
|
super(t), this.code = "ERR_JWT_EXPIRED", this.claim = r, this.reason = n, this.payload = o;
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
-
class
|
|
77
|
+
class he extends b {
|
|
78
78
|
constructor() {
|
|
79
79
|
super(...arguments), this.code = "ERR_JOSE_ALG_NOT_ALLOWED";
|
|
80
80
|
}
|
|
@@ -82,7 +82,7 @@ class le extends A {
|
|
|
82
82
|
return "ERR_JOSE_ALG_NOT_ALLOWED";
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
class k extends
|
|
85
|
+
class k extends b {
|
|
86
86
|
constructor() {
|
|
87
87
|
super(...arguments), this.code = "ERR_JOSE_NOT_SUPPORTED";
|
|
88
88
|
}
|
|
@@ -90,7 +90,7 @@ class k extends A {
|
|
|
90
90
|
return "ERR_JOSE_NOT_SUPPORTED";
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
let l = class extends
|
|
93
|
+
let l = class extends b {
|
|
94
94
|
constructor() {
|
|
95
95
|
super(...arguments), this.code = "ERR_JWS_INVALID";
|
|
96
96
|
}
|
|
@@ -98,7 +98,7 @@ let l = class extends A {
|
|
|
98
98
|
return "ERR_JWS_INVALID";
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
|
-
class Y extends
|
|
101
|
+
class Y extends b {
|
|
102
102
|
constructor() {
|
|
103
103
|
super(...arguments), this.code = "ERR_JWT_INVALID";
|
|
104
104
|
}
|
|
@@ -106,7 +106,7 @@ class Y extends A {
|
|
|
106
106
|
return "ERR_JWT_INVALID";
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
class
|
|
109
|
+
class pe extends b {
|
|
110
110
|
constructor() {
|
|
111
111
|
super(...arguments), this.code = "ERR_JWS_SIGNATURE_VERIFICATION_FAILED", this.message = "signature verification failed";
|
|
112
112
|
}
|
|
@@ -114,16 +114,16 @@ class he extends A {
|
|
|
114
114
|
return "ERR_JWS_SIGNATURE_VERIFICATION_FAILED";
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
|
-
function
|
|
117
|
+
function S(e, t = "algorithm.name") {
|
|
118
118
|
return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`);
|
|
119
119
|
}
|
|
120
|
-
function
|
|
120
|
+
function v(e, t) {
|
|
121
121
|
return e.name === t;
|
|
122
122
|
}
|
|
123
|
-
function
|
|
123
|
+
function P(e) {
|
|
124
124
|
return parseInt(e.name.slice(4), 10);
|
|
125
125
|
}
|
|
126
|
-
function
|
|
126
|
+
function fe(e) {
|
|
127
127
|
switch (e) {
|
|
128
128
|
case "ES256":
|
|
129
129
|
return "P-256";
|
|
@@ -135,7 +135,7 @@ function pe(e) {
|
|
|
135
135
|
throw new Error("unreachable");
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
-
function
|
|
138
|
+
function ye(e, t) {
|
|
139
139
|
if (t.length && !t.some((o) => e.usages.includes(o))) {
|
|
140
140
|
let o = "CryptoKey does not support this operation, its usages must include ";
|
|
141
141
|
if (t.length > 2) {
|
|
@@ -146,57 +146,57 @@ function fe(e, t) {
|
|
|
146
146
|
throw new TypeError(o);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
|
-
function
|
|
149
|
+
function me(e, t, ...o) {
|
|
150
150
|
switch (t) {
|
|
151
151
|
case "HS256":
|
|
152
152
|
case "HS384":
|
|
153
153
|
case "HS512": {
|
|
154
|
-
if (!
|
|
155
|
-
throw
|
|
154
|
+
if (!v(e.algorithm, "HMAC"))
|
|
155
|
+
throw S("HMAC");
|
|
156
156
|
const r = parseInt(t.slice(2), 10);
|
|
157
|
-
if (
|
|
158
|
-
throw
|
|
157
|
+
if (P(e.algorithm.hash) !== r)
|
|
158
|
+
throw S(`SHA-${r}`, "algorithm.hash");
|
|
159
159
|
break;
|
|
160
160
|
}
|
|
161
161
|
case "RS256":
|
|
162
162
|
case "RS384":
|
|
163
163
|
case "RS512": {
|
|
164
|
-
if (!
|
|
165
|
-
throw
|
|
164
|
+
if (!v(e.algorithm, "RSASSA-PKCS1-v1_5"))
|
|
165
|
+
throw S("RSASSA-PKCS1-v1_5");
|
|
166
166
|
const r = parseInt(t.slice(2), 10);
|
|
167
|
-
if (
|
|
168
|
-
throw
|
|
167
|
+
if (P(e.algorithm.hash) !== r)
|
|
168
|
+
throw S(`SHA-${r}`, "algorithm.hash");
|
|
169
169
|
break;
|
|
170
170
|
}
|
|
171
171
|
case "PS256":
|
|
172
172
|
case "PS384":
|
|
173
173
|
case "PS512": {
|
|
174
|
-
if (!
|
|
175
|
-
throw
|
|
174
|
+
if (!v(e.algorithm, "RSA-PSS"))
|
|
175
|
+
throw S("RSA-PSS");
|
|
176
176
|
const r = parseInt(t.slice(2), 10);
|
|
177
|
-
if (
|
|
178
|
-
throw
|
|
177
|
+
if (P(e.algorithm.hash) !== r)
|
|
178
|
+
throw S(`SHA-${r}`, "algorithm.hash");
|
|
179
179
|
break;
|
|
180
180
|
}
|
|
181
181
|
case "EdDSA": {
|
|
182
182
|
if (e.algorithm.name !== "Ed25519" && e.algorithm.name !== "Ed448")
|
|
183
|
-
throw
|
|
183
|
+
throw S("Ed25519 or Ed448");
|
|
184
184
|
break;
|
|
185
185
|
}
|
|
186
186
|
case "ES256":
|
|
187
187
|
case "ES384":
|
|
188
188
|
case "ES512": {
|
|
189
|
-
if (!
|
|
190
|
-
throw
|
|
191
|
-
const r =
|
|
189
|
+
if (!v(e.algorithm, "ECDSA"))
|
|
190
|
+
throw S("ECDSA");
|
|
191
|
+
const r = fe(t);
|
|
192
192
|
if (e.algorithm.namedCurve !== r)
|
|
193
|
-
throw
|
|
193
|
+
throw S(r, "algorithm.namedCurve");
|
|
194
194
|
break;
|
|
195
195
|
}
|
|
196
196
|
default:
|
|
197
197
|
throw new TypeError("CryptoKey does not support this operation");
|
|
198
198
|
}
|
|
199
|
-
|
|
199
|
+
ye(e, o);
|
|
200
200
|
}
|
|
201
201
|
function q(e, t, ...o) {
|
|
202
202
|
var r;
|
|
@@ -211,7 +211,7 @@ const J = (e, ...t) => q("Key must be ", e, ...t);
|
|
|
211
211
|
function z(e, t, ...o) {
|
|
212
212
|
return q(`Key for the ${e} algorithm must be `, t, ...o);
|
|
213
213
|
}
|
|
214
|
-
const X = (e) => G(e), E = ["CryptoKey"],
|
|
214
|
+
const X = (e) => G(e), E = ["CryptoKey"], we = (...e) => {
|
|
215
215
|
const t = e.filter(Boolean);
|
|
216
216
|
if (t.length === 0 || t.length === 1)
|
|
217
217
|
return !0;
|
|
@@ -230,11 +230,11 @@ const X = (e) => G(e), E = ["CryptoKey"], me = (...e) => {
|
|
|
230
230
|
}
|
|
231
231
|
return !0;
|
|
232
232
|
};
|
|
233
|
-
function
|
|
233
|
+
function Se(e) {
|
|
234
234
|
return typeof e == "object" && e !== null;
|
|
235
235
|
}
|
|
236
|
-
function
|
|
237
|
-
if (!
|
|
236
|
+
function H(e) {
|
|
237
|
+
if (!Se(e) || Object.prototype.toString.call(e) !== "[object Object]")
|
|
238
238
|
return !1;
|
|
239
239
|
if (Object.getPrototypeOf(e) === null)
|
|
240
240
|
return !0;
|
|
@@ -243,7 +243,7 @@ function D(e) {
|
|
|
243
243
|
t = Object.getPrototypeOf(t);
|
|
244
244
|
return Object.getPrototypeOf(e) === t;
|
|
245
245
|
}
|
|
246
|
-
const
|
|
246
|
+
const ge = (e, t) => {
|
|
247
247
|
if (e.startsWith("RS") || e.startsWith("PS")) {
|
|
248
248
|
const { modulusLength: o } = t.algorithm;
|
|
249
249
|
if (typeof o != "number" || o < 2048)
|
|
@@ -275,7 +275,7 @@ const Se = (e, t) => {
|
|
|
275
275
|
default:
|
|
276
276
|
throw new k("Invalid or unsupported EC Key Curve or OKP Key Sub Type");
|
|
277
277
|
}
|
|
278
|
-
},
|
|
278
|
+
}, Ee = async (e, t, o, r, n) => {
|
|
279
279
|
let a, s;
|
|
280
280
|
const i = new Uint8Array(atob(o.replace(e, "")).split("").map((c) => c.charCodeAt(0)));
|
|
281
281
|
switch (r) {
|
|
@@ -321,21 +321,21 @@ const Se = (e, t) => {
|
|
|
321
321
|
default:
|
|
322
322
|
throw new k('Invalid or unsupported "alg" (Algorithm) value');
|
|
323
323
|
}
|
|
324
|
-
return
|
|
325
|
-
},
|
|
326
|
-
async function
|
|
324
|
+
return N.subtle.importKey(t, i, a, !1, s);
|
|
325
|
+
}, Ae = (e, t, o) => Ee(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\s)/g, "spki", e, t);
|
|
326
|
+
async function be(e, t, o) {
|
|
327
327
|
if (e.indexOf("-----BEGIN PUBLIC KEY-----") !== 0)
|
|
328
328
|
throw new TypeError('"spki" must be SPKI formatted string');
|
|
329
|
-
return
|
|
329
|
+
return Ae(e, t);
|
|
330
330
|
}
|
|
331
|
-
const
|
|
331
|
+
const Ie = (e, t) => {
|
|
332
332
|
if (!(t instanceof Uint8Array)) {
|
|
333
333
|
if (!X(t))
|
|
334
334
|
throw new TypeError(z(e, t, ...E, "Uint8Array"));
|
|
335
335
|
if (t.type !== "secret")
|
|
336
336
|
throw new TypeError(`${E.join(" or ")} instances for symmetric algorithms must be of type "secret"`);
|
|
337
337
|
}
|
|
338
|
-
},
|
|
338
|
+
}, _e = (e, t, o) => {
|
|
339
339
|
if (!X(t))
|
|
340
340
|
throw new TypeError(z(e, t, ...E));
|
|
341
341
|
if (t.type === "secret")
|
|
@@ -345,9 +345,9 @@ const be = (e, t) => {
|
|
|
345
345
|
if (t.algorithm && o === "encrypt" && t.type === "private")
|
|
346
346
|
throw new TypeError(`${E.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`);
|
|
347
347
|
}, ve = (e, t, o) => {
|
|
348
|
-
e.startsWith("HS") || e === "dir" || e.startsWith("PBES2") || /^A\d{3}(?:GCM)?KW$/.test(e) ?
|
|
348
|
+
e.startsWith("HS") || e === "dir" || e.startsWith("PBES2") || /^A\d{3}(?:GCM)?KW$/.test(e) ? Ie(e, t) : _e(e, t, o);
|
|
349
349
|
};
|
|
350
|
-
function
|
|
350
|
+
function Re(e, t, o, r, n) {
|
|
351
351
|
if (n.crit !== void 0 && (r == null ? void 0 : r.crit) === void 0)
|
|
352
352
|
throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');
|
|
353
353
|
if (!r || r.crit === void 0)
|
|
@@ -366,13 +366,13 @@ function _e(e, t, o, r, n) {
|
|
|
366
366
|
}
|
|
367
367
|
return new Set(r.crit);
|
|
368
368
|
}
|
|
369
|
-
const
|
|
369
|
+
const Te = (e, t) => {
|
|
370
370
|
if (t !== void 0 && (!Array.isArray(t) || t.some((o) => typeof o != "string")))
|
|
371
371
|
throw new TypeError(`"${e}" option must be an array of strings`);
|
|
372
372
|
if (t)
|
|
373
373
|
return new Set(t);
|
|
374
374
|
};
|
|
375
|
-
function
|
|
375
|
+
function ke(e, t) {
|
|
376
376
|
const o = `SHA-${e.slice(-3)}`;
|
|
377
377
|
switch (e) {
|
|
378
378
|
case "HS256":
|
|
@@ -397,28 +397,28 @@ function Te(e, t) {
|
|
|
397
397
|
throw new k(`alg ${e} is not supported either by JOSE or your javascript runtime`);
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
|
-
function
|
|
400
|
+
function Ce(e, t, o) {
|
|
401
401
|
if (G(t))
|
|
402
|
-
return
|
|
402
|
+
return me(t, e, o), t;
|
|
403
403
|
if (t instanceof Uint8Array) {
|
|
404
404
|
if (!e.startsWith("HS"))
|
|
405
405
|
throw new TypeError(J(t, ...E));
|
|
406
|
-
return
|
|
406
|
+
return N.subtle.importKey("raw", t, { hash: `SHA-${e.slice(-3)}`, name: "HMAC" }, !1, [o]);
|
|
407
407
|
}
|
|
408
408
|
throw new TypeError(J(t, ...E, "Uint8Array"));
|
|
409
409
|
}
|
|
410
410
|
const Pe = async (e, t, o, r) => {
|
|
411
|
-
const n = await
|
|
412
|
-
|
|
413
|
-
const a =
|
|
411
|
+
const n = await Ce(e, t, "verify");
|
|
412
|
+
ge(e, n);
|
|
413
|
+
const a = ke(e, n.algorithm);
|
|
414
414
|
try {
|
|
415
|
-
return await
|
|
415
|
+
return await N.subtle.verify(a, n, o, r);
|
|
416
416
|
} catch {
|
|
417
417
|
return !1;
|
|
418
418
|
}
|
|
419
419
|
};
|
|
420
|
-
async function
|
|
421
|
-
if (!
|
|
420
|
+
async function Oe(e, t, o) {
|
|
421
|
+
if (!H(e))
|
|
422
422
|
throw new l("Flattened JWS must be an object");
|
|
423
423
|
if (e.protected === void 0 && e.header === void 0)
|
|
424
424
|
throw new l('Flattened JWS must have either of the "protected" or "header" members');
|
|
@@ -428,70 +428,70 @@ async function Ce(e, t, o) {
|
|
|
428
428
|
throw new l("JWS Payload missing");
|
|
429
429
|
if (typeof e.signature != "string")
|
|
430
430
|
throw new l("JWS Signature missing or incorrect type");
|
|
431
|
-
if (e.header !== void 0 && !
|
|
431
|
+
if (e.header !== void 0 && !H(e.header))
|
|
432
432
|
throw new l("JWS Unprotected Header incorrect type");
|
|
433
433
|
let r = {};
|
|
434
434
|
if (e.protected)
|
|
435
435
|
try {
|
|
436
|
-
const
|
|
437
|
-
r = JSON.parse(T.decode(
|
|
436
|
+
const f = C(e.protected);
|
|
437
|
+
r = JSON.parse(T.decode(f));
|
|
438
438
|
} catch {
|
|
439
439
|
throw new l("JWS Protected Header is invalid");
|
|
440
440
|
}
|
|
441
|
-
if (!
|
|
441
|
+
if (!we(r, e.header))
|
|
442
442
|
throw new l("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");
|
|
443
443
|
const n = {
|
|
444
444
|
...r,
|
|
445
445
|
...e.header
|
|
446
|
-
}, a =
|
|
446
|
+
}, a = Re(l, /* @__PURE__ */ new Map([["b64", !0]]), o == null ? void 0 : o.crit, r, n);
|
|
447
447
|
let s = !0;
|
|
448
448
|
if (a.has("b64") && (s = r.b64, typeof s != "boolean"))
|
|
449
449
|
throw new l('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
|
|
450
450
|
const { alg: i } = n;
|
|
451
451
|
if (typeof i != "string" || !i)
|
|
452
452
|
throw new l('JWS "alg" (Algorithm) Header Parameter missing or invalid');
|
|
453
|
-
const c = o &&
|
|
453
|
+
const c = o && Te("algorithms", o.algorithms);
|
|
454
454
|
if (c && !c.has(i))
|
|
455
|
-
throw new
|
|
455
|
+
throw new he('"alg" (Algorithm) Header Parameter value not allowed');
|
|
456
456
|
if (s) {
|
|
457
457
|
if (typeof e.payload != "string")
|
|
458
458
|
throw new l("JWS Payload must be a string");
|
|
459
459
|
} else if (typeof e.payload != "string" && !(e.payload instanceof Uint8Array))
|
|
460
460
|
throw new l("JWS Payload must be a string or an Uint8Array instance");
|
|
461
|
-
let
|
|
462
|
-
typeof t == "function" && (t = await t(r, e),
|
|
463
|
-
const
|
|
464
|
-
let
|
|
461
|
+
let h = !1;
|
|
462
|
+
typeof t == "function" && (t = await t(r, e), h = !0), ve(i, t, "verify");
|
|
463
|
+
const w = de(_.encode(e.protected ?? ""), _.encode("."), typeof e.payload == "string" ? _.encode(e.payload) : e.payload);
|
|
464
|
+
let p;
|
|
465
465
|
try {
|
|
466
|
-
|
|
466
|
+
p = C(e.signature);
|
|
467
467
|
} catch {
|
|
468
468
|
throw new l("Failed to base64url decode the signature");
|
|
469
469
|
}
|
|
470
|
-
if (!await Pe(i, t,
|
|
471
|
-
throw new
|
|
472
|
-
let
|
|
470
|
+
if (!await Pe(i, t, p, w))
|
|
471
|
+
throw new pe();
|
|
472
|
+
let u;
|
|
473
473
|
if (s)
|
|
474
474
|
try {
|
|
475
|
-
|
|
475
|
+
u = C(e.payload);
|
|
476
476
|
} catch {
|
|
477
477
|
throw new l("Failed to base64url decode the payload");
|
|
478
478
|
}
|
|
479
479
|
else
|
|
480
|
-
typeof e.payload == "string" ?
|
|
481
|
-
const
|
|
482
|
-
return e.protected !== void 0 && (
|
|
480
|
+
typeof e.payload == "string" ? u = _.encode(e.payload) : u = e.payload;
|
|
481
|
+
const y = { payload: u };
|
|
482
|
+
return e.protected !== void 0 && (y.protectedHeader = r), e.header !== void 0 && (y.unprotectedHeader = e.header), h ? { ...y, key: t } : y;
|
|
483
483
|
}
|
|
484
|
-
async function
|
|
484
|
+
async function De(e, t, o) {
|
|
485
485
|
if (e instanceof Uint8Array && (e = T.decode(e)), typeof e != "string")
|
|
486
486
|
throw new l("Compact JWS must be a string or Uint8Array");
|
|
487
487
|
const { 0: r, 1: n, 2: a, length: s } = e.split(".");
|
|
488
488
|
if (s !== 3)
|
|
489
489
|
throw new l("Invalid Compact JWS");
|
|
490
|
-
const i = await
|
|
490
|
+
const i = await Oe({ payload: n, protected: r, signature: a }, t, o), c = { payload: i.payload, protectedHeader: i.protectedHeader };
|
|
491
491
|
return typeof t == "function" ? { ...c, key: i.key } : c;
|
|
492
492
|
}
|
|
493
|
-
const
|
|
494
|
-
const t =
|
|
493
|
+
const He = (e) => Math.floor(e.getTime() / 1e3), Q = 60, Z = Q * 60, U = Z * 24, Ne = U * 7, Ue = U * 365.25, Le = /^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i, K = (e) => {
|
|
494
|
+
const t = Le.exec(e);
|
|
495
495
|
if (!t || t[4] && t[1])
|
|
496
496
|
throw new TypeError("Invalid time period format");
|
|
497
497
|
const o = parseFloat(t[2]), r = t[3].toLowerCase();
|
|
@@ -526,7 +526,7 @@ const De = (e) => Math.floor(e.getTime() / 1e3), Q = 60, Z = Q * 60, U = Z * 24,
|
|
|
526
526
|
case "week":
|
|
527
527
|
case "weeks":
|
|
528
528
|
case "w":
|
|
529
|
-
n = Math.round(o *
|
|
529
|
+
n = Math.round(o * Ne);
|
|
530
530
|
break;
|
|
531
531
|
default:
|
|
532
532
|
n = Math.round(o * Ue);
|
|
@@ -539,63 +539,63 @@ const De = (e) => Math.floor(e.getTime() / 1e3), Q = 60, Z = Q * 60, U = Z * 24,
|
|
|
539
539
|
r = JSON.parse(T.decode(t));
|
|
540
540
|
} catch {
|
|
541
541
|
}
|
|
542
|
-
if (!
|
|
542
|
+
if (!H(r))
|
|
543
543
|
throw new Y("JWT Claims Set must be a top-level JSON object");
|
|
544
544
|
const { typ: n } = o;
|
|
545
545
|
if (n && (typeof e.typ != "string" || W(e.typ) !== W(n)))
|
|
546
|
-
throw new
|
|
547
|
-
const { requiredClaims: a = [], issuer: s, subject: i, audience: c, maxTokenAge:
|
|
548
|
-
|
|
549
|
-
for (const
|
|
550
|
-
if (!(
|
|
551
|
-
throw new
|
|
546
|
+
throw new m('unexpected "typ" JWT header value', r, "typ", "check_failed");
|
|
547
|
+
const { requiredClaims: a = [], issuer: s, subject: i, audience: c, maxTokenAge: h } = o, w = [...a];
|
|
548
|
+
h !== void 0 && w.push("iat"), c !== void 0 && w.push("aud"), i !== void 0 && w.push("sub"), s !== void 0 && w.push("iss");
|
|
549
|
+
for (const f of new Set(w.reverse()))
|
|
550
|
+
if (!(f in r))
|
|
551
|
+
throw new m(`missing required "${f}" claim`, r, f, "missing");
|
|
552
552
|
if (s && !(Array.isArray(s) ? s : [s]).includes(r.iss))
|
|
553
|
-
throw new
|
|
553
|
+
throw new m('unexpected "iss" claim value', r, "iss", "check_failed");
|
|
554
554
|
if (i && r.sub !== i)
|
|
555
|
-
throw new
|
|
555
|
+
throw new m('unexpected "sub" claim value', r, "sub", "check_failed");
|
|
556
556
|
if (c && !Je(r.aud, typeof c == "string" ? [c] : c))
|
|
557
|
-
throw new
|
|
558
|
-
let
|
|
557
|
+
throw new m('unexpected "aud" claim value', r, "aud", "check_failed");
|
|
558
|
+
let p;
|
|
559
559
|
switch (typeof o.clockTolerance) {
|
|
560
560
|
case "string":
|
|
561
|
-
|
|
561
|
+
p = K(o.clockTolerance);
|
|
562
562
|
break;
|
|
563
563
|
case "number":
|
|
564
|
-
|
|
564
|
+
p = o.clockTolerance;
|
|
565
565
|
break;
|
|
566
566
|
case "undefined":
|
|
567
|
-
|
|
567
|
+
p = 0;
|
|
568
568
|
break;
|
|
569
569
|
default:
|
|
570
570
|
throw new TypeError("Invalid clockTolerance option type");
|
|
571
571
|
}
|
|
572
|
-
const { currentDate:
|
|
573
|
-
if ((r.iat !== void 0 ||
|
|
574
|
-
throw new
|
|
572
|
+
const { currentDate: u } = o, y = He(u || /* @__PURE__ */ new Date());
|
|
573
|
+
if ((r.iat !== void 0 || h) && typeof r.iat != "number")
|
|
574
|
+
throw new m('"iat" claim must be a number', r, "iat", "invalid");
|
|
575
575
|
if (r.nbf !== void 0) {
|
|
576
576
|
if (typeof r.nbf != "number")
|
|
577
|
-
throw new
|
|
578
|
-
if (r.nbf >
|
|
579
|
-
throw new
|
|
577
|
+
throw new m('"nbf" claim must be a number', r, "nbf", "invalid");
|
|
578
|
+
if (r.nbf > y + p)
|
|
579
|
+
throw new m('"nbf" claim timestamp check failed', r, "nbf", "check_failed");
|
|
580
580
|
}
|
|
581
581
|
if (r.exp !== void 0) {
|
|
582
582
|
if (typeof r.exp != "number")
|
|
583
|
-
throw new
|
|
584
|
-
if (r.exp <=
|
|
585
|
-
throw new
|
|
583
|
+
throw new m('"exp" claim must be a number', r, "exp", "invalid");
|
|
584
|
+
if (r.exp <= y - p)
|
|
585
|
+
throw new L('"exp" claim timestamp check failed', r, "exp", "check_failed");
|
|
586
586
|
}
|
|
587
|
-
if (
|
|
588
|
-
const
|
|
589
|
-
if (
|
|
590
|
-
throw new
|
|
591
|
-
if (
|
|
592
|
-
throw new
|
|
587
|
+
if (h) {
|
|
588
|
+
const f = y - r.iat, oe = typeof h == "number" ? h : K(h);
|
|
589
|
+
if (f - p > oe)
|
|
590
|
+
throw new L('"iat" claim timestamp check failed (too far in the past)', r, "iat", "check_failed");
|
|
591
|
+
if (f < 0 - p)
|
|
592
|
+
throw new m('"iat" claim timestamp check failed (it should be in the past)', r, "iat", "check_failed");
|
|
593
593
|
}
|
|
594
594
|
return r;
|
|
595
595
|
};
|
|
596
|
-
async function
|
|
596
|
+
async function Ke(e, t, o) {
|
|
597
597
|
var r;
|
|
598
|
-
const n = await
|
|
598
|
+
const n = await De(e, t, o);
|
|
599
599
|
if ((r = n.protectedHeader.crit) != null && r.includes("b64") && n.protectedHeader.b64 === !1)
|
|
600
600
|
throw new Y("JWTs MUST NOT use unencoded payload");
|
|
601
601
|
const a = { payload: $e(n.protectedHeader, n.payload, o), protectedHeader: n.protectedHeader };
|
|
@@ -605,11 +605,12 @@ const We = {
|
|
|
605
605
|
ID_TOKEN: "id_token"
|
|
606
606
|
}, xe = {
|
|
607
607
|
CLIENT_ID: "X-Auth-ClientId"
|
|
608
|
-
},
|
|
608
|
+
}, A = {
|
|
609
609
|
ALG: "RS256",
|
|
610
610
|
USER_ID_KEY: "_id",
|
|
611
|
+
TOKEN_ID_KEY: "__raw",
|
|
611
612
|
ISSUER: "gizmette.com"
|
|
612
|
-
},
|
|
613
|
+
}, je = `-----BEGIN PUBLIC KEY-----
|
|
613
614
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsF6i3Jd9fY/3COqCw/m7
|
|
614
615
|
w5PKyTYLGAI2I6SIIdpe6i6DOCbEkmDz7LdVsBqwNtVi8gvWYIj+8ol6rU3qu1v5
|
|
615
616
|
i1Jd45GSK4kzkVdgCmQZbM5ak0KI99q5wsrAIzUd+LRJ2HRvWtr5IYdsIiXaQjle
|
|
@@ -619,9 +620,9 @@ sjqybA9mARAqh9k/eiIopecWSiffNQTwVQVd2I9ZH3BalhEXHlqFgrjz51kFqg81
|
|
|
619
620
|
awIDAQAB
|
|
620
621
|
-----END PUBLIC KEY-----`, ee = async (e, t) => {
|
|
621
622
|
try {
|
|
622
|
-
const o =
|
|
623
|
-
return await
|
|
624
|
-
issuer:
|
|
623
|
+
const o = A.ALG, r = await be(je, o);
|
|
624
|
+
return await Ke(e, r, {
|
|
625
|
+
issuer: A.ISSUER,
|
|
625
626
|
audience: t
|
|
626
627
|
});
|
|
627
628
|
} catch {
|
|
@@ -636,21 +637,21 @@ const x = (e, t) => {
|
|
|
636
637
|
typeof t == "function" ? t() : t
|
|
637
638
|
);
|
|
638
639
|
window.localStorage.setItem(e, o), te(e, o);
|
|
639
|
-
},
|
|
640
|
+
}, Me = (e) => {
|
|
640
641
|
window.localStorage.removeItem(e), te(e, null);
|
|
641
|
-
},
|
|
642
|
-
function
|
|
642
|
+
}, j = (e) => window.localStorage.getItem(e), Ve = (e) => (window.addEventListener("storage", e), () => window.removeEventListener("storage", e));
|
|
643
|
+
function Be({
|
|
643
644
|
key: e,
|
|
644
645
|
initialValue: t
|
|
645
646
|
}) {
|
|
646
|
-
const o = () =>
|
|
647
|
-
|
|
647
|
+
const o = () => j(e), r = I.useSyncExternalStore(
|
|
648
|
+
Ve,
|
|
648
649
|
o
|
|
649
650
|
), n = I.useCallback(
|
|
650
651
|
(i) => {
|
|
651
652
|
try {
|
|
652
653
|
const c = typeof i == "function" ? i(JSON.parse(r)) : i;
|
|
653
|
-
c == null ?
|
|
654
|
+
c == null ? Me(e) : x(e, c);
|
|
654
655
|
} catch (c) {
|
|
655
656
|
console.warn(c);
|
|
656
657
|
}
|
|
@@ -663,43 +664,43 @@ function Ve({
|
|
|
663
664
|
}, [n]);
|
|
664
665
|
return I.useEffect(() => {
|
|
665
666
|
try {
|
|
666
|
-
|
|
667
|
+
j(e) === null && typeof t < "u" && x(e, t);
|
|
667
668
|
} catch (i) {
|
|
668
669
|
console.warn(i);
|
|
669
670
|
}
|
|
670
671
|
}, [e, t]), [r ? JSON.parse(r) : null, n, a, s];
|
|
671
672
|
}
|
|
672
|
-
const
|
|
673
|
+
const O = "Oops! It looks like your session has expired. For your security, please log in again to continue.", Fe = "Your session has been successfully terminated.", Ge = "Login failed. Please try again.", Ye = "You forgot to wrap your component in <AuthProvider>.", M = {
|
|
673
674
|
dev: "https://auth.gizmette.local.com:3003",
|
|
674
675
|
prod: "https://mylogin.gizmette.com"
|
|
675
|
-
},
|
|
676
|
+
}, qe = "@@auth@@";
|
|
676
677
|
var d = [];
|
|
677
|
-
for (var
|
|
678
|
-
d.push((
|
|
679
|
-
function
|
|
678
|
+
for (var D = 0; D < 256; ++D)
|
|
679
|
+
d.push((D + 256).toString(16).slice(1));
|
|
680
|
+
function ze(e, t = 0) {
|
|
680
681
|
return (d[e[t + 0]] + d[e[t + 1]] + d[e[t + 2]] + d[e[t + 3]] + "-" + d[e[t + 4]] + d[e[t + 5]] + "-" + d[e[t + 6]] + d[e[t + 7]] + "-" + d[e[t + 8]] + d[e[t + 9]] + "-" + d[e[t + 10]] + d[e[t + 11]] + d[e[t + 12]] + d[e[t + 13]] + d[e[t + 14]] + d[e[t + 15]]).toLowerCase();
|
|
681
682
|
}
|
|
682
|
-
var R,
|
|
683
|
-
function
|
|
683
|
+
var R, Xe = new Uint8Array(16);
|
|
684
|
+
function Qe() {
|
|
684
685
|
if (!R && (R = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !R))
|
|
685
686
|
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
|
|
686
|
-
return R(
|
|
687
|
+
return R(Xe);
|
|
687
688
|
}
|
|
688
|
-
var
|
|
689
|
+
var Ze = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
|
689
690
|
const V = {
|
|
690
|
-
randomUUID:
|
|
691
|
+
randomUUID: Ze
|
|
691
692
|
};
|
|
692
|
-
function
|
|
693
|
+
function et(e, t, o) {
|
|
693
694
|
if (V.randomUUID && !t && !e)
|
|
694
695
|
return V.randomUUID();
|
|
695
696
|
e = e || {};
|
|
696
|
-
var r = e.random || (e.rng ||
|
|
697
|
-
return r[6] = r[6] & 15 | 64, r[8] = r[8] & 63 | 128,
|
|
697
|
+
var r = e.random || (e.rng || Qe)();
|
|
698
|
+
return r[6] = r[6] & 15 | 64, r[8] = r[8] & 63 | 128, ze(r);
|
|
698
699
|
}
|
|
699
|
-
const
|
|
700
|
+
const tt = process.env.NODE_ENV === "production", rt = !tt, ot = async ({ params: e = {} }) => {
|
|
700
701
|
try {
|
|
701
|
-
const t =
|
|
702
|
-
|
|
702
|
+
const t = et(), o = await fetch(
|
|
703
|
+
rt ? `${M.dev}/authenticate` : `${M.prod}/authenticate`,
|
|
703
704
|
{
|
|
704
705
|
credentials: "include",
|
|
705
706
|
method: "POST",
|
|
@@ -721,14 +722,14 @@ const Ze = process.env.NODE_ENV === "production", et = !Ze, tt = async ({ params
|
|
|
721
722
|
} catch (t) {
|
|
722
723
|
return console.error(t), { status: 500, data: [] };
|
|
723
724
|
}
|
|
724
|
-
},
|
|
725
|
+
}, nt = async ({
|
|
725
726
|
username: e,
|
|
726
727
|
password: t,
|
|
727
728
|
clientId: o,
|
|
728
729
|
sessionExpiration: r
|
|
729
730
|
}) => {
|
|
730
731
|
try {
|
|
731
|
-
const n = await
|
|
732
|
+
const n = await ot({
|
|
732
733
|
params: {
|
|
733
734
|
type: We.ID_TOKEN,
|
|
734
735
|
username: e,
|
|
@@ -737,9 +738,9 @@ const Ze = process.env.NODE_ENV === "production", et = !Ze, tt = async ({ params
|
|
|
737
738
|
clientId: o
|
|
738
739
|
}
|
|
739
740
|
}), a = await ee(n.data.idToken, o);
|
|
740
|
-
return a && a.payload[
|
|
741
|
+
return a && a.payload[A.USER_ID_KEY] !== "" ? {
|
|
741
742
|
idToken: n.data.idToken,
|
|
742
|
-
userId: a.payload[
|
|
743
|
+
userId: a.payload[A.USER_ID_KEY],
|
|
743
744
|
status: !0
|
|
744
745
|
} : {
|
|
745
746
|
status: !1
|
|
@@ -750,77 +751,83 @@ const Ze = process.env.NODE_ENV === "production", et = !Ze, tt = async ({ params
|
|
|
750
751
|
};
|
|
751
752
|
}
|
|
752
753
|
};
|
|
753
|
-
function
|
|
754
|
+
function at(e) {
|
|
754
755
|
const t = ae();
|
|
755
756
|
return F(() => {
|
|
756
757
|
t.current = e;
|
|
757
758
|
}), t.current;
|
|
758
759
|
}
|
|
759
760
|
const B = () => {
|
|
760
|
-
throw new Error(
|
|
761
|
+
throw new Error(Ye);
|
|
761
762
|
}, re = se({
|
|
762
763
|
isAuthenticated: !1,
|
|
764
|
+
isLoading: !1,
|
|
763
765
|
login: B,
|
|
764
766
|
logout: B,
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
logoutReason: ""
|
|
769
|
-
}), it = ({
|
|
767
|
+
logoutReason: "",
|
|
768
|
+
idTokenClaims: null
|
|
769
|
+
}), ut = ({
|
|
770
770
|
children: e,
|
|
771
771
|
sessionExpiration: t,
|
|
772
772
|
clientId: o
|
|
773
773
|
}) => {
|
|
774
|
-
const [r, n, , a] =
|
|
775
|
-
key: `${
|
|
774
|
+
const [r, n, , a] = Be({
|
|
775
|
+
key: `${qe}::${o}::@@user@@`
|
|
776
776
|
}), [s, i] = ie({
|
|
777
|
-
|
|
777
|
+
isLoading: !0,
|
|
778
|
+
isAuthenticated: !1,
|
|
778
779
|
logoutReason: "",
|
|
779
|
-
userId: ""
|
|
780
|
-
|
|
780
|
+
userId: "",
|
|
781
|
+
idTokenClaims: null
|
|
782
|
+
}), c = at(r) || "", h = ce(
|
|
783
|
+
(u) => {
|
|
784
|
+
i({
|
|
785
|
+
isLoading: !1,
|
|
786
|
+
isAuthenticated: !1,
|
|
787
|
+
logoutReason: u || O,
|
|
788
|
+
userId: "",
|
|
789
|
+
idTokenClaims: null
|
|
790
|
+
}), a();
|
|
791
|
+
},
|
|
792
|
+
[a]
|
|
793
|
+
);
|
|
781
794
|
F(() => {
|
|
782
795
|
c !== r && r !== null && (async () => {
|
|
783
796
|
try {
|
|
784
797
|
const u = await ee(r, o);
|
|
785
|
-
u && u.payload[
|
|
798
|
+
u && u.payload[A.USER_ID_KEY] !== "" ? i({
|
|
799
|
+
isLoading: !1,
|
|
786
800
|
isAuthenticated: !0,
|
|
787
801
|
logoutReason: "",
|
|
788
|
-
userId: u.payload[
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
});
|
|
802
|
+
userId: u.payload[A.USER_ID_KEY],
|
|
803
|
+
idTokenClaims: {
|
|
804
|
+
...u == null ? void 0 : u.payload,
|
|
805
|
+
[A.TOKEN_ID_KEY]: r
|
|
806
|
+
}
|
|
807
|
+
}) : h(O);
|
|
794
808
|
} catch {
|
|
795
|
-
|
|
796
|
-
isAuthenticated: !1,
|
|
797
|
-
logoutReason: j,
|
|
798
|
-
userId: ""
|
|
799
|
-
});
|
|
809
|
+
h(O);
|
|
800
810
|
}
|
|
801
811
|
})();
|
|
802
|
-
}, [r, c, o]);
|
|
803
|
-
const
|
|
804
|
-
const
|
|
812
|
+
}, [r, c, o, h]);
|
|
813
|
+
const w = async (u, y) => {
|
|
814
|
+
const f = await nt({
|
|
805
815
|
username: u,
|
|
806
|
-
password:
|
|
816
|
+
password: y,
|
|
807
817
|
clientId: o,
|
|
808
818
|
sessionExpiration: t
|
|
809
819
|
});
|
|
810
|
-
return
|
|
820
|
+
return f.status ? (n(f.idToken), i({
|
|
821
|
+
isLoading: !1,
|
|
811
822
|
isAuthenticated: !0,
|
|
812
|
-
userId:
|
|
813
|
-
}), !0) : !1;
|
|
814
|
-
},
|
|
815
|
-
|
|
816
|
-
isAuthenticated: !1,
|
|
817
|
-
logoutReason: Be,
|
|
818
|
-
userId: ""
|
|
819
|
-
}), a();
|
|
823
|
+
userId: f.userId
|
|
824
|
+
}), !0) : (h(Ge), !1);
|
|
825
|
+
}, p = () => {
|
|
826
|
+
h(Fe);
|
|
820
827
|
};
|
|
821
|
-
return /* @__PURE__ */ ne(re.Provider, { value: { ...s, login:
|
|
822
|
-
},
|
|
828
|
+
return /* @__PURE__ */ ne(re.Provider, { value: { ...s, login: w, logout: p }, children: e });
|
|
829
|
+
}, dt = (e = re) => ue(e);
|
|
823
830
|
export {
|
|
824
|
-
|
|
825
|
-
|
|
831
|
+
ut as AuthProvider,
|
|
832
|
+
dt as useAuth
|
|
826
833
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@versini/auth-provider",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Arno Versini",
|
|
6
6
|
"publishConfig": {
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"react-dom": "18.3.1"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@versini/auth-common": "2.
|
|
47
|
+
"@versini/auth-common": "2.3.0",
|
|
48
48
|
"@versini/ui-hooks": "4.0.0",
|
|
49
49
|
"jose": "5.4.1",
|
|
50
50
|
"uuid": "10.0.0"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "b9b733518d3e78c87fbb366cb4e5668a7a928cdd"
|
|
53
53
|
}
|