@bmc-soft/keycloak-auth 1.0.10 → 2.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 +115 -59
- package/dist/_lib/types/confirmAuthPhase.d.ts +1 -2
- package/dist/_lib/types/confirmAuthPhase.d.ts.map +1 -1
- package/dist/_lib/types/confirmAuthPhase.js +1 -2
- package/dist/_lib/types/confirmAuthPhase.js.map +1 -1
- package/dist/axios/adapters/KeycloakTokenProvider.js +8 -8
- package/dist/axios/adapters/KeycloakTokenProvider.js.map +1 -1
- package/dist/axios/interceptors.js +2 -2
- package/dist/axios/interceptors.js.map +1 -1
- package/dist/context/KeycloakConfigContext.d.ts +17 -1
- package/dist/context/KeycloakConfigContext.d.ts.map +1 -1
- package/dist/context/KeycloakConfigContext.js +36 -2
- package/dist/context/KeycloakConfigContext.js.map +1 -1
- package/dist/context/KeycloakInstanceContext.d.ts +2 -0
- package/dist/context/KeycloakInstanceContext.d.ts.map +1 -1
- package/dist/context/KeycloakInstanceContext.js +59 -16
- package/dist/context/KeycloakInstanceContext.js.map +1 -1
- package/dist/context/KeycloakProvider.d.ts +7 -1
- package/dist/context/KeycloakProvider.d.ts.map +1 -1
- package/dist/context/KeycloakProvider.js +3 -3
- package/dist/context/KeycloakProvider.js.map +1 -1
- package/dist/context/ReauthContext.d.ts +3 -1
- package/dist/context/ReauthContext.d.ts.map +1 -1
- package/dist/context/ReauthContext.js +6 -2
- package/dist/context/ReauthContext.js.map +1 -1
- package/dist/context/TokenContext.d.ts +2 -0
- package/dist/context/TokenContext.d.ts.map +1 -1
- package/dist/context/TokenContext.js +14 -6
- package/dist/context/TokenContext.js.map +1 -1
- package/dist/context/index.d.ts +2 -2
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/reauthRequiredRef.d.ts +2 -1
- package/dist/context/reauthRequiredRef.d.ts.map +1 -1
- package/dist/context/reauthRequiredRef.js.map +1 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +30 -4
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/sessionPolicy.d.ts +21 -0
- package/dist/core/sessionPolicy.d.ts.map +1 -0
- package/dist/core/sessionPolicy.js +63 -0
- package/dist/core/sessionPolicy.js.map +1 -0
- package/dist/core/types.d.ts +14 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/hooks/useKeycloakAuth.d.ts +3 -0
- package/dist/hooks/useKeycloakAuth.d.ts.map +1 -1
- package/dist/hooks/useKeycloakAuth.js +12 -7
- package/dist/hooks/useKeycloakAuth.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/screens/AuthPage/AuthPage.d.ts +2 -0
- package/dist/screens/AuthPage/AuthPage.d.ts.map +1 -1
- package/dist/screens/AuthPage/AuthPage.js +12 -15
- package/dist/screens/AuthPage/AuthPage.js.map +1 -1
- package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.d.ts +2 -1
- package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.d.ts.map +1 -1
- package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.js +67 -52
- package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.js.map +1 -1
- package/dist/screens/ConfirmAuthPage/index.d.ts +1 -0
- package/dist/screens/ConfirmAuthPage/index.d.ts.map +1 -1
- package/dist/screens/index.d.ts +1 -0
- package/dist/screens/index.d.ts.map +1 -1
- package/dist/storage/credentialStorage.d.ts +8 -0
- package/dist/storage/credentialStorage.d.ts.map +1 -1
- package/dist/storage/credentialStorage.js +99 -1
- package/dist/storage/credentialStorage.js.map +1 -1
- package/dist/storage/tokenStorage.d.ts +10 -0
- package/dist/storage/tokenStorage.d.ts.map +1 -1
- package/dist/storage/tokenStorage.js +30 -8
- package/dist/storage/tokenStorage.js.map +1 -1
- package/dist/ui/LogoutConfirmSheet/LogoutConfirmSheet.js +4 -2
- package/dist/ui/LogoutConfirmSheet/LogoutConfirmSheet.js.map +1 -1
- package/dist/ui/NumberPad/NumberPad.d.ts.map +1 -1
- package/dist/ui/NumberPad/NumberPad.js +16 -9
- package/dist/ui/NumberPad/NumberPad.js.map +1 -1
- package/dist/ui/PINConfirm/PINConfirm.d.ts.map +1 -1
- package/dist/ui/PINConfirm/PINConfirm.js +7 -7
- package/dist/ui/PINConfirm/PINConfirm.js.map +1 -1
- package/dist/ui/PINSetup/stages/BiometryStage.d.ts.map +1 -1
- package/dist/ui/PINSetup/stages/BiometryStage.js +6 -2
- package/dist/ui/PINSetup/stages/BiometryStage.js.map +1 -1
- package/dist/ui/PINSetup/styles.d.ts +0 -1
- package/dist/ui/PINSetup/styles.d.ts.map +1 -1
- package/dist/ui/PINSetup/styles.js +0 -1
- package/dist/ui/PINSetup/styles.js.map +1 -1
- package/dist/ui/WebViewLogin/WebViewLogin.d.ts.map +1 -1
- package/dist/ui/WebViewLogin/WebViewLogin.js +2 -2
- package/dist/ui/WebViewLogin/WebViewLogin.js.map +1 -1
- package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.d.ts +2 -2
- package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.d.ts.map +1 -1
- package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.js +22 -15
- package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const OFFLINE_ACCESS_SCOPE = 'offline_access';
|
|
2
|
+
const OPENID_SCOPE = 'openid';
|
|
3
|
+
const DEFAULT_BACKGROUND_REAUTH_THRESHOLD_MS = 60000;
|
|
4
|
+
export function withOfflineAccessScope(options = {}, enabled = true) {
|
|
5
|
+
if (!enabled)
|
|
6
|
+
return { ...options };
|
|
7
|
+
const scopes = (options.scope ?? '')
|
|
8
|
+
.split(/\s+/)
|
|
9
|
+
.map(scope => scope.trim())
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
if (!scopes.includes(OPENID_SCOPE)) {
|
|
12
|
+
scopes.unshift(OPENID_SCOPE);
|
|
13
|
+
}
|
|
14
|
+
if (!scopes.includes(OFFLINE_ACCESS_SCOPE)) {
|
|
15
|
+
scopes.push(OFFLINE_ACCESS_SCOPE);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
...options,
|
|
19
|
+
scope: scopes.join(' '),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function isIpAddressHost(host) {
|
|
23
|
+
const normalizedHost = host.replace(/^\[/, '').replace(/\]$/, '');
|
|
24
|
+
const ipv4Parts = normalizedHost.split('.');
|
|
25
|
+
if (ipv4Parts.length === 4) {
|
|
26
|
+
return ipv4Parts.every(part => {
|
|
27
|
+
if (!/^\d{1,3}$/.test(part))
|
|
28
|
+
return false;
|
|
29
|
+
const value = Number(part);
|
|
30
|
+
return value >= 0 && value <= 255;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return /^[0-9a-fA-F:]+$/.test(normalizedHost) && normalizedHost.includes(':');
|
|
34
|
+
}
|
|
35
|
+
export function getUrlHost(url) {
|
|
36
|
+
if (!url)
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
return new URL(url).hostname;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function isInternalNetworkUrl(url) {
|
|
46
|
+
const host = getUrlHost(url);
|
|
47
|
+
return host ? isIpAddressHost(host) : false;
|
|
48
|
+
}
|
|
49
|
+
export function shouldShowBackgroundReauth({ enabled = true, thresholdMs = DEFAULT_BACKGROUND_REAUTH_THRESHOLD_MS, authServerUrl, backgroundedAt, now = Date.now(), }) {
|
|
50
|
+
if (!enabled || backgroundedAt == null)
|
|
51
|
+
return false;
|
|
52
|
+
if (isInternalNetworkUrl(authServerUrl))
|
|
53
|
+
return false;
|
|
54
|
+
return now - backgroundedAt > thresholdMs;
|
|
55
|
+
}
|
|
56
|
+
export function resolveBackgroundReauthConfig(config) {
|
|
57
|
+
return {
|
|
58
|
+
enabled: config?.enabled ?? true,
|
|
59
|
+
thresholdMs: config?.thresholdMs ?? DEFAULT_BACKGROUND_REAUTH_THRESHOLD_MS,
|
|
60
|
+
internalNetworkMode: config?.internalNetworkMode ?? 'ip-host-is-internal',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=sessionPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionPolicy.js","sourceRoot":"","sources":["../../src/core/sessionPolicy.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAgBrD,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,sCAAsC,GAAG,KAAK,CAAC;AAErD,MAAM,UAAU,sBAAsB,CACpC,UAAgC,EAAE,EAClC,OAAO,GAAG,IAAI;IAEd,IAAI,CAAC,OAAO;QAAE,OAAO,EAAC,GAAG,OAAO,EAAC,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACjC,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,OAAO,GAAG,IAAI,EACd,WAAW,GAAG,sCAAsC,EACpD,aAAa,EACb,cAAc,EACd,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GACM;IACtB,IAAI,CAAC,OAAO,IAAI,cAAc,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,oBAAoB,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,GAAG,GAAG,cAAc,GAAG,WAAW,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,MAA+B;IAE/B,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI;QAChC,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,sCAAsC;QAC1E,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,IAAI,qBAAqB;KAC1E,CAAC;AACJ,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { KeycloakConfig, KeycloakInitOptions, KeycloakLoginOptions, KeycloakProfile } from '@react-keycloak/keycloak-ts';
|
|
2
|
+
import type { BackgroundReauthConfig } from './sessionPolicy';
|
|
2
3
|
export type { KeycloakConfig, KeycloakLoginOptions, KeycloakProfile };
|
|
3
4
|
export interface KeycloakConfigWith2FA extends KeycloakConfig {
|
|
4
5
|
clientId2fa?: string;
|
|
6
|
+
offlineAccessEnabled?: boolean;
|
|
7
|
+
backgroundReauth?: BackgroundReauthConfig;
|
|
8
|
+
clientSecret?: string;
|
|
9
|
+
getClientSecret?: () => string | undefined | Promise<string | undefined>;
|
|
5
10
|
}
|
|
11
|
+
export type InitRecoveryStrategy = 'none' | 'clear-tokens-and-retry';
|
|
6
12
|
export interface RNKeycloakInitOptions extends KeycloakInitOptions {
|
|
7
13
|
redirectUri?: string;
|
|
8
14
|
onAuthError?: (errorData: {
|
|
@@ -11,21 +17,29 @@ export interface RNKeycloakInitOptions extends KeycloakInitOptions {
|
|
|
11
17
|
}) => void;
|
|
12
18
|
onReady?: (authenticated?: boolean) => void;
|
|
13
19
|
onTokensChanged?: () => void;
|
|
20
|
+
clientSecret?: string;
|
|
21
|
+
getClientSecret?: () => string | undefined | Promise<string | undefined>;
|
|
14
22
|
}
|
|
15
23
|
export interface TokenUpdateResult {
|
|
16
24
|
token: string;
|
|
25
|
+
accessToken?: string;
|
|
17
26
|
refreshToken?: string;
|
|
27
|
+
offlineToken?: string;
|
|
18
28
|
idToken?: string;
|
|
19
29
|
}
|
|
20
30
|
export interface KeycloakTokens {
|
|
21
31
|
token: string | null;
|
|
32
|
+
accessToken: string | null;
|
|
22
33
|
refreshToken: string | null;
|
|
34
|
+
offlineToken: string | null;
|
|
23
35
|
idToken: string | null;
|
|
24
36
|
}
|
|
25
37
|
export interface AuthState {
|
|
26
38
|
isAuthenticated: boolean;
|
|
27
39
|
token: string | null;
|
|
40
|
+
accessToken: string | null;
|
|
28
41
|
refreshToken: string | null;
|
|
42
|
+
offlineToken: string | null;
|
|
29
43
|
idToken: string | null;
|
|
30
44
|
profile: KeycloakProfile | null;
|
|
31
45
|
}
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EAChB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AAE5D,YAAY,EAAC,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAC,CAAC;AAQpE,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAK3D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAK1C,YAAY,CAAC,EAAE,MAAM,CAAC;IAItB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1E;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,wBAAwB,CAAC;AAKrE,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAEhE,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAC,KAAK,IAAI,CAAC;IAEhF,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAE5C,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAE7B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1E;AAKD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAKD,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC"}
|
|
@@ -5,7 +5,10 @@ export interface UseKeycloakAuthResult {
|
|
|
5
5
|
isInitialized: boolean;
|
|
6
6
|
isLoading: boolean;
|
|
7
7
|
error: Error | null;
|
|
8
|
+
accessToken: string | null;
|
|
8
9
|
token: string | null;
|
|
10
|
+
offlineToken: string | null;
|
|
11
|
+
refreshToken: string | null;
|
|
9
12
|
isExpired: boolean;
|
|
10
13
|
isAuthenticated: boolean;
|
|
11
14
|
updateToken: (minValidity?: number) => Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeycloakAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeycloakAuth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"useKeycloakAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeycloakAuth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,mBAAmB,EAAiD,MAAM,YAAY,CAAC;AAC/F,OAAO,KAAK,EAAC,oBAAoB,EAAE,eAAe,EAAC,MAAM,SAAS,CAAC;AAInE,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,UAAU,CAAC,CAAC;IAE7D,aAAa,EAAE,OAAO,CAAC;IAEvB,SAAS,EAAE,OAAO,CAAC;IAEnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,SAAS,EAAE,OAAO,CAAC;IAEnB,eAAe,EAAE,OAAO,CAAC;IAEzB,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvD,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,eAAe,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhD,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAE3D,eAAe,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAElD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAMjC,gBAAgB,EAAE,OAAO,CAAC;IAE1B,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAMD,eAAO,MAAM,eAAe,QAAO,qBAiFlC,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import { useKeycloakInstance, useReauth, useToken } from '../context';
|
|
2
|
+
import { useKeycloakInstance, useKeycloakSessionOptions, useReauth, useToken } from '../context';
|
|
3
|
+
import { withOfflineAccessScope } from '../core';
|
|
3
4
|
import { tokenStorage } from '../storage';
|
|
4
5
|
export const useKeycloakAuth = () => {
|
|
5
6
|
const { keycloak, isInitialized, isLoading, error, redirectUri } = useKeycloakInstance();
|
|
6
|
-
const { token, isExpired, updateToken, clearTokens } = useToken();
|
|
7
|
+
const { token, refreshToken, isExpired, updateToken, clearTokens } = useToken();
|
|
7
8
|
const { isReauthRequired, showReauth, hideReauth } = useReauth();
|
|
9
|
+
const { offlineAccessEnabled } = useKeycloakSessionOptions();
|
|
8
10
|
const login = useCallback(async (options) => {
|
|
9
11
|
if (!keycloak) {
|
|
10
12
|
throw new Error('[useKeycloakAuth] Keycloak not initialized');
|
|
@@ -12,8 +14,8 @@ export const useKeycloakAuth = () => {
|
|
|
12
14
|
await keycloak.login({ ...options, redirectUri });
|
|
13
15
|
if (keycloak.token) {
|
|
14
16
|
await tokenStorage.saveTokens({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
accessToken: keycloak.token,
|
|
18
|
+
offlineToken: keycloak.refreshToken ?? undefined,
|
|
17
19
|
idToken: keycloak.idToken ?? undefined,
|
|
18
20
|
});
|
|
19
21
|
}
|
|
@@ -31,12 +33,12 @@ export const useKeycloakAuth = () => {
|
|
|
31
33
|
}
|
|
32
34
|
return await keycloak.loadUserProfile();
|
|
33
35
|
}, [keycloak]);
|
|
34
|
-
const createLoginUrl = useCallback(() => {
|
|
36
|
+
const createLoginUrl = useCallback((options = {}) => {
|
|
35
37
|
if (!keycloak) {
|
|
36
38
|
throw new Error('[useKeycloakAuth] Keycloak not initialized');
|
|
37
39
|
}
|
|
38
|
-
return keycloak.createLoginUrl({ redirectUri });
|
|
39
|
-
}, [keycloak, redirectUri]);
|
|
40
|
+
return keycloak.createLoginUrl(withOfflineAccessScope({ ...options, redirectUri }, offlineAccessEnabled));
|
|
41
|
+
}, [keycloak, offlineAccessEnabled, redirectUri]);
|
|
40
42
|
const createLogoutUrl = useCallback(() => {
|
|
41
43
|
if (!keycloak) {
|
|
42
44
|
throw new Error('[useKeycloakAuth] Keycloak not initialized');
|
|
@@ -49,7 +51,10 @@ export const useKeycloakAuth = () => {
|
|
|
49
51
|
isInitialized,
|
|
50
52
|
isLoading,
|
|
51
53
|
error,
|
|
54
|
+
accessToken: token,
|
|
52
55
|
token,
|
|
56
|
+
offlineToken: refreshToken,
|
|
57
|
+
refreshToken,
|
|
53
58
|
isExpired,
|
|
54
59
|
isAuthenticated,
|
|
55
60
|
updateToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeycloakAuth.js","sourceRoot":"","sources":["../../src/hooks/useKeycloakAuth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,mBAAmB,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"useKeycloakAuth.js","sourceRoot":"","sources":["../../src/hooks/useKeycloakAuth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import 'react-native-get-random-values';
|
|
2
2
|
import KeycloakReactNativeClient from './core/client';
|
|
3
|
-
export type { KeycloakConfig, KeycloakConfigWith2FA, KeycloakTokens, RNKeycloakInitOptions, KeycloakLoginOptions, TokenUpdateResult, KeycloakProfile, AuthState, } from './core/types';
|
|
3
|
+
export type { KeycloakConfig, KeycloakConfigWith2FA, KeycloakTokens, RNKeycloakInitOptions, KeycloakLoginOptions, TokenUpdateResult, KeycloakProfile, AuthState, InitRecoveryStrategy, } from './core/types';
|
|
4
4
|
export { KeycloakReactNativeClient };
|
|
5
5
|
export { KeycloakProvider, useKeycloakTheme } from './context';
|
|
6
6
|
export type { KeycloakProviderProps, KeycloakTheme, KeycloakThemeButtonProps, KeycloakThemeIconButtonProps, } from './context';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,gCAAgC,CAAC;AAExC,OAAO,yBAAyB,MAAM,eAAe,CAAC;AAGtD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,gCAAgC,CAAC;AAExC,OAAO,yBAAyB,MAAM,eAAe,CAAC;AAGtD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAC,yBAAyB,EAAC,CAAC;AAGnC,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAC7D,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAC,MAAM,SAAS,CAAC;AACpF,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAG5D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,MAAM,CAAC;AAGd,OAAO,EAAC,QAAQ,EAAE,eAAe,EAAC,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAC,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAC,sBAAsB,EAAE,oBAAoB,EAAC,MAAM,SAAS,CAAC;AACrE,YAAY,EAAC,uBAAuB,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAC1E,YAAY,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAC,qBAAqB,EAAC,MAAM,SAAS,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,gCAAgC,CAAC;AAExC,OAAO,yBAAyB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,gCAAgC,CAAC;AAExC,OAAO,yBAAyB,MAAM,eAAe,CAAC;AAetD,OAAO,EAAC,yBAAyB,EAAC,CAAC;AAGnC,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAS7D,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAC,MAAM,SAAS,CAAC;AASpF,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAI1D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,MAAM,CAAC;AAGd,OAAO,EAAC,QAAQ,EAAE,eAAe,EAAC,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAC,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAC,sBAAsB,EAAE,oBAAoB,EAAC,MAAM,SAAS,CAAC;AAGrE,OAAO,EAAC,qBAAqB,EAAC,MAAM,SAAS,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ImageSourcePropType, ViewStyle } from 'react-native';
|
|
3
|
+
import { type AuthStage } from '../../_lib';
|
|
3
4
|
interface AuthPageProps {
|
|
4
5
|
onSuccess?: (token: string) => void;
|
|
5
6
|
onError?: (error: Error) => void;
|
|
7
|
+
onStageChange?: (stage: AuthStage) => void;
|
|
6
8
|
logo?: React.ReactNode | ImageSourcePropType;
|
|
7
9
|
logoHeight?: number;
|
|
8
10
|
logoWidth?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../src/screens/AuthPage/AuthPage.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../src/screens/AuthPage/AuthPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAQ,mBAAmB,EAAoB,SAAS,EAAC,MAAM,cAAc,CAAC;AAErF,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,YAAY,CAAC;AAMtD,UAAU,aAAa;IAKrB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAKpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAKjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAM3C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;IAM7C,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAM7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAKlB,UAAU,CAAC,EAAE,MAAM,CAAC;IAKpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkBD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA4J5C,CAAC"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import React, { useCallback, useState } from 'react';
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
2
|
import { Image, StyleSheet, View } from 'react-native';
|
|
3
3
|
import { AUTH_STAGE } from '../../_lib';
|
|
4
4
|
import { useKeycloakTheme } from '../../context';
|
|
5
5
|
import { useKeycloakAuth } from '../../hooks';
|
|
6
|
-
import { credentialStorage } from '../../storage';
|
|
6
|
+
import { credentialStorage, tokenStorage } from '../../storage';
|
|
7
7
|
import { PINSetup, WebViewLogin } from '../../ui';
|
|
8
|
-
export const AuthPage = ({ onSuccess, onError, logo, logoHeight = 80, logoWidth = 80, showBiometryPrompt = true, pinLength = 4, style, paddingTop, paddingBottom, }) => {
|
|
8
|
+
export const AuthPage = ({ onSuccess, onError, onStageChange, logo, logoHeight = 80, logoWidth = 80, showBiometryPrompt = true, pinLength = 4, style, paddingTop, paddingBottom, }) => {
|
|
9
9
|
const { colors: { background: backgroundColor }, LoaderComponent, } = useKeycloakTheme();
|
|
10
10
|
const [stage, setStage] = useState(AUTH_STAGE.LOGIN);
|
|
11
11
|
const [loginData, setLoginData] = useState(null);
|
|
12
12
|
const { keycloak, login } = useKeycloakAuth();
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
onStageChange?.(stage);
|
|
15
|
+
}, [onStageChange, stage]);
|
|
13
16
|
const handleLoginSuccess = useCallback((data) => {
|
|
14
17
|
console.log('[AuthPage] Login success, saving data and proceeding to PIN setup');
|
|
15
18
|
setLoginData(data);
|
|
@@ -17,11 +20,11 @@ export const AuthPage = ({ onSuccess, onError, logo, logoHeight = 80, logoWidth
|
|
|
17
20
|
}, []);
|
|
18
21
|
const handleSaveCredentialsSuccess = useCallback(async (url) => {
|
|
19
22
|
try {
|
|
20
|
-
console.log('[AuthPage] Saving
|
|
23
|
+
console.log('[AuthPage] Saving PIN and exchanging authorization code for tokens...');
|
|
21
24
|
setStage(AUTH_STAGE.PROCESSING);
|
|
22
25
|
await login({ url });
|
|
23
26
|
console.log('[AuthPage] Tokens obtained successfully');
|
|
24
|
-
const accessToken = keycloak?.token;
|
|
27
|
+
const accessToken = keycloak?.token ?? (await tokenStorage.getToken());
|
|
25
28
|
if (accessToken) {
|
|
26
29
|
console.log('[AuthPage] Access token received, calling onSuccess');
|
|
27
30
|
onSuccess?.(accessToken);
|
|
@@ -36,23 +39,17 @@ export const AuthPage = ({ onSuccess, onError, logo, logoHeight = 80, logoWidth
|
|
|
36
39
|
onError?.(error);
|
|
37
40
|
}
|
|
38
41
|
}, [keycloak, login, onSuccess, onError]);
|
|
39
|
-
const
|
|
42
|
+
const savePIN = useCallback(async (pin) => {
|
|
40
43
|
if (!loginData || !keycloak) {
|
|
41
44
|
const error = new Error('[AuthPage] No login data or keycloak instance available');
|
|
42
45
|
console.error(error.message);
|
|
43
46
|
onError?.(error);
|
|
44
47
|
return;
|
|
45
48
|
}
|
|
46
|
-
await credentialStorage.
|
|
47
|
-
username: loginData.username,
|
|
48
|
-
password: loginData.password,
|
|
49
|
-
});
|
|
49
|
+
await credentialStorage.savePIN(pin);
|
|
50
50
|
const biometryEnabled = await credentialStorage.getBiometryEnabled();
|
|
51
51
|
if (biometryEnabled) {
|
|
52
|
-
await credentialStorage.
|
|
53
|
-
username: loginData.username,
|
|
54
|
-
password: loginData.password,
|
|
55
|
-
});
|
|
52
|
+
await credentialStorage.savePINForBiometry();
|
|
56
53
|
}
|
|
57
54
|
handleSaveCredentialsSuccess(loginData.url);
|
|
58
55
|
}, [loginData, handleSaveCredentialsSuccess, keycloak, onError]);
|
|
@@ -79,7 +76,7 @@ export const AuthPage = ({ onSuccess, onError, logo, logoHeight = 80, logoWidth
|
|
|
79
76
|
|
|
80
77
|
|
|
81
78
|
{stage === AUTH_STAGE.SETUP_PIN && (<View style={styles.pinContainer}>
|
|
82
|
-
<PINSetup pinLength={pinLength} onSuccess={
|
|
79
|
+
<PINSetup pinLength={pinLength} onSuccess={savePIN} onError={handlePINSetupError} showBiometryPrompt={showBiometryPrompt}/>
|
|
83
80
|
</View>)}
|
|
84
81
|
|
|
85
82
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthPage.js","sourceRoot":"","sources":["../../../src/screens/AuthPage/AuthPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,WAAW,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthPage.js","sourceRoot":"","sources":["../../../src/screens/AuthPage/AuthPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ImageSourcePropType, ViewStyle } from 'react-native';
|
|
3
|
+
export type ConfirmAuthMode = 'login' | 'unlock' | 'reauth';
|
|
3
4
|
interface ConfirmAuthPageProps {
|
|
4
5
|
onSuccess?: () => void;
|
|
5
6
|
onError?: (error: Error) => void;
|
|
6
7
|
onLogout?: () => void;
|
|
8
|
+
mode?: ConfirmAuthMode;
|
|
7
9
|
logoutText?: string;
|
|
8
10
|
logo?: React.ReactNode | ImageSourcePropType;
|
|
9
11
|
logoHeight?: number;
|
|
@@ -14,7 +16,6 @@ interface ConfirmAuthPageProps {
|
|
|
14
16
|
title?: string;
|
|
15
17
|
description?: string;
|
|
16
18
|
style?: ViewStyle;
|
|
17
|
-
webViewTimeoutMs?: number;
|
|
18
19
|
}
|
|
19
20
|
export declare const ConfirmAuthPage: React.FC<ConfirmAuthPageProps>;
|
|
20
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmAuthPage.d.ts","sourceRoot":"","sources":["../../../src/screens/ConfirmAuthPage/ConfirmAuthPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAEL,mBAAmB,EAOnB,SAAS,EACV,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmAuthPage.d.ts","sourceRoot":"","sources":["../../../src/screens/ConfirmAuthPage/ConfirmAuthPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAEL,mBAAmB,EAOnB,SAAS,EACV,MAAM,cAAc,CAAC;AAUtB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,UAAU,oBAAoB;IAI5B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAKvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAKjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAStB,IAAI,CAAC,EAAE,eAAe,CAAC;IAMvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAKpB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;IAE7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AASD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAiQ1D,CAAC"}
|
|
@@ -2,25 +2,25 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
2
2
|
import { Image, Linking, Platform, StyleSheet, Text, TouchableOpacity, View, } from 'react-native';
|
|
3
3
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
4
4
|
import WebView from 'react-native-webview';
|
|
5
|
-
import { CONFIRM_AUTH_PHASE
|
|
5
|
+
import { CONFIRM_AUTH_PHASE } from '../../_lib';
|
|
6
6
|
import { useKeycloakConfigRefresh, useKeycloakInstance, useKeycloakTheme } from '../../context';
|
|
7
7
|
import { useKeycloakAuth } from '../../hooks';
|
|
8
8
|
import { credentialStorage, tokenStorage } from '../../storage';
|
|
9
9
|
import { LogoutConfirmSheet, PINConfirm } from '../../ui';
|
|
10
|
-
export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight = 80, logoWidth = 80, pinLength = 4, allowBiometry = true, autoShowBiometry = true, title, description, logoutText = 'Выйти из аккаунта', style,
|
|
10
|
+
export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, mode = 'login', logo, logoHeight = 80, logoWidth = 80, pinLength = 4, allowBiometry = true, autoShowBiometry = true, title, description, logoutText = 'Выйти из аккаунта', style, }) => {
|
|
11
11
|
const { redirectUri, keycloak, isInitialized } = useKeycloakInstance();
|
|
12
12
|
const refreshPinCheck = useKeycloakConfigRefresh();
|
|
13
13
|
const { colors: { background: backgroundColor, error }, LoaderComponent, } = useKeycloakTheme();
|
|
14
|
-
const { createLoginUrl, login,
|
|
14
|
+
const { createLoginUrl, hideReauth, isExpired, login, offlineToken, token, updateToken } = useKeycloakAuth();
|
|
15
15
|
const insets = useSafeAreaInsets();
|
|
16
16
|
const containerStyleWithInsets = useMemo(() => [
|
|
17
17
|
styles.container,
|
|
18
18
|
{ backgroundColor, paddingTop: insets.top, paddingBottom: insets.bottom },
|
|
19
19
|
style,
|
|
20
20
|
], [backgroundColor, insets.top, insets.bottom, style]);
|
|
21
|
-
const [phase, setPhase] = useState(CONFIRM_AUTH_PHASE.
|
|
22
|
-
const [credentials, setCredentials] = useState(null);
|
|
21
|
+
const [phase, setPhase] = useState(CONFIRM_AUTH_PHASE.PIN);
|
|
23
22
|
const [webViewError, setWebViewError] = useState(null);
|
|
23
|
+
const [isProcessingPIN, setIsProcessingPIN] = useState(false);
|
|
24
24
|
const loginSuccessHandled = useRef(false);
|
|
25
25
|
const logoutSheetRef = useRef(null);
|
|
26
26
|
const loginUrl = createLoginUrl() ?? '';
|
|
@@ -57,7 +57,7 @@ export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight
|
|
|
57
57
|
setPhase(CONFIRM_AUTH_PHASE.PIN);
|
|
58
58
|
}
|
|
59
59
|
}, [isInitialized, keycloak, redirectUri]);
|
|
60
|
-
const
|
|
60
|
+
const handleSuccess = useCallback(() => {
|
|
61
61
|
if (loginSuccessHandled.current)
|
|
62
62
|
return;
|
|
63
63
|
loginSuccessHandled.current = true;
|
|
@@ -69,21 +69,25 @@ export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight
|
|
|
69
69
|
return;
|
|
70
70
|
try {
|
|
71
71
|
await login({ url });
|
|
72
|
-
|
|
72
|
+
handleSuccess();
|
|
73
73
|
}
|
|
74
74
|
catch (err) {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
const loginError = err instanceof Error ? err : new Error('Ошибка входа');
|
|
76
|
+
console.error('[ConfirmAuthPage] login error:', loginError);
|
|
77
|
+
setWebViewError(loginError.message);
|
|
78
|
+
setPhase(CONFIRM_AUTH_PHASE.PIN);
|
|
79
|
+
onError?.(loginError);
|
|
77
80
|
}
|
|
78
|
-
}, [redirectUri, login,
|
|
81
|
+
}, [redirectUri, login, handleSuccess, onError]);
|
|
79
82
|
const handleNavigationStateChange = useCallback((nav) => {
|
|
80
83
|
if (nav.url && redirectUri && nav.url.startsWith(redirectUri)) {
|
|
81
84
|
handleRedirect(nav.url);
|
|
82
85
|
}
|
|
83
86
|
}, [redirectUri, handleRedirect]);
|
|
84
87
|
useEffect(() => {
|
|
85
|
-
if (Platform.OS !== 'ios' || !redirectUri)
|
|
88
|
+
if (Platform.OS !== 'ios' || !redirectUri || phase !== CONFIRM_AUTH_PHASE.WEBVIEW_LOGIN) {
|
|
86
89
|
return undefined;
|
|
90
|
+
}
|
|
87
91
|
const handleDeepLink = (event) => {
|
|
88
92
|
if (event.url.startsWith(redirectUri)) {
|
|
89
93
|
handleRedirect(event.url);
|
|
@@ -96,32 +100,60 @@ export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight
|
|
|
96
100
|
});
|
|
97
101
|
const subscription = Linking.addEventListener('url', handleDeepLink);
|
|
98
102
|
return () => subscription.remove();
|
|
99
|
-
}, [redirectUri, handleRedirect]);
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
}, [hideReauth, onSuccess]);
|
|
111
|
-
const handleWebViewMessage = useCallback((event) => {
|
|
103
|
+
}, [phase, redirectUri, handleRedirect]);
|
|
104
|
+
const openLoginFallback = useCallback(() => {
|
|
105
|
+
setWebViewError(null);
|
|
106
|
+
setPhase(CONFIRM_AUTH_PHASE.WEBVIEW_LOGIN);
|
|
107
|
+
}, []);
|
|
108
|
+
const finishAfterPIN = useCallback(async () => {
|
|
109
|
+
if (isProcessingPIN)
|
|
110
|
+
return;
|
|
111
|
+
setIsProcessingPIN(true);
|
|
112
|
+
setWebViewError(null);
|
|
112
113
|
try {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
const forceRefresh = mode === 'reauth';
|
|
115
|
+
const refreshNeeded = forceRefresh || !token || isExpired;
|
|
116
|
+
if (!refreshNeeded) {
|
|
117
|
+
handleSuccess();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!offlineToken) {
|
|
121
|
+
if (mode === 'login') {
|
|
122
|
+
openLoginFallback();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
throw new Error('Offline token is missing');
|
|
116
126
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
const nextToken = await updateToken(forceRefresh ? -1 : 120);
|
|
128
|
+
if (!nextToken) {
|
|
129
|
+
throw new Error('Access token is missing after refresh');
|
|
120
130
|
}
|
|
131
|
+
handleSuccess();
|
|
121
132
|
}
|
|
122
|
-
catch {
|
|
133
|
+
catch (err) {
|
|
134
|
+
const refreshError = err instanceof Error ? err : new Error('Ошибка обновления сессии');
|
|
135
|
+
console.error('[ConfirmAuthPage] token refresh error:', refreshError);
|
|
136
|
+
if (mode === 'login') {
|
|
137
|
+
openLoginFallback();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
setWebViewError(refreshError.message);
|
|
141
|
+
onError?.(refreshError);
|
|
123
142
|
}
|
|
124
|
-
|
|
143
|
+
finally {
|
|
144
|
+
setIsProcessingPIN(false);
|
|
145
|
+
}
|
|
146
|
+
}, [
|
|
147
|
+
handleSuccess,
|
|
148
|
+
isExpired,
|
|
149
|
+
isProcessingPIN,
|
|
150
|
+
mode,
|
|
151
|
+
offlineToken,
|
|
152
|
+
onError,
|
|
153
|
+
openLoginFallback,
|
|
154
|
+
token,
|
|
155
|
+
updateToken,
|
|
156
|
+
]);
|
|
125
157
|
const renderLogo = useCallback(() => {
|
|
126
158
|
if (!logo)
|
|
127
159
|
return null;
|
|
@@ -129,22 +161,10 @@ export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight
|
|
|
129
161
|
return logo;
|
|
130
162
|
return (<Image source={logo} style={[styles.logo, { width: logoWidth, height: logoHeight }]} resizeMode="contain"/>);
|
|
131
163
|
}, [logo, logoWidth, logoHeight]);
|
|
132
|
-
|
|
133
|
-
if (phase === CONFIRM_AUTH_PHASE.WEBVIEW_DETECT) {
|
|
134
|
-
return (<View style={containerStyleWithInsets}>
|
|
135
|
-
{loginUrl ? (<View style={styles.webViewHidden}>
|
|
136
|
-
<WebView source={{ uri: loginUrl }} injectedJavaScript={injectedJSForDetect} onNavigationStateChange={handleNavigationStateChange} onMessage={handleWebViewMessage} javaScriptEnabled={true} sharedCookiesEnabled={true} cacheEnabled={true} thirdPartyCookiesEnabled={true} style={styles.webView}/>
|
|
137
|
-
</View>) : null}
|
|
138
|
-
<View style={[StyleSheet.absoluteFillObject, { backgroundColor }]} pointerEvents="none">
|
|
139
|
-
<LoaderComponent />
|
|
140
|
-
</View>
|
|
141
|
-
</View>);
|
|
142
|
-
}
|
|
143
|
-
if (phase === CONFIRM_AUTH_PHASE.WEBVIEW_WITH_CREDENTIALS && credentials && loginUrl) {
|
|
144
|
-
const injectedJS = getInjectedJSForLogin(credentials.username, credentials.password);
|
|
164
|
+
if (phase === CONFIRM_AUTH_PHASE.WEBVIEW_LOGIN && loginUrl) {
|
|
145
165
|
return (<View style={containerStyleWithInsets}>
|
|
146
166
|
<View style={styles.webViewHidden}>
|
|
147
|
-
<WebView source={{ uri: loginUrl }}
|
|
167
|
+
<WebView source={{ uri: loginUrl }} onNavigationStateChange={handleNavigationStateChange} javaScriptEnabled={true} sharedCookiesEnabled={true} cacheEnabled={true} thirdPartyCookiesEnabled={true} style={styles.webView}/>
|
|
148
168
|
</View>
|
|
149
169
|
<View style={[StyleSheet.absoluteFillObject, { backgroundColor }]} pointerEvents="none">
|
|
150
170
|
<LoaderComponent />
|
|
@@ -157,7 +177,7 @@ export const ConfirmAuthPage = ({ onSuccess, onError, onLogout, logo, logoHeight
|
|
|
157
177
|
<Text style={[styles.errorText, { color: error }]}>{webViewError}</Text>
|
|
158
178
|
</View>) : null}
|
|
159
179
|
<View style={styles.pinContainer}>
|
|
160
|
-
<PINConfirm pinLength={pinLength} onSuccess={
|
|
180
|
+
<PINConfirm pinLength={pinLength} onSuccess={finishAfterPIN} onError={onError} allowBiometry={allowBiometry} autoShowBiometry={autoShowBiometry} title={title} description={description}/>
|
|
161
181
|
<TouchableOpacity onPress={openLogoutSheet} style={styles.logoutLinkContainer} activeOpacity={0.7}>
|
|
162
182
|
<Text style={[styles.logoutLinkText, { color: error }]}>{logoutText}</Text>
|
|
163
183
|
</TouchableOpacity>
|
|
@@ -181,11 +201,6 @@ const styles = StyleSheet.create({
|
|
|
181
201
|
webView: {
|
|
182
202
|
flex: 1,
|
|
183
203
|
},
|
|
184
|
-
loaderWrap: {
|
|
185
|
-
flex: 1,
|
|
186
|
-
justifyContent: 'center',
|
|
187
|
-
alignItems: 'center',
|
|
188
|
-
},
|
|
189
204
|
logoContainer: {
|
|
190
205
|
alignItems: 'center',
|
|
191
206
|
justifyContent: 'center',
|