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