@criipto/verify-react 4.1.4 → 5.0.2
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/README.md +20 -13
- package/deploy-preview.sh +19 -0
- package/dist/index.css +223 -0
- package/dist/index.d.ts +267 -14
- package/dist/index.js +1948 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -33
- package/tsconfig.json +8 -99
- package/tsdown.config.ts +23 -0
- package/dist/__tests__/provider.test.d.ts +0 -1
- package/dist/__tests__/utils.test.d.ts +0 -1
- package/dist/components/AuthButtonGroup.d.ts +0 -10
- package/dist/components/AuthMethodButton/Logo.d.ts +0 -10
- package/dist/components/AuthMethodButton.d.ts +0 -45
- package/dist/components/AuthMethodSelector.d.ts +0 -17
- package/dist/components/Button.d.ts +0 -12
- package/dist/components/QRCode.d.ts +0 -29
- package/dist/components/SEBankIDQRCode/SEBankIDQRCode.test.d.ts +0 -1
- package/dist/components/SEBankIDQRCode.d.ts +0 -53
- package/dist/components/SEBankIDSameDeviceButton/Foreground.d.ts +0 -12
- package/dist/components/SEBankIDSameDeviceButton/Poll.d.ts +0 -12
- package/dist/components/SEBankIDSameDeviceButton/Reload.d.ts +0 -15
- package/dist/components/SEBankIDSameDeviceButton/__tests__/Foreground.test.d.ts +0 -1
- package/dist/components/SEBankIDSameDeviceButton/__tests__/Reload.test.d.ts +0 -1
- package/dist/components/SEBankIDSameDeviceButton/__tests__/strategy.test.d.ts +0 -1
- package/dist/components/SEBankIDSameDeviceButton/__tests__/usePoll.test.d.ts +0 -1
- package/dist/components/SEBankIDSameDeviceButton/shared.d.ts +0 -19
- package/dist/components/SEBankIDSameDeviceButton/usePoll.d.ts +0 -7
- package/dist/components/SEBankIDSameDeviceButton.d.ts +0 -21
- package/dist/context.d.ts +0 -61
- package/dist/criipto-verify-react.cjs.js +0 -2
- package/dist/criipto-verify-react.cjs.js.map +0 -1
- package/dist/criipto-verify-react.css +0 -298
- package/dist/criipto-verify-react.esm.js +0 -2
- package/dist/criipto-verify-react.esm.js.map +0 -1
- package/dist/device.d.ts +0 -7
- package/dist/hooks/useNow.d.ts +0 -1
- package/dist/hooks/usePageVisibility.d.ts +0 -2
- package/dist/i18n/da.d.ts +0 -19
- package/dist/i18n/de.d.ts +0 -19
- package/dist/i18n/en.d.ts +0 -19
- package/dist/i18n/fi.d.ts +0 -19
- package/dist/i18n/index.d.ts +0 -4
- package/dist/i18n/nb.d.ts +0 -19
- package/dist/i18n/nl.d.ts +0 -19
- package/dist/i18n/sv.d.ts +0 -19
- package/dist/memory-storage.d.ts +0 -1
- package/dist/provider.d.ts +0 -66
- package/dist/stories/StoryResponseRenderer.d.ts +0 -6
- package/dist/use-criipto-verify.d.ts +0 -30
- package/dist/utils.d.ts +0 -25
package/dist/index.js
ADDED
|
@@ -0,0 +1,1948 @@
|
|
|
1
|
+
import React, { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import CriiptoAuth, { OAuth2Error, OAuth2Error as OAuth2Error$1, UserCancelledError, clearPKCEState, generatePKCE, parseAuthorizeResponseFromLocation, savePKCEState } from "@criipto/auth-js";
|
|
3
|
+
import jwtDecode from "jwt-decode";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { UAParser } from "@ua-parser-js/pro-enterprise";
|
|
6
|
+
import QRCode$1 from "qrcode";
|
|
7
|
+
import classNames from "classnames";
|
|
8
|
+
//#region src/context.ts
|
|
9
|
+
const actions = [
|
|
10
|
+
"confirm",
|
|
11
|
+
"accept",
|
|
12
|
+
"approve",
|
|
13
|
+
"sign",
|
|
14
|
+
"login"
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* @ignore
|
|
18
|
+
*/
|
|
19
|
+
const stub = () => {
|
|
20
|
+
throw new Error("You forgot to wrap your component in <CriiptoVerifyProvider>.");
|
|
21
|
+
};
|
|
22
|
+
const CriiptoVerifyContext = createContext({
|
|
23
|
+
loginWithRedirect: stub,
|
|
24
|
+
loginWithPopup: stub,
|
|
25
|
+
checkSession: stub,
|
|
26
|
+
logout: stub,
|
|
27
|
+
fetchOpenIDConfiguration: stub,
|
|
28
|
+
buildAuthorizeUrl: stub,
|
|
29
|
+
initializePAR: stub,
|
|
30
|
+
generatePKCE: stub,
|
|
31
|
+
buildOptions: stub,
|
|
32
|
+
handleResponse: stub,
|
|
33
|
+
responseType: "token",
|
|
34
|
+
completionStrategy: "client",
|
|
35
|
+
result: null,
|
|
36
|
+
claims: null,
|
|
37
|
+
domain: "",
|
|
38
|
+
action: "login",
|
|
39
|
+
pkce: void 0,
|
|
40
|
+
store: null,
|
|
41
|
+
isLoading: false,
|
|
42
|
+
isInitializing: true,
|
|
43
|
+
client: null,
|
|
44
|
+
loginHint: void 0
|
|
45
|
+
});
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region package.json
|
|
48
|
+
var version = "5.0.2";
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/i18n/en.ts
|
|
51
|
+
const en = {
|
|
52
|
+
loginWith: "Login with",
|
|
53
|
+
approveWith: "Approve with",
|
|
54
|
+
signWith: "Sign with",
|
|
55
|
+
confirmWith: "Confirm with",
|
|
56
|
+
acceptWith: "Accept with",
|
|
57
|
+
sameDevice: "On this device",
|
|
58
|
+
anotherDevice: "With your SSN",
|
|
59
|
+
anotherDeviceQR: "On another device",
|
|
60
|
+
mitidBusiness: "MitID Business",
|
|
61
|
+
finnishMobileID: "Finnish Mobile Certificate",
|
|
62
|
+
finnishBankID: "Finnish Bank ID",
|
|
63
|
+
swedishBankID: "Swedish BankID",
|
|
64
|
+
norwegianBankID: "Norwegian BankID",
|
|
65
|
+
biometrics: "Biometrics",
|
|
66
|
+
openAndScan: "Open the BankID app on your mobile device and scan the QR code.",
|
|
67
|
+
thisIsTheQR: "This is a BankID QR Code. You can click it to view it in full screen.",
|
|
68
|
+
completingLogin: "Completing your login."
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/i18n/da.ts
|
|
72
|
+
const da = {
|
|
73
|
+
loginWith: "Login med",
|
|
74
|
+
approveWith: "Godkend med",
|
|
75
|
+
signWith: "Underskriv med",
|
|
76
|
+
confirmWith: "Bekræft med",
|
|
77
|
+
acceptWith: "Accepter med",
|
|
78
|
+
sameDevice: "På denne enhed",
|
|
79
|
+
anotherDevice: "Med dit personnummer",
|
|
80
|
+
anotherDeviceQR: "På anden enhed",
|
|
81
|
+
mitidBusiness: "MitID Erhverv",
|
|
82
|
+
finnishMobileID: "Finsk Mobilcertifikat",
|
|
83
|
+
finnishBankID: "Finsk Bank ID",
|
|
84
|
+
swedishBankID: "Svensk BankID",
|
|
85
|
+
norwegianBankID: "Norsk BankID",
|
|
86
|
+
biometrics: "Biometri",
|
|
87
|
+
openAndScan: "Åbn BankID appen på din telefon og scan QR koden.",
|
|
88
|
+
thisIsTheQR: "Dette er en BankID QR-kode. Du kan klikke på den for at se den i fuld skærm.",
|
|
89
|
+
completingLogin: "Fuldfører dit login."
|
|
90
|
+
};
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/i18n/sv.ts
|
|
93
|
+
const sv = {
|
|
94
|
+
loginWith: "Logga in med",
|
|
95
|
+
approveWith: "Godkänn med",
|
|
96
|
+
signWith: "Signera med",
|
|
97
|
+
confirmWith: "Bekräfta med",
|
|
98
|
+
acceptWith: "Acceptera med",
|
|
99
|
+
sameDevice: "På denna enhet",
|
|
100
|
+
anotherDevice: "Med ditt personnummer",
|
|
101
|
+
anotherDeviceQR: "På annan enhet",
|
|
102
|
+
mitidBusiness: "MitID Erhverv",
|
|
103
|
+
finnishMobileID: "Finskt Mobilcertifikat",
|
|
104
|
+
finnishBankID: "Finskt Bank ID",
|
|
105
|
+
swedishBankID: "Svenskt BankID",
|
|
106
|
+
norwegianBankID: "Norska BankID",
|
|
107
|
+
biometrics: "Biometri",
|
|
108
|
+
openAndScan: "Öppna BankID-appen på din mobila enhet och skanna QR-koden.",
|
|
109
|
+
thisIsTheQR: "Detta är en QR-kod från BankID. Du kan klicka på den för att visa den i fullskärm.",
|
|
110
|
+
completingLogin: "Slutför din inloggning."
|
|
111
|
+
};
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/i18n/nb.ts
|
|
114
|
+
const nb = {
|
|
115
|
+
loginWith: "Logg inn med",
|
|
116
|
+
approveWith: "Godkjenne med",
|
|
117
|
+
signWith: "Signer med",
|
|
118
|
+
confirmWith: "Bekreft med",
|
|
119
|
+
acceptWith: "Aksepterer med",
|
|
120
|
+
sameDevice: "På denne enhet",
|
|
121
|
+
anotherDevice: "Med personnummeret ditt",
|
|
122
|
+
anotherDeviceQR: "På annan enhet",
|
|
123
|
+
mitidBusiness: "MitID Erhverv",
|
|
124
|
+
finnishMobileID: "Finsk Mobilsertifikat",
|
|
125
|
+
finnishBankID: "Finsk Bank ID",
|
|
126
|
+
swedishBankID: "Svensk BankID",
|
|
127
|
+
norwegianBankID: "Norsk BankID",
|
|
128
|
+
biometrics: "Biometri",
|
|
129
|
+
openAndScan: "Åpne BankID-appen på mobilenheten din og skann QR-koden.",
|
|
130
|
+
thisIsTheQR: "Dette er en BankID QR-kode. Du kan klikke på den for å se den i fullskjerm.",
|
|
131
|
+
completingLogin: "Fullfører påloggingen."
|
|
132
|
+
};
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region src/i18n/fi.ts
|
|
135
|
+
const fi = {
|
|
136
|
+
loginWith: "Kirjaudu sisään",
|
|
137
|
+
approveWith: "Hyväksy",
|
|
138
|
+
signWith: "Allekirjoita",
|
|
139
|
+
confirmWith: "Vahvista",
|
|
140
|
+
acceptWith: "Hyväksy",
|
|
141
|
+
sameDevice: "Tällä laitteella",
|
|
142
|
+
anotherDevice: "Henkilötunnuksellasi",
|
|
143
|
+
anotherDeviceQR: "Toisella laitteella",
|
|
144
|
+
mitidBusiness: "MitID Businessilla",
|
|
145
|
+
finnishMobileID: "Suomalaisella Mobiilivarmenteella",
|
|
146
|
+
finnishBankID: "Suomalaisella BankID:llä",
|
|
147
|
+
swedishBankID: "Ruotsalaisella BankID:llä",
|
|
148
|
+
norwegianBankID: "Norjalaisella BankID:llä",
|
|
149
|
+
biometrics: "Biometrisella tunnistautumisella",
|
|
150
|
+
openAndScan: "Avaa BankID-sovellus mobiililaitteellasi ja skannaa QR-koodi.",
|
|
151
|
+
thisIsTheQR: "Tämä on BankID-QR-koodi. Voit napsauttaa sitä nähdäksesi sen koko näytöllä",
|
|
152
|
+
completingLogin: "Sisäänkirjautumista viimeistellään."
|
|
153
|
+
};
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region src/i18n/de.ts
|
|
156
|
+
const de = {
|
|
157
|
+
loginWith: "Anmelden mit",
|
|
158
|
+
approveWith: "Genehmigen mit",
|
|
159
|
+
signWith: "Unterschreiben mit",
|
|
160
|
+
confirmWith: "Bestätigen mit",
|
|
161
|
+
acceptWith: "Akzeptieren mit",
|
|
162
|
+
sameDevice: "Auf diesem Gerät",
|
|
163
|
+
anotherDevice: "Mit Ihrer Sozialversicherungsnummer",
|
|
164
|
+
anotherDeviceQR: "Auf einem anderen Gerät",
|
|
165
|
+
mitidBusiness: "MitID Business",
|
|
166
|
+
finnishMobileID: "Finnischem Mobilfunkzertifikat",
|
|
167
|
+
finnishBankID: "Finnische BankID",
|
|
168
|
+
swedishBankID: "Schwedische BankID",
|
|
169
|
+
norwegianBankID: "Norwegische BankID",
|
|
170
|
+
biometrics: "Biometrie",
|
|
171
|
+
openAndScan: "Öffnen Sie die BankID-App auf Ihrem mobilen Endgerät und scannen Sie den QR-Code.",
|
|
172
|
+
thisIsTheQR: "Dies ist ein BankID QR-Code. Sie können darauf klicken, um ihn im Vollbildmodus anzuzeigen",
|
|
173
|
+
completingLogin: "Ihre Anmeldung wird abgeschlossen."
|
|
174
|
+
};
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/i18n/nl.ts
|
|
177
|
+
const nl = {
|
|
178
|
+
loginWith: "Inloggen met",
|
|
179
|
+
approveWith: "Goedkeuren met",
|
|
180
|
+
signWith: "Ondertekenen met",
|
|
181
|
+
confirmWith: "Bevestigen met",
|
|
182
|
+
acceptWith: "Accepteren met",
|
|
183
|
+
sameDevice: "Op dit apparaat",
|
|
184
|
+
anotherDevice: "Met uw SSN",
|
|
185
|
+
anotherDeviceQR: "Op een ander apparaat",
|
|
186
|
+
mitidBusiness: "MitID Business",
|
|
187
|
+
finnishMobileID: "Finse mobiel certificaat",
|
|
188
|
+
finnishBankID: "Finse BankID",
|
|
189
|
+
swedishBankID: "Zweedse BankID",
|
|
190
|
+
norwegianBankID: "Noorse BankID",
|
|
191
|
+
biometrics: "Biometrie",
|
|
192
|
+
openAndScan: "Open de BankID-app op uw mobiele apparaat en scan de QR-code.",
|
|
193
|
+
thisIsTheQR: "Dit is een BankID QR-code. U kunt erop klikken om het in een volledig scherm te bekijken",
|
|
194
|
+
completingLogin: "Uw login voltooien."
|
|
195
|
+
};
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/i18n/index.ts
|
|
198
|
+
function getI18n(language) {
|
|
199
|
+
switch (language) {
|
|
200
|
+
case "en": return en;
|
|
201
|
+
case "da": return da;
|
|
202
|
+
case "sv": return sv;
|
|
203
|
+
case "nb": return nb;
|
|
204
|
+
case "fi": return fi;
|
|
205
|
+
case "de": return de;
|
|
206
|
+
case "nl": return nl;
|
|
207
|
+
default: assertUnreachable(language);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/utils.ts
|
|
212
|
+
const DKMITID_PREFIX = "urn:grn:authn:dk:mitid";
|
|
213
|
+
const FTN_PREFIX = "urn:grn:authn:fi";
|
|
214
|
+
function lowestMitIDValue(input) {
|
|
215
|
+
let dkmitidMethod = null;
|
|
216
|
+
input.forEach((s) => {
|
|
217
|
+
if (s.startsWith("urn:grn:authn:dk:mitid") && s !== "urn:grn:authn:dk:mitid:business") if (!dkmitidMethod) dkmitidMethod = s;
|
|
218
|
+
else {
|
|
219
|
+
let newLevel = s.replace(DKMITID_PREFIX, "");
|
|
220
|
+
let oldLevel = dkmitidMethod.replace(DKMITID_PREFIX, "");
|
|
221
|
+
if (newLevel === ":low" && [":substantial", ":high"].includes(oldLevel)) dkmitidMethod = s;
|
|
222
|
+
else if (newLevel === ":substantial" && oldLevel === ":high") dkmitidMethod = s;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
return dkmitidMethod;
|
|
226
|
+
}
|
|
227
|
+
function autoTitleCase(input) {
|
|
228
|
+
return input.split(/:|-/).map((segment) => {
|
|
229
|
+
segment = segment.replace(/id(\s|$)/, "ID");
|
|
230
|
+
if (segment.length === 2) return segment.toUpperCase();
|
|
231
|
+
return segment.substr(0, 1).toUpperCase() + segment.substr(1);
|
|
232
|
+
}).join(" ");
|
|
233
|
+
}
|
|
234
|
+
function assertUnreachable(x) {
|
|
235
|
+
throw new Error("Didn't expect to get here");
|
|
236
|
+
}
|
|
237
|
+
function stringifyAction(language, action) {
|
|
238
|
+
const i18n = getI18n(language);
|
|
239
|
+
switch (action) {
|
|
240
|
+
case "login": return i18n.loginWith;
|
|
241
|
+
case "approve": return i18n.approveWith;
|
|
242
|
+
case "sign": return i18n.signWith;
|
|
243
|
+
case "confirm": return i18n.confirmWith;
|
|
244
|
+
case "accept": return i18n.acceptWith;
|
|
245
|
+
default: assertUnreachable(action);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function acrValueToProviderPrefix(value) {
|
|
249
|
+
value = value.replace("urn:grn:authn:", "");
|
|
250
|
+
if (value.startsWith("fi")) return "fi";
|
|
251
|
+
else if (value.startsWith("itsme")) return "itsme";
|
|
252
|
+
else return value.split(":").slice(0, 2).join(":");
|
|
253
|
+
}
|
|
254
|
+
function acrValueToTitle(language, value, { disambiguate }) {
|
|
255
|
+
const i18n = getI18n(language);
|
|
256
|
+
value = value.replace("urn:grn:authn:", "");
|
|
257
|
+
const provider = acrValueToProviderPrefix(value);
|
|
258
|
+
if (provider === "dk:mitid") {
|
|
259
|
+
if (value.replace("dk:mitid:", "") === "business") return { title: i18n.mitidBusiness };
|
|
260
|
+
return { title: "MitID" };
|
|
261
|
+
}
|
|
262
|
+
if (value === "fi:mobile-id") return { title: i18n.finnishMobileID };
|
|
263
|
+
if (value === "fi:bank-id") return { title: i18n.finnishBankID };
|
|
264
|
+
if (provider === "fi") return { title: autoTitleCase(value).replace("FI", "FTN") };
|
|
265
|
+
if (provider === "itsme") return { title: autoTitleCase(value).replace("me", "ME") };
|
|
266
|
+
if (provider === "se:bankid") {
|
|
267
|
+
let subtitle = void 0;
|
|
268
|
+
let suffix = value.replace("se:bankid:", "");
|
|
269
|
+
let title = "BankID";
|
|
270
|
+
if (suffix === "same-device") subtitle = i18n.sameDevice;
|
|
271
|
+
if (suffix === "another-device") subtitle = i18n.anotherDevice;
|
|
272
|
+
if (suffix === "another-device:qr") subtitle = i18n.anotherDeviceQR;
|
|
273
|
+
if (disambiguate) title = i18n.swedishBankID;
|
|
274
|
+
return {
|
|
275
|
+
title,
|
|
276
|
+
subtitle
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
if (provider === "no:bankid") {
|
|
280
|
+
let subtitle = void 0;
|
|
281
|
+
let title = "BankID";
|
|
282
|
+
if (value.endsWith(":substantial")) subtitle = i18n.biometrics;
|
|
283
|
+
if (disambiguate) title = i18n.norwegianBankID;
|
|
284
|
+
return {
|
|
285
|
+
title,
|
|
286
|
+
subtitle
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
if (provider === "no:vipps") return { title: autoTitleCase(value).replace("NO ", "") };
|
|
290
|
+
if (provider === "se:frejaid") return { title: "FrejaID" };
|
|
291
|
+
if (provider === "uk:oneid") return { title: "OneID" };
|
|
292
|
+
if (provider === "de:personalausweis") return { title: "Personalausweis" };
|
|
293
|
+
return { title: autoTitleCase(value) };
|
|
294
|
+
}
|
|
295
|
+
function filterAcrValues(input) {
|
|
296
|
+
let original = input.slice();
|
|
297
|
+
let dkmitidMethod = lowestMitIDValue(input);
|
|
298
|
+
let reduced = input.slice();
|
|
299
|
+
if (dkmitidMethod) reduced = input.filter((s) => !s.startsWith("urn:grn:authn:dk:mitid") || s === "urn:grn:authn:dk:mitid:business").concat([dkmitidMethod]).sort((a, b) => original.indexOf(a) - original.indexOf(b));
|
|
300
|
+
if (input.includes(`urn:grn:authn:fi:all`)) {
|
|
301
|
+
if (!reduced.includes(`urn:grn:authn:fi:bank-id`)) reduced.push(`${FTN_PREFIX}:bank-id`);
|
|
302
|
+
if (!reduced.includes(`urn:grn:authn:fi:mobile-id`)) reduced.push(`${FTN_PREFIX}:mobile-id`);
|
|
303
|
+
reduced = reduced.filter((s) => s !== `${FTN_PREFIX}:all`);
|
|
304
|
+
}
|
|
305
|
+
return reduced;
|
|
306
|
+
}
|
|
307
|
+
function isSingle(acrValue, acrValues) {
|
|
308
|
+
const provider = acrValueToProviderPrefix(acrValue);
|
|
309
|
+
return acrValues.reduce((memo, acrValue) => memo + (acrValueToProviderPrefix(acrValue) === provider ? 1 : 0), 0) === 1;
|
|
310
|
+
}
|
|
311
|
+
const ambigousProviders = ["se:bankid", "no:bankid"];
|
|
312
|
+
/**
|
|
313
|
+
* A provider is considered ambiguous iff:
|
|
314
|
+
* 1. It is in the list of ambiguous providers
|
|
315
|
+
* 2. There is another ambiguous provider in the arc values list
|
|
316
|
+
*/
|
|
317
|
+
function isAmbiguous(acrValue, acrValues) {
|
|
318
|
+
const provider = acrValueToProviderPrefix(acrValue);
|
|
319
|
+
const isProviderAmbiguous = ambigousProviders.includes(provider);
|
|
320
|
+
const otherAmbiguousProvider = acrValues.find((otherAcrValue) => {
|
|
321
|
+
const otherProvider = acrValueToProviderPrefix(otherAcrValue);
|
|
322
|
+
return provider != otherProvider && ambigousProviders.includes(otherProvider);
|
|
323
|
+
}) != null;
|
|
324
|
+
return isProviderAmbiguous && otherAmbiguousProvider;
|
|
325
|
+
}
|
|
326
|
+
function trySessionStorage() {
|
|
327
|
+
try {
|
|
328
|
+
if (typeof sessionStorage === "undefined") return null;
|
|
329
|
+
return sessionStorage;
|
|
330
|
+
} catch (err) {
|
|
331
|
+
/**
|
|
332
|
+
* Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.
|
|
333
|
+
* (if storage is disabled in the browser)
|
|
334
|
+
*/
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
//#endregion
|
|
339
|
+
//#region src/memory-storage.ts
|
|
340
|
+
function createMemoryStorage() {
|
|
341
|
+
let store = {};
|
|
342
|
+
return {
|
|
343
|
+
getItem(key) {
|
|
344
|
+
return store[key] || null;
|
|
345
|
+
},
|
|
346
|
+
setItem(key, value) {
|
|
347
|
+
store[key] = value.toString();
|
|
348
|
+
},
|
|
349
|
+
removeItem(key) {
|
|
350
|
+
delete store[key];
|
|
351
|
+
},
|
|
352
|
+
clear() {
|
|
353
|
+
store = {};
|
|
354
|
+
},
|
|
355
|
+
key(index) {
|
|
356
|
+
return Object.keys(store)[index];
|
|
357
|
+
},
|
|
358
|
+
get length() {
|
|
359
|
+
return Object.keys(store).length;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
//#endregion
|
|
364
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/asyncToGenerator.js
|
|
365
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
366
|
+
try {
|
|
367
|
+
var i = n[a](c), u = i.value;
|
|
368
|
+
} catch (n) {
|
|
369
|
+
e(n);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
373
|
+
}
|
|
374
|
+
function _asyncToGenerator(n) {
|
|
375
|
+
return function() {
|
|
376
|
+
var t = this, e = arguments;
|
|
377
|
+
return new Promise(function(r, o) {
|
|
378
|
+
var a = n.apply(t, e);
|
|
379
|
+
function _next(n) {
|
|
380
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
381
|
+
}
|
|
382
|
+
function _throw(n) {
|
|
383
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
384
|
+
}
|
|
385
|
+
_next(void 0);
|
|
386
|
+
});
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/typeof.js
|
|
391
|
+
function _typeof(o) {
|
|
392
|
+
"@babel/helpers - typeof";
|
|
393
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
|
|
394
|
+
return typeof o;
|
|
395
|
+
} : function(o) {
|
|
396
|
+
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
397
|
+
}, _typeof(o);
|
|
398
|
+
}
|
|
399
|
+
//#endregion
|
|
400
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/toPrimitive.js
|
|
401
|
+
function toPrimitive(t, r) {
|
|
402
|
+
if ("object" != _typeof(t) || !t) return t;
|
|
403
|
+
var e = t[Symbol.toPrimitive];
|
|
404
|
+
if (void 0 !== e) {
|
|
405
|
+
var i = e.call(t, r || "default");
|
|
406
|
+
if ("object" != _typeof(i)) return i;
|
|
407
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
408
|
+
}
|
|
409
|
+
return ("string" === r ? String : Number)(t);
|
|
410
|
+
}
|
|
411
|
+
//#endregion
|
|
412
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/toPropertyKey.js
|
|
413
|
+
function toPropertyKey(t) {
|
|
414
|
+
var i = toPrimitive(t, "string");
|
|
415
|
+
return "symbol" == _typeof(i) ? i : i + "";
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/defineProperty.js
|
|
419
|
+
function _defineProperty(e, r, t) {
|
|
420
|
+
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
421
|
+
value: t,
|
|
422
|
+
enumerable: !0,
|
|
423
|
+
configurable: !0,
|
|
424
|
+
writable: !0
|
|
425
|
+
}) : e[r] = t, e;
|
|
426
|
+
}
|
|
427
|
+
//#endregion
|
|
428
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/objectSpread2.js
|
|
429
|
+
function ownKeys(e, r) {
|
|
430
|
+
var t = Object.keys(e);
|
|
431
|
+
if (Object.getOwnPropertySymbols) {
|
|
432
|
+
var o = Object.getOwnPropertySymbols(e);
|
|
433
|
+
r && (o = o.filter(function(r) {
|
|
434
|
+
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
435
|
+
})), t.push.apply(t, o);
|
|
436
|
+
}
|
|
437
|
+
return t;
|
|
438
|
+
}
|
|
439
|
+
function _objectSpread2(e) {
|
|
440
|
+
for (var r = 1; r < arguments.length; r++) {
|
|
441
|
+
var t = null != arguments[r] ? arguments[r] : {};
|
|
442
|
+
r % 2 ? ownKeys(Object(t), !0).forEach(function(r) {
|
|
443
|
+
_defineProperty(e, r, t[r]);
|
|
444
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {
|
|
445
|
+
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return e;
|
|
449
|
+
}
|
|
450
|
+
//#endregion
|
|
451
|
+
//#region src/provider.tsx
|
|
452
|
+
const SESSION_KEY = `@criipto-verify-react/session`;
|
|
453
|
+
const ACTION_SUPPORTING_ACR_VALUES = [
|
|
454
|
+
"urn:grn:authn:dk:mitid:low",
|
|
455
|
+
"urn:grn:authn:dk:mitid:substantial",
|
|
456
|
+
"urn:grn:authn:dk:mitid:high",
|
|
457
|
+
"urn:grn:authn:se:bankid:same-device",
|
|
458
|
+
"urn:grn:authn:se:bankid:another-device:qr"
|
|
459
|
+
];
|
|
460
|
+
const MESSAGE_SUPPORTING_ACR_VALUES = [
|
|
461
|
+
"urn:grn:authn:dk:mitid:low",
|
|
462
|
+
"urn:grn:authn:dk:mitid:substantial",
|
|
463
|
+
"urn:grn:authn:dk:mitid:high",
|
|
464
|
+
"urn:grn:authn:se:bankid:same-device",
|
|
465
|
+
"urn:grn:authn:se:bankid:another-device:qr"
|
|
466
|
+
];
|
|
467
|
+
function buildLoginHint(loginHint, params) {
|
|
468
|
+
const { options, action, message } = params;
|
|
469
|
+
const acrValues = (options === null || options === void 0 ? void 0 : options.acrValues) ? Array.isArray(options === null || options === void 0 ? void 0 : options.acrValues) ? options === null || options === void 0 ? void 0 : options.acrValues : [options === null || options === void 0 ? void 0 : options.acrValues] : [];
|
|
470
|
+
let hints = (loginHint ? loginHint.split(" ") : []).concat((options === null || options === void 0 ? void 0 : options.loginHint) ? options === null || options === void 0 ? void 0 : options.loginHint.split(" ") : []).filter((hint) => !hint.startsWith("message:") && !hint.startsWith("action:"));
|
|
471
|
+
if (action) {
|
|
472
|
+
hints = hints.filter((h) => !h.startsWith("action:"));
|
|
473
|
+
if (acrValues.length === 1) {
|
|
474
|
+
if (ACTION_SUPPORTING_ACR_VALUES.includes(acrValues[0])) hints.push(`action:${action}`);
|
|
475
|
+
} else if (acrValues.length >= 2) {
|
|
476
|
+
if (acrValues.some((v) => ACTION_SUPPORTING_ACR_VALUES.includes(v))) hints.push(`action:${action}`);
|
|
477
|
+
} else hints.push(`action:${action}`);
|
|
478
|
+
}
|
|
479
|
+
if (message) if (acrValues.length === 1) {
|
|
480
|
+
if (MESSAGE_SUPPORTING_ACR_VALUES.includes(acrValues[0])) hints.push(`message:${btoa(message)}`);
|
|
481
|
+
} else if (acrValues.length >= 2) {
|
|
482
|
+
if (acrValues.some((v) => MESSAGE_SUPPORTING_ACR_VALUES.includes(v))) hints.push(`message:${btoa(message)}`);
|
|
483
|
+
} else hints.push(`message:${btoa(message)}`);
|
|
484
|
+
return hints.length ? hints.join(" ") : void 0;
|
|
485
|
+
}
|
|
486
|
+
function parseAction(input) {
|
|
487
|
+
if (!input) return;
|
|
488
|
+
const actionCandidate = input.split(" ").find((s) => s.startsWith("action:"));
|
|
489
|
+
if (!actionCandidate) return;
|
|
490
|
+
const action = actionCandidate.replace("action:", "");
|
|
491
|
+
if (actions.includes(action)) return action;
|
|
492
|
+
}
|
|
493
|
+
function tryBase64Decode(input) {
|
|
494
|
+
try {
|
|
495
|
+
return atob(input);
|
|
496
|
+
} catch (_unused) {
|
|
497
|
+
return null;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function parseMessage(input) {
|
|
501
|
+
var _tryBase64Decode;
|
|
502
|
+
if (!input) return;
|
|
503
|
+
const messageCandidate = input.split(" ").find((s) => s.startsWith("message:"));
|
|
504
|
+
if (!messageCandidate) return;
|
|
505
|
+
const message = messageCandidate.replace("message:", "");
|
|
506
|
+
return (_tryBase64Decode = tryBase64Decode(message)) !== null && _tryBase64Decode !== void 0 ? _tryBase64Decode : message;
|
|
507
|
+
}
|
|
508
|
+
function defaultRedirectUri(input) {
|
|
509
|
+
if (input) return input;
|
|
510
|
+
if (typeof window !== "undefined" && typeof window.location !== "undefined") return window.location.origin + window.location.pathname;
|
|
511
|
+
throw new Error("Unable to determine default redirect uri, please provide a redirectUri");
|
|
512
|
+
}
|
|
513
|
+
const pkceStore = (() => {
|
|
514
|
+
const sessionStorage = trySessionStorage();
|
|
515
|
+
if (sessionStorage === null) {
|
|
516
|
+
console.warn("Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.");
|
|
517
|
+
return createMemoryStorage();
|
|
518
|
+
}
|
|
519
|
+
return sessionStorage;
|
|
520
|
+
})();
|
|
521
|
+
const CriiptoVerifyProvider = (props) => {
|
|
522
|
+
var _ref, _props$action, _props$message;
|
|
523
|
+
const client = useMemo(() => new CriiptoAuth({
|
|
524
|
+
domain: props.domain,
|
|
525
|
+
clientID: props.clientID,
|
|
526
|
+
store: pkceStore,
|
|
527
|
+
redirectUri: defaultRedirectUri(props.redirectUri),
|
|
528
|
+
protocol: props.protocol
|
|
529
|
+
}), [
|
|
530
|
+
props.domain,
|
|
531
|
+
props.clientID,
|
|
532
|
+
props.redirectUri,
|
|
533
|
+
props.protocol
|
|
534
|
+
]);
|
|
535
|
+
const [configuration, setConfiguration] = useState(null);
|
|
536
|
+
useEffect(() => {
|
|
537
|
+
let isSubscribed = true;
|
|
538
|
+
_asyncToGenerator(function* () {
|
|
539
|
+
const configuration = yield client.fetchOpenIDConfiguration();
|
|
540
|
+
if (isSubscribed) setConfiguration(configuration);
|
|
541
|
+
})();
|
|
542
|
+
return () => {
|
|
543
|
+
isSubscribed = false;
|
|
544
|
+
};
|
|
545
|
+
}, [client]);
|
|
546
|
+
const [result, setResult] = useState(null);
|
|
547
|
+
useEffect(() => {
|
|
548
|
+
let isSubscribed = true;
|
|
549
|
+
_asyncToGenerator(function* () {
|
|
550
|
+
try {
|
|
551
|
+
yield client.fetchCriiptoConfiguration();
|
|
552
|
+
} catch (error) {
|
|
553
|
+
if (!isSubscribed) return;
|
|
554
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
555
|
+
setResult((prev) => prev !== null && prev !== void 0 ? prev : err);
|
|
556
|
+
}
|
|
557
|
+
})();
|
|
558
|
+
return () => {
|
|
559
|
+
isSubscribed = false;
|
|
560
|
+
};
|
|
561
|
+
}, [client]);
|
|
562
|
+
const claims = useMemo(() => {
|
|
563
|
+
if (!result) return null;
|
|
564
|
+
if (!("id_token" in result)) return null;
|
|
565
|
+
return jwtDecode(result.id_token);
|
|
566
|
+
}, [result]);
|
|
567
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
568
|
+
const [isInitializing, setIsInitializing] = useState(true);
|
|
569
|
+
const [pkce, setPKCE] = useState(props.pkce);
|
|
570
|
+
const responseType = props.response || "token";
|
|
571
|
+
const completionStrategy = props.completionStrategy || "client";
|
|
572
|
+
const uiLocales = props.uiLocales;
|
|
573
|
+
const loginHint = props.loginHint;
|
|
574
|
+
const action = (_ref = (_props$action = props.action) !== null && _props$action !== void 0 ? _props$action : parseAction(loginHint)) !== null && _ref !== void 0 ? _ref : "login";
|
|
575
|
+
const message = (_props$message = props.message) !== null && _props$message !== void 0 ? _props$message : parseMessage(loginHint);
|
|
576
|
+
const sessionStore = props.sessionStore;
|
|
577
|
+
const refreshPKCE = function() {
|
|
578
|
+
var _ref2 = _asyncToGenerator(function* () {
|
|
579
|
+
if (props.pkce) return props.pkce;
|
|
580
|
+
if (responseType !== "token" || completionStrategy !== "client") {
|
|
581
|
+
clearPKCEState(pkceStore);
|
|
582
|
+
setPKCE(void 0);
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
clearPKCEState(pkceStore);
|
|
586
|
+
const pkce = yield generatePKCE();
|
|
587
|
+
setPKCE(pkce);
|
|
588
|
+
return pkce;
|
|
589
|
+
});
|
|
590
|
+
return function refreshPKCE() {
|
|
591
|
+
return _ref2.apply(this, arguments);
|
|
592
|
+
};
|
|
593
|
+
}();
|
|
594
|
+
const buildOptions = useCallback((options) => {
|
|
595
|
+
var _props$responseType, _props$state, _props$nonce, _props$prompt, _props$scope, _options$pkce;
|
|
596
|
+
return _objectSpread2(_objectSpread2({
|
|
597
|
+
redirectUri: defaultRedirectUri(props.redirectUri),
|
|
598
|
+
responseType: (_props$responseType = props.responseType) !== null && _props$responseType !== void 0 ? _props$responseType : "code",
|
|
599
|
+
responseMode: props.responseMode
|
|
600
|
+
}, options || {}), {}, {
|
|
601
|
+
state: (_props$state = props.state) !== null && _props$state !== void 0 ? _props$state : options === null || options === void 0 ? void 0 : options.state,
|
|
602
|
+
nonce: (_props$nonce = props.nonce) !== null && _props$nonce !== void 0 ? _props$nonce : options === null || options === void 0 ? void 0 : options.nonce,
|
|
603
|
+
prompt: (_props$prompt = props.prompt) !== null && _props$prompt !== void 0 ? _props$prompt : options === null || options === void 0 ? void 0 : options.prompt,
|
|
604
|
+
scope: (_props$scope = props.scope) !== null && _props$scope !== void 0 ? _props$scope : options === null || options === void 0 ? void 0 : options.scope,
|
|
605
|
+
uiLocales: uiLocales !== null && uiLocales !== void 0 ? uiLocales : options === null || options === void 0 ? void 0 : options.uiLocales,
|
|
606
|
+
pkce: (_options$pkce = options === null || options === void 0 ? void 0 : options.pkce) !== null && _options$pkce !== void 0 ? _options$pkce : pkce,
|
|
607
|
+
loginHint: buildLoginHint(props.loginHint, {
|
|
608
|
+
options,
|
|
609
|
+
action,
|
|
610
|
+
message
|
|
611
|
+
}),
|
|
612
|
+
extraUrlParams: props.criiptoSdk !== void 0 ? { criipto_sdk: props.criiptoSdk } : { criipto_sdk: `@criipto/verify-react@${version}` }
|
|
613
|
+
});
|
|
614
|
+
}, [
|
|
615
|
+
pkce,
|
|
616
|
+
props.state,
|
|
617
|
+
props.nonce,
|
|
618
|
+
props.prompt,
|
|
619
|
+
props.scope,
|
|
620
|
+
uiLocales,
|
|
621
|
+
action,
|
|
622
|
+
message,
|
|
623
|
+
props.redirectUri,
|
|
624
|
+
props.criiptoSdk,
|
|
625
|
+
props.loginHint,
|
|
626
|
+
props.responseMode,
|
|
627
|
+
props.responseType
|
|
628
|
+
]);
|
|
629
|
+
const buildAuthorizeUrl = useCallback(function() {
|
|
630
|
+
var _ref3 = _asyncToGenerator(function* (options) {
|
|
631
|
+
return yield client.buildAuthorizeUrl(client.buildAuthorizeParams(buildOptions(options)));
|
|
632
|
+
});
|
|
633
|
+
return function(_x) {
|
|
634
|
+
return _ref3.apply(this, arguments);
|
|
635
|
+
};
|
|
636
|
+
}(), [client, buildOptions]);
|
|
637
|
+
const initializePAR = useCallback(function() {
|
|
638
|
+
var _ref4 = _asyncToGenerator(function* (options) {
|
|
639
|
+
return (yield client.pushAuthorizationRequest(client.buildAuthorizeParams(buildOptions(options)))).authorizeUrl;
|
|
640
|
+
});
|
|
641
|
+
return function(_x2) {
|
|
642
|
+
return _ref4.apply(this, arguments);
|
|
643
|
+
};
|
|
644
|
+
}(), [client, buildOptions]);
|
|
645
|
+
const handleResponse = useCallback(function() {
|
|
646
|
+
var _ref5 = _asyncToGenerator(function* (response, params = {}) {
|
|
647
|
+
if (response instanceof OAuth2Error$1) setResult(response);
|
|
648
|
+
else if (response instanceof Error) setResult(response);
|
|
649
|
+
else if (params.pkce && responseType === "token") {
|
|
650
|
+
let _redirectUri = params.redirectUri || defaultRedirectUri(props.redirectUri);
|
|
651
|
+
if (!_redirectUri) throw new Error("redirectUri must be configured globally or per authentication component");
|
|
652
|
+
yield client.processResponse(response, {
|
|
653
|
+
code_verifier: params.pkce.code_verifier,
|
|
654
|
+
redirect_uri: _redirectUri
|
|
655
|
+
}).then((response) => {
|
|
656
|
+
if (response === null || response === void 0 ? void 0 : response.code) setResult({
|
|
657
|
+
code: response.code,
|
|
658
|
+
state: response.state,
|
|
659
|
+
source: params.source
|
|
660
|
+
});
|
|
661
|
+
else if (response === null || response === void 0 ? void 0 : response.id_token) {
|
|
662
|
+
setResult({
|
|
663
|
+
id_token: response.id_token,
|
|
664
|
+
state: response.state,
|
|
665
|
+
source: params.source
|
|
666
|
+
});
|
|
667
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.setItem(SESSION_KEY, response.id_token);
|
|
668
|
+
} else setResult(null);
|
|
669
|
+
}).catch((err) => {
|
|
670
|
+
setResult(err);
|
|
671
|
+
});
|
|
672
|
+
} else if (response === null || response === void 0 ? void 0 : response.code) setResult({
|
|
673
|
+
code: response.code,
|
|
674
|
+
state: response.state,
|
|
675
|
+
source: params.source
|
|
676
|
+
});
|
|
677
|
+
else if (response === null || response === void 0 ? void 0 : response.id_token) {
|
|
678
|
+
setResult({
|
|
679
|
+
id_token: response.id_token,
|
|
680
|
+
state: response.state,
|
|
681
|
+
source: params.source
|
|
682
|
+
});
|
|
683
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.setItem(SESSION_KEY, response.id_token);
|
|
684
|
+
} else if (response === null || response === void 0 ? void 0 : response.error) setResult(new OAuth2Error$1(response.error, response.error_description, response.state));
|
|
685
|
+
else setResult(null);
|
|
686
|
+
refreshPKCE();
|
|
687
|
+
});
|
|
688
|
+
return function(_x3) {
|
|
689
|
+
return _ref5.apply(this, arguments);
|
|
690
|
+
};
|
|
691
|
+
}(), [
|
|
692
|
+
refreshPKCE,
|
|
693
|
+
responseType,
|
|
694
|
+
setResult,
|
|
695
|
+
client,
|
|
696
|
+
sessionStore,
|
|
697
|
+
props.redirectUri
|
|
698
|
+
]);
|
|
699
|
+
const checkSession = useCallback(_asyncToGenerator(function* () {
|
|
700
|
+
return client.checkSession({ redirectUri: defaultRedirectUri(props.redirectUri) }).then((response) => {
|
|
701
|
+
if (response === null || response === void 0 ? void 0 : response.code) setResult({ code: response.code });
|
|
702
|
+
else if (response === null || response === void 0 ? void 0 : response.id_token) {
|
|
703
|
+
setResult({ id_token: response.id_token });
|
|
704
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.setItem(SESSION_KEY, response.id_token);
|
|
705
|
+
} else setResult(null);
|
|
706
|
+
});
|
|
707
|
+
}), [
|
|
708
|
+
sessionStore,
|
|
709
|
+
client,
|
|
710
|
+
props.redirectUri
|
|
711
|
+
]);
|
|
712
|
+
const logout = useCallback(function() {
|
|
713
|
+
var _ref6 = _asyncToGenerator(function* (params) {
|
|
714
|
+
var _params$redirectUri;
|
|
715
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.removeItem(SESSION_KEY);
|
|
716
|
+
yield client.logout({
|
|
717
|
+
redirectUri: (_params$redirectUri = params === null || params === void 0 ? void 0 : params.redirectUri) !== null && _params$redirectUri !== void 0 ? _params$redirectUri : defaultRedirectUri(props.redirectUri),
|
|
718
|
+
state: params === null || params === void 0 ? void 0 : params.state
|
|
719
|
+
});
|
|
720
|
+
});
|
|
721
|
+
return function(_x4) {
|
|
722
|
+
return _ref6.apply(this, arguments);
|
|
723
|
+
};
|
|
724
|
+
}(), [
|
|
725
|
+
sessionStore,
|
|
726
|
+
client,
|
|
727
|
+
props.redirectUri
|
|
728
|
+
]);
|
|
729
|
+
const context = useMemo(() => {
|
|
730
|
+
return {
|
|
731
|
+
loginWithRedirect: function() {
|
|
732
|
+
var _ref7 = _asyncToGenerator(function* (params) {
|
|
733
|
+
const pkce = yield refreshPKCE();
|
|
734
|
+
yield client.redirect.authorize(buildOptions(_objectSpread2(_objectSpread2({}, params), {}, { pkce })));
|
|
735
|
+
});
|
|
736
|
+
return function loginWithRedirect(_x5) {
|
|
737
|
+
return _ref7.apply(this, arguments);
|
|
738
|
+
};
|
|
739
|
+
}(),
|
|
740
|
+
loginWithPopup: function() {
|
|
741
|
+
var _ref8 = _asyncToGenerator(function* (params) {
|
|
742
|
+
return client.popup.authorize(buildOptions(params)).then((response) => {
|
|
743
|
+
if (response === null || response === void 0 ? void 0 : response.code) setResult({
|
|
744
|
+
code: response.code,
|
|
745
|
+
state: response.state,
|
|
746
|
+
source: "popup"
|
|
747
|
+
});
|
|
748
|
+
else if (response === null || response === void 0 ? void 0 : response.id_token) setResult({
|
|
749
|
+
id_token: response.id_token,
|
|
750
|
+
state: response.state,
|
|
751
|
+
source: "popup"
|
|
752
|
+
});
|
|
753
|
+
else setResult(null);
|
|
754
|
+
}).catch((err) => {
|
|
755
|
+
setResult(err);
|
|
756
|
+
});
|
|
757
|
+
});
|
|
758
|
+
return function loginWithPopup(_x6) {
|
|
759
|
+
return _ref8.apply(this, arguments);
|
|
760
|
+
};
|
|
761
|
+
}(),
|
|
762
|
+
checkSession,
|
|
763
|
+
logout,
|
|
764
|
+
fetchOpenIDConfiguration: () => client.fetchOpenIDConfiguration(),
|
|
765
|
+
buildAuthorizeUrl,
|
|
766
|
+
initializePAR,
|
|
767
|
+
generatePKCE: function() {
|
|
768
|
+
var _ref9 = _asyncToGenerator(function* () {
|
|
769
|
+
if (responseType !== "token" || completionStrategy !== "client") return;
|
|
770
|
+
return yield generatePKCE();
|
|
771
|
+
});
|
|
772
|
+
return function generatePKCE() {
|
|
773
|
+
return _ref9.apply(this, arguments);
|
|
774
|
+
};
|
|
775
|
+
}(),
|
|
776
|
+
buildOptions,
|
|
777
|
+
handleResponse,
|
|
778
|
+
responseType,
|
|
779
|
+
completionStrategy,
|
|
780
|
+
result,
|
|
781
|
+
claims,
|
|
782
|
+
domain: client.domain,
|
|
783
|
+
redirectUri: defaultRedirectUri(props.redirectUri),
|
|
784
|
+
action,
|
|
785
|
+
message,
|
|
786
|
+
pkce,
|
|
787
|
+
store: pkceStore,
|
|
788
|
+
isLoading,
|
|
789
|
+
isInitializing,
|
|
790
|
+
acrValues: configuration ? filterAcrValues(configuration.acr_values_supported) : void 0,
|
|
791
|
+
client,
|
|
792
|
+
uiLocales,
|
|
793
|
+
loginHint
|
|
794
|
+
};
|
|
795
|
+
}, [
|
|
796
|
+
client,
|
|
797
|
+
props.redirectUri,
|
|
798
|
+
responseType,
|
|
799
|
+
completionStrategy,
|
|
800
|
+
result,
|
|
801
|
+
claims,
|
|
802
|
+
action,
|
|
803
|
+
message,
|
|
804
|
+
pkce,
|
|
805
|
+
props.state,
|
|
806
|
+
props.prompt,
|
|
807
|
+
isLoading,
|
|
808
|
+
isInitializing,
|
|
809
|
+
handleResponse,
|
|
810
|
+
logout,
|
|
811
|
+
configuration,
|
|
812
|
+
uiLocales,
|
|
813
|
+
checkSession,
|
|
814
|
+
loginHint
|
|
815
|
+
]);
|
|
816
|
+
useEffect(() => {
|
|
817
|
+
setIsInitializing(false);
|
|
818
|
+
if (!client.redirect.hasMatch()) {
|
|
819
|
+
refreshPKCE();
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
let isSubscribed = true;
|
|
823
|
+
setIsLoading(true);
|
|
824
|
+
const params = parseAuthorizeResponseFromLocation(window.location);
|
|
825
|
+
if (params.code && responseType === "code") {
|
|
826
|
+
setIsLoading(false);
|
|
827
|
+
setResult({
|
|
828
|
+
code: params.code,
|
|
829
|
+
source: "redirect",
|
|
830
|
+
state: params.state
|
|
831
|
+
});
|
|
832
|
+
refreshPKCE();
|
|
833
|
+
return;
|
|
834
|
+
}
|
|
835
|
+
_asyncToGenerator(function* () {
|
|
836
|
+
yield Promise.resolve();
|
|
837
|
+
if (!isSubscribed) return;
|
|
838
|
+
try {
|
|
839
|
+
const response = yield client.redirect.match();
|
|
840
|
+
if (!isSubscribed) return;
|
|
841
|
+
if (response === null || response === void 0 ? void 0 : response.code) setResult({
|
|
842
|
+
code: response.code,
|
|
843
|
+
source: "redirect",
|
|
844
|
+
state: response.state
|
|
845
|
+
});
|
|
846
|
+
else if (response === null || response === void 0 ? void 0 : response.id_token) {
|
|
847
|
+
setResult({
|
|
848
|
+
id_token: response.id_token,
|
|
849
|
+
source: "redirect",
|
|
850
|
+
state: response.state
|
|
851
|
+
});
|
|
852
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.setItem(SESSION_KEY, response.id_token);
|
|
853
|
+
resetRedirectState(window);
|
|
854
|
+
} else setResult(null);
|
|
855
|
+
} catch (err) {
|
|
856
|
+
if (!isSubscribed) return;
|
|
857
|
+
if (err instanceof OAuth2Error$1) setResult(err);
|
|
858
|
+
else if (err instanceof Error) setResult(err);
|
|
859
|
+
else {
|
|
860
|
+
var _err$toString;
|
|
861
|
+
setResult(new Error((_err$toString = err === null || err === void 0 ? void 0 : err.toString()) !== null && _err$toString !== void 0 ? _err$toString : "Unknown error ocurred"));
|
|
862
|
+
}
|
|
863
|
+
} finally {
|
|
864
|
+
if (!isSubscribed) return;
|
|
865
|
+
setIsLoading(false);
|
|
866
|
+
refreshPKCE();
|
|
867
|
+
}
|
|
868
|
+
})();
|
|
869
|
+
return () => {
|
|
870
|
+
isSubscribed = false;
|
|
871
|
+
};
|
|
872
|
+
}, [props.pkce, responseType]);
|
|
873
|
+
useEffect(() => {
|
|
874
|
+
if (!sessionStore || claims) return;
|
|
875
|
+
if (!claims) {
|
|
876
|
+
const token = sessionStore.getItem(SESSION_KEY);
|
|
877
|
+
if (!token) return;
|
|
878
|
+
setResult({ id_token: token });
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
}, [sessionStore, claims]);
|
|
882
|
+
useEffect(() => {
|
|
883
|
+
if (!claims) return;
|
|
884
|
+
if (!sessionStore) return;
|
|
885
|
+
const interval = setInterval(() => {
|
|
886
|
+
const now = Date.now();
|
|
887
|
+
if (claims.exp < now / 1e3) {
|
|
888
|
+
setResult(null);
|
|
889
|
+
sessionStore === null || sessionStore === void 0 || sessionStore.removeItem(SESSION_KEY);
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
}, 5e3);
|
|
893
|
+
return () => clearInterval(interval);
|
|
894
|
+
}, [
|
|
895
|
+
sessionStore,
|
|
896
|
+
claims,
|
|
897
|
+
result
|
|
898
|
+
]);
|
|
899
|
+
/**
|
|
900
|
+
* Fresh page load SSO check
|
|
901
|
+
*/
|
|
902
|
+
useEffect(() => {
|
|
903
|
+
setIsInitializing(false);
|
|
904
|
+
if (!sessionStore) return;
|
|
905
|
+
if (client.redirect.hasMatch()) return;
|
|
906
|
+
if (sessionStore.getItem(SESSION_KEY)) return;
|
|
907
|
+
let isSubscribed = true;
|
|
908
|
+
setIsLoading(true);
|
|
909
|
+
checkSession().catch((err) => {
|
|
910
|
+
console.error("session silent check error", err);
|
|
911
|
+
}).finally(() => {
|
|
912
|
+
if (isSubscribed) setIsLoading(false);
|
|
913
|
+
});
|
|
914
|
+
return () => {
|
|
915
|
+
isSubscribed = false;
|
|
916
|
+
};
|
|
917
|
+
}, [sessionStore, client]);
|
|
918
|
+
return /* @__PURE__ */ jsx(CriiptoVerifyContext.Provider, {
|
|
919
|
+
value: context,
|
|
920
|
+
children: props.children
|
|
921
|
+
});
|
|
922
|
+
};
|
|
923
|
+
function resetRedirectState(window) {
|
|
924
|
+
const url = new URL(window.location.href);
|
|
925
|
+
url.searchParams.delete("code");
|
|
926
|
+
url.searchParams.delete("state");
|
|
927
|
+
window.history.replaceState({}, window.document.title, url.pathname + url.search);
|
|
928
|
+
}
|
|
929
|
+
//#endregion
|
|
930
|
+
//#region src/device.ts
|
|
931
|
+
function getUserAgent(userAgent) {
|
|
932
|
+
if (!userAgent) return null;
|
|
933
|
+
return UAParser(userAgent);
|
|
934
|
+
}
|
|
935
|
+
//#endregion
|
|
936
|
+
//#region src/components/SEBankIDSameDeviceButton/usePoll.ts
|
|
937
|
+
function usePoll$1({ shouldPoll, pollUrl, onComplete, onError }) {
|
|
938
|
+
useEffect(() => {
|
|
939
|
+
if (!shouldPoll) return;
|
|
940
|
+
let isSubscribed = true;
|
|
941
|
+
const poll = function() {
|
|
942
|
+
var _ref = _asyncToGenerator(function* () {
|
|
943
|
+
if (!isSubscribed) return;
|
|
944
|
+
const response = yield fetch(pollUrl);
|
|
945
|
+
if (response.status === 202) {
|
|
946
|
+
setTimeout(poll, 1e3);
|
|
947
|
+
return;
|
|
948
|
+
} else if (response.status >= 400) {
|
|
949
|
+
if (!isSubscribed) return;
|
|
950
|
+
onError(yield response.text());
|
|
951
|
+
return;
|
|
952
|
+
} else {
|
|
953
|
+
if (!isSubscribed) return;
|
|
954
|
+
const { targetUrl } = yield response.json();
|
|
955
|
+
onComplete(targetUrl);
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
});
|
|
959
|
+
return function poll() {
|
|
960
|
+
return _ref.apply(this, arguments);
|
|
961
|
+
};
|
|
962
|
+
}();
|
|
963
|
+
setTimeout(poll, 1e3);
|
|
964
|
+
return () => {
|
|
965
|
+
isSubscribed = false;
|
|
966
|
+
};
|
|
967
|
+
}, [shouldPoll, pollUrl]);
|
|
968
|
+
}
|
|
969
|
+
//#endregion
|
|
970
|
+
//#region src/components/SEBankIDSameDeviceButton/Poll.tsx
|
|
971
|
+
function SEBankIDSameDevicePoll(props) {
|
|
972
|
+
const { links, onError, onComplete, onInitiate } = props;
|
|
973
|
+
const [initiated, setInitiated] = useState(false);
|
|
974
|
+
const { domain } = useContext(CriiptoVerifyContext);
|
|
975
|
+
usePoll$1(_objectSpread2(_objectSpread2({}, props), {}, {
|
|
976
|
+
shouldPoll: initiated,
|
|
977
|
+
pollUrl: links.pollUrl
|
|
978
|
+
}));
|
|
979
|
+
const handleInitiate = () => {
|
|
980
|
+
onInitiate();
|
|
981
|
+
setInitiated(true);
|
|
982
|
+
};
|
|
983
|
+
return React.cloneElement(props.children, _objectSpread2(_objectSpread2({}, props.children.props), {}, { onClick: handleInitiate }));
|
|
984
|
+
}
|
|
985
|
+
//#endregion
|
|
986
|
+
//#region src/hooks/usePageVisibility.ts
|
|
987
|
+
function usePageVisibility(onVisible, deps = []) {
|
|
988
|
+
const visibilityState = useRef(document.visibilityState);
|
|
989
|
+
const [state, setState] = useState(visibilityState.current);
|
|
990
|
+
useEffect(() => {
|
|
991
|
+
document.addEventListener("visibilitychange", _handleVisibilityChange);
|
|
992
|
+
return () => {
|
|
993
|
+
document.removeEventListener("visibilitychange", _handleVisibilityChange);
|
|
994
|
+
};
|
|
995
|
+
}, deps);
|
|
996
|
+
const _handleVisibilityChange = () => {
|
|
997
|
+
const nextState = document.visibilityState;
|
|
998
|
+
if (visibilityState.current === "hidden" && nextState === "visible") {
|
|
999
|
+
if (onVisible) onVisible();
|
|
1000
|
+
}
|
|
1001
|
+
visibilityState.current = nextState;
|
|
1002
|
+
setState(visibilityState.current);
|
|
1003
|
+
};
|
|
1004
|
+
return state;
|
|
1005
|
+
}
|
|
1006
|
+
//#endregion
|
|
1007
|
+
//#region src/components/SEBankIDSameDeviceButton/Foreground.tsx
|
|
1008
|
+
function SEBankIDSameDeviceForeground(props) {
|
|
1009
|
+
const { links, onInitiate, onLog } = props;
|
|
1010
|
+
const [initiated, setInitiated] = useState(false);
|
|
1011
|
+
const [result, setResult] = useState(null);
|
|
1012
|
+
const onComplete = useCallback((completeUrl) => setResult({ result: completeUrl }), []);
|
|
1013
|
+
const onError = useCallback((error) => setResult({ error }), []);
|
|
1014
|
+
const visibility = usePageVisibility(() => {
|
|
1015
|
+
onLog("ForegroundStrategy", "onForeground", initiated.toString());
|
|
1016
|
+
}, [initiated]);
|
|
1017
|
+
useEffect(() => {
|
|
1018
|
+
if (result && visibility === "visible") {
|
|
1019
|
+
if ("result" in result) props.onComplete(result.result);
|
|
1020
|
+
else if ("error" in result) props.onError(result.error);
|
|
1021
|
+
setResult(null);
|
|
1022
|
+
}
|
|
1023
|
+
}, [result, visibility]);
|
|
1024
|
+
usePoll$1({
|
|
1025
|
+
shouldPoll: initiated,
|
|
1026
|
+
pollUrl: links.pollUrl,
|
|
1027
|
+
onComplete,
|
|
1028
|
+
onError
|
|
1029
|
+
});
|
|
1030
|
+
const handleInitiate = () => {
|
|
1031
|
+
onLog("ForegroundStrategy", "handleInitiate");
|
|
1032
|
+
onInitiate();
|
|
1033
|
+
setInitiated(true);
|
|
1034
|
+
};
|
|
1035
|
+
return React.cloneElement(props.children, _objectSpread2(_objectSpread2({}, props.children.props), {}, { onClick: handleInitiate }));
|
|
1036
|
+
}
|
|
1037
|
+
//#endregion
|
|
1038
|
+
//#region src/components/SEBankIDSameDeviceButton/shared.ts
|
|
1039
|
+
const STATE_KEY = "@criipto/verify-react:sebankid:state";
|
|
1040
|
+
const stateStore = (() => {
|
|
1041
|
+
const sessionStorage = trySessionStorage();
|
|
1042
|
+
if (sessionStorage === null) {
|
|
1043
|
+
console.warn("Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.");
|
|
1044
|
+
return createMemoryStorage();
|
|
1045
|
+
}
|
|
1046
|
+
return sessionStorage;
|
|
1047
|
+
})();
|
|
1048
|
+
function hydrateState() {
|
|
1049
|
+
const rawState = stateStore.getItem(STATE_KEY);
|
|
1050
|
+
if (rawState) return JSON.parse(rawState);
|
|
1051
|
+
}
|
|
1052
|
+
const autoHydratedState = hydrateState();
|
|
1053
|
+
function clearState() {
|
|
1054
|
+
stateStore.removeItem(STATE_KEY);
|
|
1055
|
+
}
|
|
1056
|
+
function saveState(input) {
|
|
1057
|
+
stateStore.setItem(STATE_KEY, JSON.stringify(input));
|
|
1058
|
+
}
|
|
1059
|
+
//#endregion
|
|
1060
|
+
//#region src/components/SEBankIDSameDeviceButton/Reload.tsx
|
|
1061
|
+
function SEBankIDSameDeviceReload(props) {
|
|
1062
|
+
const { links, onError, onComplete, onInitiate, onLog, pkce, redirectUri } = props;
|
|
1063
|
+
const handleInitiate = () => {
|
|
1064
|
+
onLog("ReloadStrategy", "handleInitiate");
|
|
1065
|
+
saveState({
|
|
1066
|
+
links,
|
|
1067
|
+
redirectUri,
|
|
1068
|
+
pkce
|
|
1069
|
+
});
|
|
1070
|
+
onInitiate();
|
|
1071
|
+
};
|
|
1072
|
+
useEffect(() => {
|
|
1073
|
+
const hydratedState = hydrateState();
|
|
1074
|
+
if (!hydratedState) return;
|
|
1075
|
+
clearState();
|
|
1076
|
+
onComplete(hydratedState.links.completeUrl);
|
|
1077
|
+
}, []);
|
|
1078
|
+
return React.cloneElement(props.children, _objectSpread2(_objectSpread2({}, props.children.props), {}, { onClick: handleInitiate }));
|
|
1079
|
+
}
|
|
1080
|
+
//#endregion
|
|
1081
|
+
//#region src/components/SEBankIDQRCode/logo@2x.png
|
|
1082
|
+
var logo_2x_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABBCAYAAABo3gIBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXkSURBVHgB7VzhdSI5DBa8/D+2gnMHyVWQSQXJVRA6SLYCshWQrQC2ArIVMKkAUgFzFUAq0FnY8xAa2zPB9iRvH997zoAtbFmWZVkeZwA9AREL/VhCOuxsqtjzlZ6DwWANJ2IAPUEL5E4/FtAPSEClTi86vWoBVfDVoAUywc/DTCfVhc8h9Icr+DyMddp0EUyfU2YFbqFUYNSbMNJJQV7h0XR61NPoF+QASVynAo3RDNFJ0Ihde2ivbXlOPEFiQRQOpun7lYP2ykGnOtSfG0+QSBgq0MjMQX8naCaRbaTEI2/3VKOqAmW/HXmX4vsO2lFAP5hiy3TvBJKskPQWja/hol0I2pVOo0DdpB0b7A9pHEY8+BYbDNgEatDBhFMo6LZNfaCABAKp5/l9C93Ww8TUU99nYK8lsY6Zss/KR4BGc3zTQ+45goLNDNLMUaxA6tWiCNAoR57POaLvFXwebk/yVNHMfVpeayNKHbxx7TLR+CW3jI7Sb027C9RNDptLq5R9Up0F+DXvVMyDArGdkY4WMXvnYYZ2l6VO7zzP1/lYaP7GYLRUQRqs2xqcYjyyb+p0G3NMg02bhpDlLeB07LR2fIPMQDPNaPOoIBJtRjV2jlbQA+yUfIYE8ArESj1W3SvoD0m28yENURCPk2ObH4XVkljjvftjBGKRVSCXEI//oF9E27yQQKKXy5jjgI/C2rxYgWSdMn1PlxT+TplTQ7J4pwHcQjzWToEk8i771pA7iISe4q8+DUmxaaqgJ6CJiyqIQ0l/fAJJscL0oiFo4i2tQesOmNMfn0AUxOMNMsMKg/ZbKTSaDsq9Aok2qLm2/DXQbP2TbOiA4iChA3H0x0C7IuVrD5yvkU4P6A5ax0DVbVy4GoUvssvFg31QLKXGkXZcOAi+0pJLvIwhL37wLy4boiAeFaRBitUuhCdpO4aZmEi1qcsZflxrYfyQmcMcTCTc1CnIg0qnf10FLoHEGtSUDlkODamPTCpXYQ4NSeJ/YJ5ofVAYhGEGJlJpSOpDqAo8h2kcUkMUpGk4BVKuMCSEmy62bZiBiVQaUkAaPGtB/NP1XVXpmKWYMqk2dbFTptTp+0dXvGFiJlJu6k4dnFKnQvNxMzhh+U+tIRUkgDXuHxmcCkw8o6SoF0TggjHxZTZ1EOajftF/bRO9XZDsuOPosFsL5W+Iw3uKKWMH569c9Z9xxhlnnNET9qsMdjvbKLPdMWGwPsgDy/rZ5mChicDzqyb0luMLmlfNfUectFqtnX3C5m0FH1aQGWii6hytziI2o/C3Nn/RoU8b3kbtustN3RzMzreAY2frCt33YZRNnR07NEcKylEk8ypoh+Rp56kLPO0tj3h3SPKBlU1E2cjmU4eesHmGs+FCw+blIdKAmaC/Z/RLXsbyn0U9C8vDCJuoeZS83aO5rTXG5gWDCRfIShRes05v5I9sfugwa8vq7jIdtx5elratuaCfMvrCVRc6BMXVAo1QOFa8UHZuaRnj+RMHE1ROL/dOUEg8oGFbdF//cI32DJuDNREdkzZn6RHUSvxOifKNT6VDeLS/uUU2rWwev1DER5xPxw1auyE6uvV0QqJxWwKbb1tPQ4JyDOpRORlVaQhpKdpDf/4uyvajo4voGtkvWykxRNLld1/4MqnY58oTuarp24zyuyNPGtTK0S5vo8a9q5wEcumpkDr+LMpqYzXWDxICSZU+v8Dh7i1h52F47cmv6SUvckBm2FzJGgPqqJ9Q1R/Q+CdjUf6T/pBAlKfC+s0cjtKq/MwyQrGIbzpJxvdLKjaX6MrWK/NLaHZibQek5PXatmv+XG9bvzFajjs7fWkg5f8gOBxpYtOpWeHBqHJs606yvIXNe8CmYSY6ucLUq1fhyT9aYWyeNH5oR9hl/7jt6opjDx27vQuyRDuqaFaClaOcG7eVpZ0IunrKOb1RkceXVlnP1vIhBb70CMqFJTpulp989992gqJaVR3Csx0mO/AWimyhiIix3/OI3VF0DJvRvPeWNrzRv1DI8X/UAzOUel/0qwAAAABJRU5ErkJggg==";
|
|
1083
|
+
//#endregion
|
|
1084
|
+
//#region src/components/SEBankIDQRCode.tsx
|
|
1085
|
+
function searchParamsToPOJO$1(input) {
|
|
1086
|
+
return Array.from(input.keys()).reduce((memo, key) => {
|
|
1087
|
+
memo[key] = input.get(key);
|
|
1088
|
+
return memo;
|
|
1089
|
+
}, {});
|
|
1090
|
+
}
|
|
1091
|
+
function SEBankIDQrCode(props) {
|
|
1092
|
+
var _ref, _props$language, _window$innerHeight, _wrapperRef$current, _wrapperRef$current2, _props$qrMargin;
|
|
1093
|
+
const wrapperRef = useRef(null);
|
|
1094
|
+
const { buildAuthorizeUrl, completionStrategy, handleResponse, generatePKCE, redirectUri: defaultRedirectURi, uiLocales } = useContext(CriiptoVerifyContext);
|
|
1095
|
+
const language = (_ref = (_props$language = props.language) !== null && _props$language !== void 0 ? _props$language : uiLocales) !== null && _ref !== void 0 ? _ref : "en";
|
|
1096
|
+
const redirectUri = props.redirectUri || defaultRedirectURi;
|
|
1097
|
+
const [qrCode, setQrCode] = useState(null);
|
|
1098
|
+
const [pollUrl, setPollUrl] = useState(null);
|
|
1099
|
+
const [error, setError] = useState(null);
|
|
1100
|
+
const [pkce, setPKCE] = useState(void 0);
|
|
1101
|
+
const [isCompleting, setCompleting] = useState(false);
|
|
1102
|
+
const [fullscreen, setFullscreen] = useState(false);
|
|
1103
|
+
const refresh = useCallback(_asyncToGenerator(function* () {
|
|
1104
|
+
setError(null);
|
|
1105
|
+
setQrCode(null);
|
|
1106
|
+
setPollUrl(null);
|
|
1107
|
+
setPKCE(void 0);
|
|
1108
|
+
const pkce = yield generatePKCE();
|
|
1109
|
+
buildAuthorizeUrl({
|
|
1110
|
+
acrValues: "urn:grn:authn:se:bankid:another-device:qr",
|
|
1111
|
+
responseMode: "json",
|
|
1112
|
+
pkce,
|
|
1113
|
+
redirectUri,
|
|
1114
|
+
prompt: "login"
|
|
1115
|
+
}).then((url) => {
|
|
1116
|
+
return fetch(url).then((response) => response.json());
|
|
1117
|
+
}).then((response) => {
|
|
1118
|
+
setPKCE(pkce);
|
|
1119
|
+
setQrCode(response.initialQrCode);
|
|
1120
|
+
setPollUrl(response.pollUrl);
|
|
1121
|
+
}).catch(console.error);
|
|
1122
|
+
}), [buildAuthorizeUrl, redirectUri]);
|
|
1123
|
+
useEffect(() => {
|
|
1124
|
+
refresh();
|
|
1125
|
+
}, [refresh]);
|
|
1126
|
+
const handleRetry = () => {
|
|
1127
|
+
setCompleting(false);
|
|
1128
|
+
refresh();
|
|
1129
|
+
};
|
|
1130
|
+
const handleError = useCallback((error) => {
|
|
1131
|
+
if (error === "Collect failed: startFailed" || error === "\"Collect failed: startFailed\"") {
|
|
1132
|
+
handleRetry();
|
|
1133
|
+
return;
|
|
1134
|
+
}
|
|
1135
|
+
setError(new Error(error));
|
|
1136
|
+
handleResponse(new Error(error), {
|
|
1137
|
+
pkce,
|
|
1138
|
+
redirectUri,
|
|
1139
|
+
source: "SEBankIDQrCode"
|
|
1140
|
+
});
|
|
1141
|
+
}, [pkce, redirectUri]);
|
|
1142
|
+
const handleComplete = useCallback(function() {
|
|
1143
|
+
var _ref2 = _asyncToGenerator(function* (completeUrl) {
|
|
1144
|
+
setCompleting(true);
|
|
1145
|
+
const required = { pkce };
|
|
1146
|
+
const parsed = yield parseCompleteUrl(completeUrl);
|
|
1147
|
+
if (parsed instanceof Error) return handleError(parsed.message);
|
|
1148
|
+
const { location, response } = parsed;
|
|
1149
|
+
if (completionStrategy === "openidprovider") {
|
|
1150
|
+
window.location.href = location;
|
|
1151
|
+
return;
|
|
1152
|
+
}
|
|
1153
|
+
yield handleResponse(response, {
|
|
1154
|
+
pkce: required.pkce,
|
|
1155
|
+
redirectUri,
|
|
1156
|
+
source: "SEBankIDQrCode"
|
|
1157
|
+
});
|
|
1158
|
+
});
|
|
1159
|
+
return function(_x) {
|
|
1160
|
+
return _ref2.apply(this, arguments);
|
|
1161
|
+
};
|
|
1162
|
+
}(), [completionStrategy, pkce]);
|
|
1163
|
+
/**
|
|
1164
|
+
* Render QR codes
|
|
1165
|
+
*/
|
|
1166
|
+
const qrDataURL = useDraw(qrCode, {
|
|
1167
|
+
width: fullscreen ? (_window$innerHeight = window.innerHeight) !== null && _window$innerHeight !== void 0 ? _window$innerHeight : (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.offsetWidth : (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.offsetWidth,
|
|
1168
|
+
qrMargin: (_props$qrMargin = props.qrMargin) !== null && _props$qrMargin !== void 0 ? _props$qrMargin : fullscreen ? 2 : void 0
|
|
1169
|
+
});
|
|
1170
|
+
/**
|
|
1171
|
+
* Poll for response
|
|
1172
|
+
*/
|
|
1173
|
+
usePoll(pollUrl, {
|
|
1174
|
+
enabled: !isCompleting,
|
|
1175
|
+
onQrCode: setQrCode,
|
|
1176
|
+
onComplete: handleComplete,
|
|
1177
|
+
onError: handleError
|
|
1178
|
+
});
|
|
1179
|
+
const i18n = getI18n(language);
|
|
1180
|
+
const imageElement = /* @__PURE__ */ jsx("button", {
|
|
1181
|
+
"aria-label": i18n.thisIsTheQR,
|
|
1182
|
+
ref: wrapperRef,
|
|
1183
|
+
className: "criipto-se-bankid-qr-canvas",
|
|
1184
|
+
onClick: () => setFullscreen((val) => !val),
|
|
1185
|
+
children: qrDataURL ? /* @__PURE__ */ jsx("img", { src: qrDataURL }) : null
|
|
1186
|
+
});
|
|
1187
|
+
const qrElement = /* @__PURE__ */ jsxs("div", {
|
|
1188
|
+
className: "criipto-se-bankid-qr",
|
|
1189
|
+
children: [/* @__PURE__ */ jsxs("aside", {
|
|
1190
|
+
className: "criipto-se-bankid-qr--help-text",
|
|
1191
|
+
children: [isCompleting ? i18n.completingLogin : i18n.openAndScan, /* @__PURE__ */ jsx("img", { src: logo_2x_default })]
|
|
1192
|
+
}), imageElement]
|
|
1193
|
+
});
|
|
1194
|
+
if (!qrCode && props.fallback) return props.fallback;
|
|
1195
|
+
if (props.children) return props.children({
|
|
1196
|
+
qrElement,
|
|
1197
|
+
imageElement,
|
|
1198
|
+
error,
|
|
1199
|
+
isCompleting,
|
|
1200
|
+
retry: () => handleRetry(),
|
|
1201
|
+
fullscreen
|
|
1202
|
+
});
|
|
1203
|
+
if (fullscreen) return /* @__PURE__ */ jsx("dialog", {
|
|
1204
|
+
className: "criipto-se-bankid-qr-fullscreen",
|
|
1205
|
+
open: true,
|
|
1206
|
+
children: imageElement
|
|
1207
|
+
});
|
|
1208
|
+
return qrElement;
|
|
1209
|
+
}
|
|
1210
|
+
SEBankIDQrCode.acr_values = "urn:grn:authn:se:bankid:another-device:qr";
|
|
1211
|
+
function useDraw(qrCode, options) {
|
|
1212
|
+
const { width, qrMargin } = options;
|
|
1213
|
+
const [dataURL, setDataURL] = useState(null);
|
|
1214
|
+
useEffect(() => {
|
|
1215
|
+
if (!qrCode) return;
|
|
1216
|
+
let isSubscribed = true;
|
|
1217
|
+
_asyncToGenerator(function* () {
|
|
1218
|
+
const qrImage = yield QRCode$1.toDataURL(qrCode, {
|
|
1219
|
+
errorCorrectionLevel: "low",
|
|
1220
|
+
scale: 10,
|
|
1221
|
+
width,
|
|
1222
|
+
margin: qrMargin !== null && qrMargin !== void 0 ? qrMargin : 4
|
|
1223
|
+
});
|
|
1224
|
+
if (!isSubscribed) return;
|
|
1225
|
+
setDataURL(qrImage);
|
|
1226
|
+
})();
|
|
1227
|
+
return () => {
|
|
1228
|
+
isSubscribed = false;
|
|
1229
|
+
};
|
|
1230
|
+
}, [
|
|
1231
|
+
qrCode,
|
|
1232
|
+
qrMargin,
|
|
1233
|
+
width
|
|
1234
|
+
]);
|
|
1235
|
+
return dataURL;
|
|
1236
|
+
}
|
|
1237
|
+
function usePoll(pollUrl, options) {
|
|
1238
|
+
const { onQrCode, onComplete, onError, enabled } = options;
|
|
1239
|
+
useEffect(() => {
|
|
1240
|
+
if (!pollUrl) return;
|
|
1241
|
+
if (!enabled) return;
|
|
1242
|
+
const delay = 2500;
|
|
1243
|
+
let timeout;
|
|
1244
|
+
let isSubscribed = true;
|
|
1245
|
+
const poll = function() {
|
|
1246
|
+
var _ref3 = _asyncToGenerator(function* () {
|
|
1247
|
+
if (!isSubscribed) return;
|
|
1248
|
+
const response = yield fetch(pollUrl);
|
|
1249
|
+
if (!isSubscribed) return;
|
|
1250
|
+
if (response.status < 400) {
|
|
1251
|
+
const payload = yield response.json();
|
|
1252
|
+
if (payload.qrCode) onQrCode(payload.qrCode);
|
|
1253
|
+
if (payload.targetUrl) {
|
|
1254
|
+
onComplete(payload.targetUrl);
|
|
1255
|
+
return;
|
|
1256
|
+
}
|
|
1257
|
+
} else onError(yield response.text());
|
|
1258
|
+
if (response.status === 202) timeout = setTimeout(poll, delay);
|
|
1259
|
+
});
|
|
1260
|
+
return function poll() {
|
|
1261
|
+
return _ref3.apply(this, arguments);
|
|
1262
|
+
};
|
|
1263
|
+
}();
|
|
1264
|
+
timeout = setTimeout(poll, delay);
|
|
1265
|
+
return () => {
|
|
1266
|
+
isSubscribed = false;
|
|
1267
|
+
clearTimeout(timeout);
|
|
1268
|
+
};
|
|
1269
|
+
}, [
|
|
1270
|
+
pollUrl,
|
|
1271
|
+
onQrCode,
|
|
1272
|
+
onComplete,
|
|
1273
|
+
onError,
|
|
1274
|
+
enabled
|
|
1275
|
+
]);
|
|
1276
|
+
}
|
|
1277
|
+
function parseCompleteUrl(_x2) {
|
|
1278
|
+
return _parseCompleteUrl.apply(this, arguments);
|
|
1279
|
+
}
|
|
1280
|
+
function _parseCompleteUrl() {
|
|
1281
|
+
_parseCompleteUrl = _asyncToGenerator(function* (completeUrl) {
|
|
1282
|
+
/**
|
|
1283
|
+
* Handle verify response inconsistencies
|
|
1284
|
+
*/
|
|
1285
|
+
if (completeUrl.includes("error=")) return {
|
|
1286
|
+
location: completeUrl,
|
|
1287
|
+
response: searchParamsToPOJO$1(new URL(completeUrl).searchParams)
|
|
1288
|
+
};
|
|
1289
|
+
const completeResponse = yield fetch(completeUrl);
|
|
1290
|
+
if (completeResponse.status >= 400) return new Error(yield completeResponse.text());
|
|
1291
|
+
const { location } = yield completeResponse.json();
|
|
1292
|
+
return {
|
|
1293
|
+
location,
|
|
1294
|
+
response: searchParamsToPOJO$1(new URL(location).searchParams)
|
|
1295
|
+
};
|
|
1296
|
+
});
|
|
1297
|
+
return _parseCompleteUrl.apply(this, arguments);
|
|
1298
|
+
}
|
|
1299
|
+
const AuthButtonGroupContext = createContext({
|
|
1300
|
+
multiple: false,
|
|
1301
|
+
acrValues: [],
|
|
1302
|
+
disabled: false,
|
|
1303
|
+
setDisabled: () => {}
|
|
1304
|
+
});
|
|
1305
|
+
function AuthButtonGroup(props) {
|
|
1306
|
+
const acrValues = React.Children.toArray(props.children).flatMap((child) => {
|
|
1307
|
+
if (!child || typeof child !== "object") return [];
|
|
1308
|
+
if ("type" in child) {
|
|
1309
|
+
if (child.type === AuthMethodButtonContainer) {
|
|
1310
|
+
const props = child.props;
|
|
1311
|
+
return props.acrValue ? [props.acrValue] : [];
|
|
1312
|
+
}
|
|
1313
|
+
if (child.type === AuthMethodButtonComponent) {
|
|
1314
|
+
const props = child.props;
|
|
1315
|
+
return props.acrValue ? [props.acrValue] : [];
|
|
1316
|
+
}
|
|
1317
|
+
if (child.type === SEBankIDQrCode) return ["urn:grn:authn:se:bankid:another-device:qr"];
|
|
1318
|
+
}
|
|
1319
|
+
return [];
|
|
1320
|
+
});
|
|
1321
|
+
const [disabled, setDisabled] = useState(false);
|
|
1322
|
+
const context = {
|
|
1323
|
+
multiple: acrValues.length > 1,
|
|
1324
|
+
acrValues,
|
|
1325
|
+
disabled,
|
|
1326
|
+
setDisabled
|
|
1327
|
+
};
|
|
1328
|
+
return /* @__PURE__ */ jsx(AuthButtonGroupContext.Provider, {
|
|
1329
|
+
value: context,
|
|
1330
|
+
children: props.children
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
//#endregion
|
|
1334
|
+
//#region src/components/Spinner/Spinner.tsx
|
|
1335
|
+
function Spinner() {
|
|
1336
|
+
return /* @__PURE__ */ jsx("div", { className: "criipto-eid-loader" });
|
|
1337
|
+
}
|
|
1338
|
+
//#endregion
|
|
1339
|
+
//#region src/components/SEBankIDSameDeviceButton.tsx
|
|
1340
|
+
function searchParamsToPOJO(input) {
|
|
1341
|
+
return Array.from(input.keys()).reduce((memo, key) => {
|
|
1342
|
+
memo[key] = input.get(key);
|
|
1343
|
+
return memo;
|
|
1344
|
+
}, {});
|
|
1345
|
+
}
|
|
1346
|
+
function determineStrategy(input, loginHint) {
|
|
1347
|
+
var _userAgent$browser$na;
|
|
1348
|
+
const userAgent = getUserAgent(input);
|
|
1349
|
+
const mobileOS = (userAgent === null || userAgent === void 0 ? void 0 : userAgent.os.name) === "iOS" ? "iOS" : (userAgent === null || userAgent === void 0 ? void 0 : userAgent.os.name) === "Android" ? "android" : (userAgent === null || userAgent === void 0 ? void 0 : userAgent.browser.name) === "Samsung Internet" ? "android" : null;
|
|
1350
|
+
const iOSSafari = mobileOS === "iOS" && (userAgent === null || userAgent === void 0 || (_userAgent$browser$na = userAgent.browser.name) === null || _userAgent$browser$na === void 0 ? void 0 : _userAgent$browser$na.includes("Safari")) ? true : false;
|
|
1351
|
+
const androidChrome = mobileOS === "android" && (userAgent === null || userAgent === void 0 ? void 0 : userAgent.browser.name) === "Mobile Chrome" ? true : false;
|
|
1352
|
+
const redirect = iOSSafari && !(loginHint === null || loginHint === void 0 ? void 0 : loginHint.includes("appswitch:resumeUrl:disable"));
|
|
1353
|
+
return {
|
|
1354
|
+
resume: mobileOS ? iOSSafari && redirect ? "Reload" : "Foreground" : "Poll",
|
|
1355
|
+
linkType: mobileOS === "iOS" || androidChrome ? "universal" : "scheme",
|
|
1356
|
+
redirect
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
var NotDoneError = class extends Error {
|
|
1360
|
+
constructor(message) {
|
|
1361
|
+
super(message);
|
|
1362
|
+
this.name = "NotDoneError";
|
|
1363
|
+
}
|
|
1364
|
+
};
|
|
1365
|
+
function fetchComplete(_x) {
|
|
1366
|
+
return _fetchComplete.apply(this, arguments);
|
|
1367
|
+
}
|
|
1368
|
+
function _fetchComplete() {
|
|
1369
|
+
_fetchComplete = _asyncToGenerator(function* (completeUrl) {
|
|
1370
|
+
const completeResponse = yield fetch(completeUrl);
|
|
1371
|
+
if (completeResponse.status >= 400) {
|
|
1372
|
+
const errorMessage = yield completeResponse.text();
|
|
1373
|
+
if (errorMessage.includes("Native-app driven authentication is not done")) return new NotDoneError(errorMessage);
|
|
1374
|
+
return new Error(errorMessage);
|
|
1375
|
+
}
|
|
1376
|
+
const { location } = yield completeResponse.json();
|
|
1377
|
+
return { location };
|
|
1378
|
+
});
|
|
1379
|
+
return _fetchComplete.apply(this, arguments);
|
|
1380
|
+
}
|
|
1381
|
+
function SEBankIDSameDeviceButton(props) {
|
|
1382
|
+
var _autoHydratedState$li, _autoHydratedState$pk;
|
|
1383
|
+
const { loginHint } = useContext(CriiptoVerifyContext);
|
|
1384
|
+
const group = useContext(AuthButtonGroupContext);
|
|
1385
|
+
const rawUserAgent = typeof navigator !== "undefined" ? navigator.userAgent : props.userAgent;
|
|
1386
|
+
const strategy = useMemo(() => determineStrategy(rawUserAgent, loginHint), [rawUserAgent, loginHint]);
|
|
1387
|
+
const [href, setHref] = useState();
|
|
1388
|
+
const [links, setLinks] = useState((_autoHydratedState$li = autoHydratedState === null || autoHydratedState === void 0 ? void 0 : autoHydratedState.links) !== null && _autoHydratedState$li !== void 0 ? _autoHydratedState$li : null);
|
|
1389
|
+
const [pkce, setPKCE] = useState((_autoHydratedState$pk = autoHydratedState === null || autoHydratedState === void 0 ? void 0 : autoHydratedState.pkce) !== null && _autoHydratedState$pk !== void 0 ? _autoHydratedState$pk : void 0);
|
|
1390
|
+
const [error, setError] = useState(null);
|
|
1391
|
+
const [log, setLog] = useState([]);
|
|
1392
|
+
const [initiated, setInitiated] = useState(autoHydratedState ? true : false);
|
|
1393
|
+
const { buildAuthorizeUrl, completionStrategy, generatePKCE, handleResponse, redirectUri: defaultRedirectURi, domain } = useContext(CriiptoVerifyContext);
|
|
1394
|
+
const redirectUri = props.redirectUri || defaultRedirectURi;
|
|
1395
|
+
const disabled = props.disabled || group.disabled || initiated;
|
|
1396
|
+
const reset = () => {
|
|
1397
|
+
setPKCE(void 0);
|
|
1398
|
+
setLinks(null);
|
|
1399
|
+
};
|
|
1400
|
+
const handleLog = (...statements) => {
|
|
1401
|
+
setLog((logs) => logs.concat([statements]));
|
|
1402
|
+
};
|
|
1403
|
+
const handleComplete = useCallback(function() {
|
|
1404
|
+
var _ref = _asyncToGenerator(function* (completeUrl) {
|
|
1405
|
+
const required = { pkce };
|
|
1406
|
+
reset();
|
|
1407
|
+
const result = completeUrl.startsWith(`https://${domain}`) || completeUrl.startsWith(`http://${domain}`) ? yield fetchComplete(completeUrl) : { location: completeUrl };
|
|
1408
|
+
if (result instanceof NotDoneError && strategy.resume === "Reload") {
|
|
1409
|
+
yield handleResponse({ error: "access_denied" }, {
|
|
1410
|
+
pkce: required.pkce,
|
|
1411
|
+
redirectUri,
|
|
1412
|
+
source: "SEBankIDSameDeviceButton"
|
|
1413
|
+
});
|
|
1414
|
+
return;
|
|
1415
|
+
}
|
|
1416
|
+
if (result instanceof Error) {
|
|
1417
|
+
setError(result.message);
|
|
1418
|
+
return;
|
|
1419
|
+
}
|
|
1420
|
+
const { location } = result;
|
|
1421
|
+
if (completionStrategy === "openidprovider") {
|
|
1422
|
+
window.location.href = location;
|
|
1423
|
+
return;
|
|
1424
|
+
}
|
|
1425
|
+
yield handleResponse(searchParamsToPOJO(new URL(location).searchParams), {
|
|
1426
|
+
pkce: required.pkce,
|
|
1427
|
+
redirectUri,
|
|
1428
|
+
source: "SEBankIDSameDeviceButton"
|
|
1429
|
+
});
|
|
1430
|
+
});
|
|
1431
|
+
return function(_x2) {
|
|
1432
|
+
return _ref.apply(this, arguments);
|
|
1433
|
+
};
|
|
1434
|
+
}(), [
|
|
1435
|
+
completionStrategy,
|
|
1436
|
+
pkce,
|
|
1437
|
+
domain,
|
|
1438
|
+
strategy
|
|
1439
|
+
]);
|
|
1440
|
+
const refresh = useCallback(_asyncToGenerator(function* () {
|
|
1441
|
+
handleLog("SEBankID: Refresh authorize url");
|
|
1442
|
+
const pkce = yield generatePKCE();
|
|
1443
|
+
buildAuthorizeUrl({
|
|
1444
|
+
acrValues: "urn:grn:authn:se:bankid:same-device",
|
|
1445
|
+
loginHint: (loginHint === null || loginHint === void 0 ? void 0 : loginHint.includes("appswitch:")) ? void 0 : "appswitch:browser",
|
|
1446
|
+
responseMode: "json",
|
|
1447
|
+
pkce,
|
|
1448
|
+
redirectUri,
|
|
1449
|
+
prompt: "login"
|
|
1450
|
+
}).then((url) => {
|
|
1451
|
+
return fetch(url).then((response) => response.json());
|
|
1452
|
+
}).then((links) => {
|
|
1453
|
+
setPKCE(pkce || void 0);
|
|
1454
|
+
setLinks(links);
|
|
1455
|
+
const redirect = strategy.redirect ? window.location.href : "null";
|
|
1456
|
+
const newUrl = new URL(strategy.linkType === "universal" ? links.launchLinks.universalLink : links.launchLinks.customFileHandlerUrl);
|
|
1457
|
+
newUrl.searchParams.set("redirect", redirect);
|
|
1458
|
+
const newHref = newUrl.href;
|
|
1459
|
+
handleLog(window.location.href);
|
|
1460
|
+
handleLog(newHref);
|
|
1461
|
+
setHref(newHref);
|
|
1462
|
+
}).catch((err) => {
|
|
1463
|
+
setInitiated(false);
|
|
1464
|
+
});
|
|
1465
|
+
}), [
|
|
1466
|
+
buildAuthorizeUrl,
|
|
1467
|
+
redirectUri,
|
|
1468
|
+
strategy
|
|
1469
|
+
]);
|
|
1470
|
+
useEffect(() => {
|
|
1471
|
+
if (initiated) return;
|
|
1472
|
+
refresh();
|
|
1473
|
+
}, [refresh, initiated]);
|
|
1474
|
+
useEffect(() => {
|
|
1475
|
+
if (initiated) return;
|
|
1476
|
+
const interval = setInterval(() => {
|
|
1477
|
+
if (initiated) return;
|
|
1478
|
+
refresh();
|
|
1479
|
+
}, 25e3);
|
|
1480
|
+
return () => clearInterval(interval);
|
|
1481
|
+
}, [refresh, initiated]);
|
|
1482
|
+
const handleInitiate = () => {
|
|
1483
|
+
group.setDisabled(true);
|
|
1484
|
+
handleLog("Initiated");
|
|
1485
|
+
setInitiated(true);
|
|
1486
|
+
setError(null);
|
|
1487
|
+
};
|
|
1488
|
+
const handleError = function() {
|
|
1489
|
+
var _ref2 = _asyncToGenerator(function* (error) {
|
|
1490
|
+
group.setDisabled(false);
|
|
1491
|
+
setInitiated(false);
|
|
1492
|
+
setError(error);
|
|
1493
|
+
if (error === "access_denied" || error === "\"access_denied\"") yield handleResponse({ error: "access_denied" }, {
|
|
1494
|
+
pkce,
|
|
1495
|
+
redirectUri,
|
|
1496
|
+
source: "SEBankIDSameDeviceButton"
|
|
1497
|
+
});
|
|
1498
|
+
});
|
|
1499
|
+
return function handleError(_x3) {
|
|
1500
|
+
return _ref2.apply(this, arguments);
|
|
1501
|
+
};
|
|
1502
|
+
}();
|
|
1503
|
+
const element = href ? /* @__PURE__ */ jsxs("a", {
|
|
1504
|
+
className: classNames(props.className, { "criipto-eid-btn--disabled": disabled }),
|
|
1505
|
+
href,
|
|
1506
|
+
onClick: handleInitiate,
|
|
1507
|
+
children: [initiated ? /* @__PURE__ */ jsx("div", {
|
|
1508
|
+
className: "criipto-eid-logo",
|
|
1509
|
+
children: /* @__PURE__ */ jsx(Spinner, {})
|
|
1510
|
+
}) : props.logo, props.children]
|
|
1511
|
+
}) : props.fallback;
|
|
1512
|
+
return /* @__PURE__ */ jsxs(React.Fragment, { children: [links ? /* @__PURE__ */ jsx(React.Fragment, { children: strategy.resume === "Poll" ? /* @__PURE__ */ jsx(SEBankIDSameDevicePoll, {
|
|
1513
|
+
links,
|
|
1514
|
+
onError: handleError,
|
|
1515
|
+
onComplete: handleComplete,
|
|
1516
|
+
onInitiate: handleInitiate,
|
|
1517
|
+
onLog: handleLog,
|
|
1518
|
+
children: element
|
|
1519
|
+
}) : strategy.resume === "Foreground" ? /* @__PURE__ */ jsx(SEBankIDSameDeviceForeground, {
|
|
1520
|
+
links,
|
|
1521
|
+
onError: handleError,
|
|
1522
|
+
onComplete: handleComplete,
|
|
1523
|
+
onInitiate: handleInitiate,
|
|
1524
|
+
onLog: handleLog,
|
|
1525
|
+
children: element
|
|
1526
|
+
}) : strategy.resume === "Reload" ? /* @__PURE__ */ jsx(SEBankIDSameDeviceReload, {
|
|
1527
|
+
links,
|
|
1528
|
+
onError: handleError,
|
|
1529
|
+
onComplete: handleComplete,
|
|
1530
|
+
onInitiate: handleInitiate,
|
|
1531
|
+
onLog: handleLog,
|
|
1532
|
+
redirectUri,
|
|
1533
|
+
pkce,
|
|
1534
|
+
children: element
|
|
1535
|
+
}) : element }) : element, error && /* @__PURE__ */ jsx("p", { children: error })] });
|
|
1536
|
+
}
|
|
1537
|
+
//#endregion
|
|
1538
|
+
//#region src/components/AuthMethodButton/logos/dkmitid.png
|
|
1539
|
+
var dkmitid_default = "data:image/png;base64,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";
|
|
1540
|
+
//#endregion
|
|
1541
|
+
//#region src/components/AuthMethodButton/logos/dkmitiderhverv.png
|
|
1542
|
+
var dkmitiderhverv_default = "data:image/png;base64,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";
|
|
1543
|
+
//#endregion
|
|
1544
|
+
//#region src/components/AuthMethodButton/logos/ftnmobile.png
|
|
1545
|
+
var ftnmobile_default = "data:image/png;base64,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";
|
|
1546
|
+
//#endregion
|
|
1547
|
+
//#region src/components/AuthMethodButton/logos/itsme.png
|
|
1548
|
+
var itsme_default = "data:image/png;base64,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";
|
|
1549
|
+
//#endregion
|
|
1550
|
+
//#region src/components/AuthMethodButton/logos/nobankid.png
|
|
1551
|
+
var nobankid_default = "data:image/png;base64,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";
|
|
1552
|
+
//#endregion
|
|
1553
|
+
//#region src/components/AuthMethodButton/logos/novipps.png
|
|
1554
|
+
var novipps_default = "data:image/png;base64,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";
|
|
1555
|
+
//#endregion
|
|
1556
|
+
//#region src/components/AuthMethodButton/logos/sebankid.png
|
|
1557
|
+
var sebankid_default = "data:image/png;base64,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";
|
|
1558
|
+
//#endregion
|
|
1559
|
+
//#region src/components/AuthMethodButton/logos/sefrejaid.png
|
|
1560
|
+
var sefrejaid_default = "data:image/png;base64,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";
|
|
1561
|
+
//#endregion
|
|
1562
|
+
//#region src/components/AuthMethodButton/logos/depersonalausweis.png
|
|
1563
|
+
var depersonalausweis_default = "data:image/png;base64,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";
|
|
1564
|
+
//#endregion
|
|
1565
|
+
//#region src/components/AuthMethodButton/logos/ukoneid.png
|
|
1566
|
+
var ukoneid_default = "data:image/png;base64,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";
|
|
1567
|
+
//#endregion
|
|
1568
|
+
//#region src/components/AuthMethodButton/logos/idin.png
|
|
1569
|
+
var idin_default = "data:image/png;base64,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";
|
|
1570
|
+
//#endregion
|
|
1571
|
+
//#region src/components/AuthMethodButton/logos/ftn.png
|
|
1572
|
+
var ftn_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAABICAYAAABWdn8qAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAsKADAAQAAAABAAAASAAAAACoGQzqAAADbUlEQVR4Ae2agVHbMBSGSa8DMIJH6Ab1BmWEdgLSCWImgE4AjNAJmhE6gkdgg/R/xXAc957tEMeWrE93hvCkSL8+/XlIdi4uKBCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCJxG4HA4NLrWUupTaAjC9wBEc0q/qb33U2qC0PNKYPf6ihchAQwcolm8olYG3S6uInEBGDjtBdrJxJdpS1xWHQZelv/Q6GZethI9lD731K2p6q8m83viCZm5roM+b4L4+/AYc26VhR83m43NgbJmAlro6C7E/dTz1liVLreMHct9sx/8M7bPl3bqhrsQLzD4vTgBO9BdLa4iQQHsgRNclEDSrUxs2xbKGwIY+A2MRF620vHoaKkU2zrxokMYOM3lbyTryZF2rSxcOfFiQxg4waXXHYdWsn450mwLMfmB1BknmxAGTnep7iTNy8J2oKvTlT2vMgw8L+/RoykLm3m9LGx93HOge0aJgZ85pPozysKVBG9TFT2nLgw8J+0jxxrIwhzoxLMUA0dPpfSfeFSpj/TelM2jLHypQW6nHCjHvkoxcI5r819zl4Wj71Zc6eNXZzu5CYRj4AkgnrsLmdiy8D4Yp+gsjIEDVyQYjrLwF2XhYg90GDhBp3qSlIX3inuPmK35Tia2PXFxhe8Dj1vydlyzs7eyTPtN13uz2t9W1+gqqhRjYGWwJveVtQOdMq093PC+CG+31R7Ups19nsfoZwtxDK0E2nYfxNaRYlnYM7bTdD0hDJznWv4IZNv97iqoW2UYA2e4rMrCe8m2yytF3VbDwJ4F8ohZFn5ypBb1cAMDOw7IIdQd1qJvqxWzF8bAObg11ninqtaprhX76sRXF8LAGS+psrBtIcIDXcZTGy0dA49GlWbDgQNdmqInVIWBJ4S5YFdRFl5Q0jxDY+B5OJ91lO5Ad3PWQRLtHAMnujAfkGUHOu+22ge6yuctGDiftepV2h3ofvY2WmElBl7RosrED5rOfkVTGpwKBh5ElF2DovbCGDg7f/YL7m6rRU/o+t9MLQQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAuMI/AMbHRP0yohB0QAAAABJRU5ErkJggg==";
|
|
1573
|
+
//#endregion
|
|
1574
|
+
//#region src/components/AuthMethodButton/Logo.tsx
|
|
1575
|
+
function AuthMethodButtonLogo(props) {
|
|
1576
|
+
var _props$logo;
|
|
1577
|
+
const logo = typeof props.logo === "string" ? /* @__PURE__ */ jsx("img", {
|
|
1578
|
+
src: props.logo,
|
|
1579
|
+
alt: ""
|
|
1580
|
+
}) : (_props$logo = props.logo) !== null && _props$logo !== void 0 ? _props$logo : acrValueToLogo(props.acrValue) ? /* @__PURE__ */ jsx("img", {
|
|
1581
|
+
src: acrValueToLogo(props.acrValue),
|
|
1582
|
+
alt: ""
|
|
1583
|
+
}) : /* @__PURE__ */ jsx("span", { children: "\xA0" });
|
|
1584
|
+
if (logo) return /* @__PURE__ */ jsx("div", {
|
|
1585
|
+
className: "criipto-eid-logo",
|
|
1586
|
+
children: logo
|
|
1587
|
+
});
|
|
1588
|
+
return null;
|
|
1589
|
+
}
|
|
1590
|
+
function acrValueToLogo(value) {
|
|
1591
|
+
if (value.startsWith("urn:grn:authn:dk:mitid:business")) return dkmitiderhverv_default;
|
|
1592
|
+
if (value.startsWith("urn:grn:authn:dk:mitid")) return dkmitid_default;
|
|
1593
|
+
if (value.startsWith("urn:grn:authn:fi:mobile")) return ftnmobile_default;
|
|
1594
|
+
if (value.startsWith("urn:grn:authn:fi")) return ftn_default;
|
|
1595
|
+
if (value.startsWith("urn:grn:authn:itsme")) return itsme_default;
|
|
1596
|
+
if (value.startsWith("urn:grn:authn:se:bankid")) return sebankid_default;
|
|
1597
|
+
if (value.startsWith("urn:grn:authn:no:bankid")) return nobankid_default;
|
|
1598
|
+
if (value.startsWith("urn:grn:authn:no:vipps")) return novipps_default;
|
|
1599
|
+
if (value.startsWith("urn:grn:authn:se:frejaid")) return sefrejaid_default;
|
|
1600
|
+
if (value.startsWith("urn:grn:authn:uk:oneid")) return ukoneid_default;
|
|
1601
|
+
if (value.startsWith("urn:grn:authn:de:personalausweis")) return depersonalausweis_default;
|
|
1602
|
+
if (value.startsWith("urn:grn:authn:nl:idin")) return idin_default;
|
|
1603
|
+
}
|
|
1604
|
+
//#endregion
|
|
1605
|
+
//#region src/components/Button.tsx
|
|
1606
|
+
function AnchorButton(props) {
|
|
1607
|
+
return /* @__PURE__ */ jsx("a", {
|
|
1608
|
+
className: classNames(`criipto-verify-button`, props.className),
|
|
1609
|
+
href: props.href,
|
|
1610
|
+
"aria-disabled": props.disabled,
|
|
1611
|
+
onClick: props.onClick,
|
|
1612
|
+
children: props.children
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
function Button(props) {
|
|
1616
|
+
return /* @__PURE__ */ jsx("button", {
|
|
1617
|
+
className: classNames(`criipto-verify-button`, props.className),
|
|
1618
|
+
type: "button",
|
|
1619
|
+
disabled: props.disabled,
|
|
1620
|
+
onClick: props.onClick,
|
|
1621
|
+
children: props.children
|
|
1622
|
+
});
|
|
1623
|
+
}
|
|
1624
|
+
//#endregion
|
|
1625
|
+
//#region src/components/AuthMethodButton.tsx
|
|
1626
|
+
/**
|
|
1627
|
+
* Display only components, does no state management and triggers no login flows on it's own
|
|
1628
|
+
*/
|
|
1629
|
+
function AuthMethodButtonComponent(props) {
|
|
1630
|
+
var _props$language, _props$action, _props$children;
|
|
1631
|
+
const { acrValue, href } = props;
|
|
1632
|
+
const group = useContext(AuthButtonGroupContext);
|
|
1633
|
+
const standalone = !group.multiple || isSingle(props.acrValue, group.acrValues);
|
|
1634
|
+
const language = (_props$language = props.language) !== null && _props$language !== void 0 ? _props$language : "en";
|
|
1635
|
+
const action = (_props$action = props.action) !== null && _props$action !== void 0 ? _props$action : "login";
|
|
1636
|
+
const disabled = (props.disabled || group.disabled) && !props.loading;
|
|
1637
|
+
const className = classNames(`criipto-eid-btn`, acrValueToClassName(acrValue), props.className, {
|
|
1638
|
+
"criipto-eid-btn--disabled": disabled,
|
|
1639
|
+
"criipto-eid-btn--loading": props.loading
|
|
1640
|
+
});
|
|
1641
|
+
const { title, subtitle } = acrValueToTitle(language, acrValue, { disambiguate: isAmbiguous(acrValue, group.acrValues) });
|
|
1642
|
+
const contents = (_props$children = props.children) !== null && _props$children !== void 0 ? _props$children : /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
1643
|
+
stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : "",
|
|
1644
|
+
title,
|
|
1645
|
+
"\xA0",
|
|
1646
|
+
standalone ? null : lowercaseFirst(subtitle)
|
|
1647
|
+
] });
|
|
1648
|
+
const inner = /* @__PURE__ */ jsxs(React.Fragment, { children: [/* @__PURE__ */ jsx(AuthMethodButtonLogo, {
|
|
1649
|
+
acrValue,
|
|
1650
|
+
logo: props.loading ? /* @__PURE__ */ jsx(Spinner, {}) : props.logo
|
|
1651
|
+
}), /* @__PURE__ */ jsx("span", { children: contents })] });
|
|
1652
|
+
const commonProps = _objectSpread2(_objectSpread2({}, props), {}, {
|
|
1653
|
+
className,
|
|
1654
|
+
disabled
|
|
1655
|
+
});
|
|
1656
|
+
return href ? /* @__PURE__ */ jsx(React.Fragment, { children: /* @__PURE__ */ jsx(AnchorButton, _objectSpread2(_objectSpread2({}, commonProps), {}, {
|
|
1657
|
+
href,
|
|
1658
|
+
children: inner
|
|
1659
|
+
})) }) : /* @__PURE__ */ jsx(React.Fragment, { children: /* @__PURE__ */ jsx(Button, _objectSpread2(_objectSpread2({}, commonProps), {}, { children: inner })) });
|
|
1660
|
+
}
|
|
1661
|
+
function AuthMethodButtonContainer(props) {
|
|
1662
|
+
var _ref, _props$language2, _ref2, _props$action2, _props$loading, _props$children2;
|
|
1663
|
+
const { acrValue } = props;
|
|
1664
|
+
const group = useContext(AuthButtonGroupContext);
|
|
1665
|
+
const standalone = !group.multiple || isSingle(props.acrValue, group.acrValues);
|
|
1666
|
+
const context = useContext(CriiptoVerifyContext);
|
|
1667
|
+
const { initializePAR } = context;
|
|
1668
|
+
const language = (_ref = (_props$language2 = props.language) !== null && _props$language2 !== void 0 ? _props$language2 : context.uiLocales) !== null && _ref !== void 0 ? _ref : "en";
|
|
1669
|
+
const action = (_ref2 = (_props$action2 = props.action) !== null && _props$action2 !== void 0 ? _props$action2 : context.action) !== null && _ref2 !== void 0 ? _ref2 : "login";
|
|
1670
|
+
const className = `criipto-eid-btn ${acrValueToClassName(acrValue)}${props.className ? ` ${props.className}` : ""}`;
|
|
1671
|
+
const [backdrop, setBackdrop] = useState(null);
|
|
1672
|
+
const [loading, setLoading] = useState((_props$loading = props.loading) !== null && _props$loading !== void 0 ? _props$loading : false);
|
|
1673
|
+
useEffect(() => {
|
|
1674
|
+
var _props$loading2;
|
|
1675
|
+
setLoading((_props$loading2 = props.loading) !== null && _props$loading2 !== void 0 ? _props$loading2 : false);
|
|
1676
|
+
}, [props.loading]);
|
|
1677
|
+
const redirectUri = props.redirectUri || context.redirectUri;
|
|
1678
|
+
const handleClick = (event) => {
|
|
1679
|
+
if (props.href) return;
|
|
1680
|
+
if (context.pkce && "code_verifier" in context.pkce) savePKCEState(context.store, {
|
|
1681
|
+
response_type: "id_token",
|
|
1682
|
+
pkce_code_verifier: context.pkce.code_verifier,
|
|
1683
|
+
redirect_uri: redirectUri
|
|
1684
|
+
});
|
|
1685
|
+
if (props.popup) {
|
|
1686
|
+
let willPopup = typeof props.popup === "function" ? props.popup({
|
|
1687
|
+
acrValue,
|
|
1688
|
+
onHide: () => setBackdrop(null)
|
|
1689
|
+
}) : props.popup === true;
|
|
1690
|
+
if (willPopup !== false) {
|
|
1691
|
+
event.preventDefault();
|
|
1692
|
+
if (typeof willPopup === "boolean") context.loginWithPopup({
|
|
1693
|
+
acrValues: [acrValue],
|
|
1694
|
+
redirectUri,
|
|
1695
|
+
backdrop: true
|
|
1696
|
+
});
|
|
1697
|
+
else {
|
|
1698
|
+
setBackdrop(willPopup);
|
|
1699
|
+
context.loginWithPopup({
|
|
1700
|
+
acrValues: [acrValue],
|
|
1701
|
+
redirectUri,
|
|
1702
|
+
backdrop: false
|
|
1703
|
+
});
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
if (props.onClick) props.onClick(event);
|
|
1708
|
+
if (!event.isDefaultPrevented()) {
|
|
1709
|
+
setLoading(true);
|
|
1710
|
+
group.setDisabled(true);
|
|
1711
|
+
initializePAR({
|
|
1712
|
+
redirectUri,
|
|
1713
|
+
acrValues: acrValue,
|
|
1714
|
+
loginHint: ""
|
|
1715
|
+
}).then((authorizeUrl) => {
|
|
1716
|
+
window.location.href = authorizeUrl.toString();
|
|
1717
|
+
}).catch((error) => {
|
|
1718
|
+
setLoading(false);
|
|
1719
|
+
group.setDisabled(false);
|
|
1720
|
+
context.handleResponse(error);
|
|
1721
|
+
});
|
|
1722
|
+
}
|
|
1723
|
+
};
|
|
1724
|
+
const { title, subtitle } = acrValueToTitle(language, acrValue, { disambiguate: isAmbiguous(acrValue, group.acrValues) });
|
|
1725
|
+
const contents = (_props$children2 = props.children) !== null && _props$children2 !== void 0 ? _props$children2 : /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
1726
|
+
stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : "",
|
|
1727
|
+
title,
|
|
1728
|
+
"\xA0",
|
|
1729
|
+
standalone ? null : lowercaseFirst(subtitle)
|
|
1730
|
+
] });
|
|
1731
|
+
const button = /* @__PURE__ */ jsxs(React.Fragment, { children: [/* @__PURE__ */ jsx(AuthMethodButtonComponent, _objectSpread2(_objectSpread2({}, props), {}, {
|
|
1732
|
+
className,
|
|
1733
|
+
onClick: handleClick,
|
|
1734
|
+
loading
|
|
1735
|
+
})), backdrop] });
|
|
1736
|
+
if (!props.href && acrValue === "urn:grn:authn:se:bankid:same-device") return /* @__PURE__ */ jsx(SEBankIDSameDeviceButton, {
|
|
1737
|
+
redirectUri: props.redirectUri,
|
|
1738
|
+
fallback: button,
|
|
1739
|
+
className,
|
|
1740
|
+
userAgent: props.userAgent,
|
|
1741
|
+
logo: /* @__PURE__ */ jsx(AuthMethodButtonLogo, {
|
|
1742
|
+
acrValue,
|
|
1743
|
+
logo: props.logo
|
|
1744
|
+
}),
|
|
1745
|
+
disabled: props.disabled,
|
|
1746
|
+
children: /* @__PURE__ */ jsx("span", { children: contents })
|
|
1747
|
+
});
|
|
1748
|
+
return button;
|
|
1749
|
+
}
|
|
1750
|
+
function acrValueToClassName(value) {
|
|
1751
|
+
value = value.replace("urn:grn:authn:", "");
|
|
1752
|
+
return value.split(":").reduce((memo, segment) => {
|
|
1753
|
+
if (memo.length) return memo.concat([`${memo[memo.length - 1]}-${segment}`]);
|
|
1754
|
+
else return memo.concat([segment]);
|
|
1755
|
+
}, []).map((className) => `criipto-eid-btn--${className}`).join(" ");
|
|
1756
|
+
}
|
|
1757
|
+
function lowercaseFirst(input) {
|
|
1758
|
+
if (!input) return input;
|
|
1759
|
+
return input.substring(0, 1).toLowerCase() + input.substr(1, input.length);
|
|
1760
|
+
}
|
|
1761
|
+
//#endregion
|
|
1762
|
+
//#region src/components/AuthMethodSelector.tsx
|
|
1763
|
+
function AuthMethodSelector(props) {
|
|
1764
|
+
var _ref, _props$acrValues;
|
|
1765
|
+
const { action, uiLocales, acrValues: configurationAcrValues } = useContext(CriiptoVerifyContext);
|
|
1766
|
+
const language = props.language || uiLocales || "en";
|
|
1767
|
+
const acrValues = filterAcrValues((_ref = (_props$acrValues = props.acrValues) !== null && _props$acrValues !== void 0 ? _props$acrValues : configurationAcrValues) !== null && _ref !== void 0 ? _ref : []);
|
|
1768
|
+
if (!!acrValues.length && acrValues.every((s) => s.startsWith("urn:grn:authn:se:bankid:"))) return /* @__PURE__ */ jsx(Sweden, _objectSpread2(_objectSpread2({}, props), {}, { acrValues }));
|
|
1769
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1770
|
+
className: "criipto-eid-selector",
|
|
1771
|
+
children: /* @__PURE__ */ jsx(AuthButtonGroup, { children: acrValues.map((acrValue) => /* @__PURE__ */ jsx(AuthMethodButtonContainer, {
|
|
1772
|
+
acrValue,
|
|
1773
|
+
onClick: props.onSelect ? () => props.onSelect(acrValue) : void 0,
|
|
1774
|
+
redirectUri: props.redirectUri,
|
|
1775
|
+
popup: props.popup,
|
|
1776
|
+
language,
|
|
1777
|
+
action,
|
|
1778
|
+
userAgent: props.userAgent
|
|
1779
|
+
}, acrValue)) })
|
|
1780
|
+
});
|
|
1781
|
+
}
|
|
1782
|
+
function Sweden(props) {
|
|
1783
|
+
const { acrValues } = props;
|
|
1784
|
+
const { action, uiLocales } = useContext(CriiptoVerifyContext);
|
|
1785
|
+
const language = props.language || uiLocales || "en";
|
|
1786
|
+
const hasQR = acrValues.includes(SEBankIDQrCode.acr_values);
|
|
1787
|
+
const filteredAcrValues = acrValues.filter((s) => s !== SEBankIDQrCode.acr_values);
|
|
1788
|
+
const userAgent = getUserAgent(typeof navigator !== "undefined" ? navigator.userAgent : props.userAgent);
|
|
1789
|
+
const mobileOS = (userAgent === null || userAgent === void 0 ? void 0 : userAgent.os.name) === "iOS" ? "iOS" : (userAgent === null || userAgent === void 0 ? void 0 : userAgent.os.name) === "Android" ? "android" : null;
|
|
1790
|
+
const showQR = hasQR && !mobileOS;
|
|
1791
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1792
|
+
className: "criipto-eid-selector",
|
|
1793
|
+
children: /* @__PURE__ */ jsxs(AuthButtonGroup, { children: [filteredAcrValues.map((acrValue) => /* @__PURE__ */ jsx(AuthMethodButtonContainer, {
|
|
1794
|
+
acrValue,
|
|
1795
|
+
onClick: props.onSelect ? () => props.onSelect(acrValue) : void 0,
|
|
1796
|
+
redirectUri: props.redirectUri,
|
|
1797
|
+
popup: props.popup,
|
|
1798
|
+
language,
|
|
1799
|
+
action,
|
|
1800
|
+
userAgent: props.userAgent
|
|
1801
|
+
}, acrValue)), showQR ? /* @__PURE__ */ jsx(SEBankIDQrCode, {
|
|
1802
|
+
language,
|
|
1803
|
+
redirectUri: props.redirectUri,
|
|
1804
|
+
fallback: /* @__PURE__ */ jsx(AuthMethodButtonContainer, {
|
|
1805
|
+
acrValue: SEBankIDQrCode.acr_values,
|
|
1806
|
+
popup: props.popup,
|
|
1807
|
+
language,
|
|
1808
|
+
action,
|
|
1809
|
+
userAgent: props.userAgent
|
|
1810
|
+
})
|
|
1811
|
+
}) : hasQR && mobileOS ? /* @__PURE__ */ jsx(AuthMethodButtonContainer, {
|
|
1812
|
+
acrValue: SEBankIDQrCode.acr_values,
|
|
1813
|
+
redirectUri: props.redirectUri,
|
|
1814
|
+
popup: props.popup,
|
|
1815
|
+
language,
|
|
1816
|
+
action,
|
|
1817
|
+
userAgent: props.userAgent
|
|
1818
|
+
}) : null] })
|
|
1819
|
+
});
|
|
1820
|
+
}
|
|
1821
|
+
//#endregion
|
|
1822
|
+
//#region src/components/QRCode.tsx
|
|
1823
|
+
const QRCode = (props) => {
|
|
1824
|
+
var _ref, _props$acrValues;
|
|
1825
|
+
const { children, margin, className } = props;
|
|
1826
|
+
const elementRef = useRef(null);
|
|
1827
|
+
const { client, buildOptions, buildAuthorizeUrl, handleResponse, pkce, store, acrValues: configurationAcrValues } = useContext(CriiptoVerifyContext);
|
|
1828
|
+
const [requestId, setRequestId] = useState(() => Math.random().toString());
|
|
1829
|
+
const [isAcknowledged, setAcknowledged] = useState(false);
|
|
1830
|
+
const [isCancelled, setCancelled] = useState(false);
|
|
1831
|
+
const [error, setError] = useState(null);
|
|
1832
|
+
const [criiptoConfiguration, setCriiptoConfiguration] = useState(null);
|
|
1833
|
+
const isEnabled = criiptoConfiguration === null || criiptoConfiguration === void 0 ? void 0 : criiptoConfiguration.client.qr_enabled;
|
|
1834
|
+
const acrValues = (_ref = (_props$acrValues = props.acrValues) !== null && _props$acrValues !== void 0 ? _props$acrValues : configurationAcrValues) !== null && _ref !== void 0 ? _ref : [];
|
|
1835
|
+
useEffect(() => {
|
|
1836
|
+
let isSubsribed = true;
|
|
1837
|
+
client.fetchCriiptoConfiguration().then((c) => {
|
|
1838
|
+
if (!isSubsribed) return;
|
|
1839
|
+
setCriiptoConfiguration(c);
|
|
1840
|
+
});
|
|
1841
|
+
return () => {
|
|
1842
|
+
isSubsribed = false;
|
|
1843
|
+
};
|
|
1844
|
+
}, [client]);
|
|
1845
|
+
const redirect = useCallback(_asyncToGenerator(function* () {
|
|
1846
|
+
var _criiptoConfiguration;
|
|
1847
|
+
if (!criiptoConfiguration) return;
|
|
1848
|
+
const intermediaryUrl = ((_criiptoConfiguration = criiptoConfiguration.client.qr_intermediary_url) !== null && _criiptoConfiguration !== void 0 ? _criiptoConfiguration : criiptoConfiguration.qr_intermediary_url).replace("/{id}", "").replace("{id}", "");
|
|
1849
|
+
const authorizeUrl = new URL(yield buildAuthorizeUrl({ acrValues }));
|
|
1850
|
+
const authorizeParams = new URLSearchParams(authorizeUrl.search);
|
|
1851
|
+
authorizeParams.set("domain", authorizeUrl.host);
|
|
1852
|
+
authorizeUrl.host = new URL(intermediaryUrl).host;
|
|
1853
|
+
authorizeUrl.port = new URL(intermediaryUrl).port;
|
|
1854
|
+
authorizeUrl.pathname = new URL(intermediaryUrl).pathname + "/authorize";
|
|
1855
|
+
authorizeUrl.search = authorizeParams.toString();
|
|
1856
|
+
if (pkce && "code_verifier" in pkce) savePKCEState(store, {
|
|
1857
|
+
response_type: "id_token",
|
|
1858
|
+
pkce_code_verifier: pkce.code_verifier,
|
|
1859
|
+
redirect_uri: authorizeParams.get("redirect_uri")
|
|
1860
|
+
});
|
|
1861
|
+
window.location.href = authorizeUrl.toString();
|
|
1862
|
+
}), [
|
|
1863
|
+
buildAuthorizeUrl,
|
|
1864
|
+
criiptoConfiguration,
|
|
1865
|
+
acrValues
|
|
1866
|
+
]);
|
|
1867
|
+
const authorize = useCallback(() => {
|
|
1868
|
+
return client.qr.authorize(elementRef.current, _objectSpread2(_objectSpread2({}, buildOptions({ acrValues })), {}, { margin }));
|
|
1869
|
+
}, [
|
|
1870
|
+
client,
|
|
1871
|
+
buildOptions,
|
|
1872
|
+
margin,
|
|
1873
|
+
acrValues
|
|
1874
|
+
]);
|
|
1875
|
+
useLayoutEffect(() => {
|
|
1876
|
+
if (!elementRef.current) return;
|
|
1877
|
+
if (error) return;
|
|
1878
|
+
if (!isEnabled) return;
|
|
1879
|
+
const promise = authorize();
|
|
1880
|
+
promise.onAcknowledged = () => {
|
|
1881
|
+
setAcknowledged(true);
|
|
1882
|
+
};
|
|
1883
|
+
promise.then((response) => {
|
|
1884
|
+
if (promise.cancelled) return;
|
|
1885
|
+
handleResponse(response, {
|
|
1886
|
+
pkce: pkce && "code_verifier" in pkce ? pkce : void 0,
|
|
1887
|
+
source: "QRCode"
|
|
1888
|
+
});
|
|
1889
|
+
}).catch((err) => {
|
|
1890
|
+
if (err instanceof UserCancelledError) {
|
|
1891
|
+
setCancelled(true);
|
|
1892
|
+
return;
|
|
1893
|
+
}
|
|
1894
|
+
if (promise.cancelled) return;
|
|
1895
|
+
setError(err);
|
|
1896
|
+
handleResponse(err, { source: "QRCode" });
|
|
1897
|
+
});
|
|
1898
|
+
return () => {
|
|
1899
|
+
promise.cancel();
|
|
1900
|
+
};
|
|
1901
|
+
}, [
|
|
1902
|
+
authorize,
|
|
1903
|
+
pkce,
|
|
1904
|
+
handleResponse,
|
|
1905
|
+
requestId,
|
|
1906
|
+
error,
|
|
1907
|
+
isEnabled
|
|
1908
|
+
]);
|
|
1909
|
+
const handleRetry = () => {
|
|
1910
|
+
setAcknowledged(false);
|
|
1911
|
+
setCancelled(false);
|
|
1912
|
+
setError(null);
|
|
1913
|
+
setRequestId(Math.random().toString());
|
|
1914
|
+
};
|
|
1915
|
+
return children({
|
|
1916
|
+
qrElement: /* @__PURE__ */ jsx("div", {
|
|
1917
|
+
ref: elementRef,
|
|
1918
|
+
className
|
|
1919
|
+
}),
|
|
1920
|
+
isAcknowledged,
|
|
1921
|
+
isCancelled,
|
|
1922
|
+
isEnabled: criiptoConfiguration === null || criiptoConfiguration === void 0 ? void 0 : criiptoConfiguration.client.qr_enabled,
|
|
1923
|
+
error,
|
|
1924
|
+
retry: handleRetry,
|
|
1925
|
+
redirect
|
|
1926
|
+
});
|
|
1927
|
+
};
|
|
1928
|
+
//#endregion
|
|
1929
|
+
//#region src/use-criipto-verify.ts
|
|
1930
|
+
function useCriiptoVerify() {
|
|
1931
|
+
const { result, claims, loginWithRedirect, loginWithPopup, acrValues, isLoading, isInitializing, logout, checkSession } = useContext(CriiptoVerifyContext);
|
|
1932
|
+
return {
|
|
1933
|
+
result,
|
|
1934
|
+
claims,
|
|
1935
|
+
error: result && ("error" in result || result instanceof Error) ? result : null,
|
|
1936
|
+
loginWithRedirect,
|
|
1937
|
+
loginWithPopup,
|
|
1938
|
+
acrValues,
|
|
1939
|
+
isLoading,
|
|
1940
|
+
isInitializing,
|
|
1941
|
+
checkSession,
|
|
1942
|
+
logout
|
|
1943
|
+
};
|
|
1944
|
+
}
|
|
1945
|
+
//#endregion
|
|
1946
|
+
export { AuthMethodButtonContainer as AuthButton, AuthMethodButtonContainer as AuthMethodButton, AuthMethodButtonComponent as AuthButtonComponent, AuthButtonGroup, AuthMethodSelector, Sweden as AuthMethodSelectorSweden, CriiptoVerifyProvider, OAuth2Error, QRCode, SEBankIDQrCode as SEBankIDQRCode, actions, filterAcrValues, useCriiptoVerify };
|
|
1947
|
+
|
|
1948
|
+
//# sourceMappingURL=index.js.map
|