capacitor-oidc 0.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapacitorOidc.podspec +17 -0
- package/LICENSE +201 -0
- package/Package.swift +28 -0
- package/README.md +122 -0
- package/android/build.gradle +75 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/CallbackUriMatcher.java +22 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/CapacitorOidcPlugin.java +240 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/NativeContract.java +35 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/StoredSessionV1.java +111 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/TokenVault.java +209 -0
- package/android/src/main/java/com/jojopirker/capacitor/oidc/VaultEntryCodec.java +56 -0
- package/dist/esm/capacitor-navigator.d.ts +14 -0
- package/dist/esm/capacitor-navigator.js +68 -0
- package/dist/esm/capacitor-navigator.js.map +1 -0
- package/dist/esm/capacitor-secure-state-store.d.ts +9 -0
- package/dist/esm/capacitor-secure-state-store.js +36 -0
- package/dist/esm/capacitor-secure-state-store.js.map +1 -0
- package/dist/esm/capacitor-user-manager.d.ts +28 -0
- package/dist/esm/capacitor-user-manager.js +160 -0
- package/dist/esm/capacitor-user-manager.js.map +1 -0
- package/dist/esm/definitions.d.ts +62 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/errors.d.ts +6 -0
- package/dist/esm/errors.js +13 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/generated/native-contract.d.ts +37 -0
- package/dist/esm/generated/native-contract.js +38 -0
- package/dist/esm/generated/native-contract.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/native.d.ts +2 -0
- package/dist/esm/native.js +4 -0
- package/dist/esm/native.js.map +1 -0
- package/dist/plugin.cjs +304 -0
- package/dist/plugin.cjs.map +1 -0
- package/ios/Sources/CapacitorOidcPlugin/CapacitorOidcPlugin.swift +177 -0
- package/ios/Sources/CapacitorOidcPlugin/NativeContract.generated.swift +39 -0
- package/ios/Sources/CapacitorOidcPlugin/StoredSessionV1.swift +35 -0
- package/ios/Sources/CapacitorOidcPlugin/TokenVault.swift +132 -0
- package/ios/Tests/CapacitorOidcPluginTests/StoredSessionV1Tests.swift +38 -0
- package/package.json +85 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CapacitorOidcError, unsupported } from './errors';
|
|
2
|
+
import { nativeContract } from './generated/native-contract';
|
|
3
|
+
import { NativeOidc } from './native';
|
|
4
|
+
export class CapacitorNavigator {
|
|
5
|
+
prefersEphemeralWebBrowserSession;
|
|
6
|
+
constructor(prefersEphemeralWebBrowserSession) {
|
|
7
|
+
this.prefersEphemeralWebBrowserSession = prefersEphemeralWebBrowserSession;
|
|
8
|
+
}
|
|
9
|
+
async prepare() {
|
|
10
|
+
return new CapacitorWindow(this.prefersEphemeralWebBrowserSession);
|
|
11
|
+
}
|
|
12
|
+
async callback() {
|
|
13
|
+
unsupported('Navigator callbacks');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class CapacitorWindow {
|
|
17
|
+
prefersEphemeralWebBrowserSession;
|
|
18
|
+
constructor(prefersEphemeralWebBrowserSession) {
|
|
19
|
+
this.prefersEphemeralWebBrowserSession = prefersEphemeralWebBrowserSession;
|
|
20
|
+
}
|
|
21
|
+
async navigate({ url }) {
|
|
22
|
+
assertSecureRequestUrl(url);
|
|
23
|
+
const callbackUrl = callbackUrlFromRequest(url);
|
|
24
|
+
const response = await NativeOidc.open({
|
|
25
|
+
[nativeContract.fields.url]: url,
|
|
26
|
+
[nativeContract.fields.callbackUrl]: callbackUrl,
|
|
27
|
+
[nativeContract.fields.prefersEphemeralWebBrowserSession]: this.prefersEphemeralWebBrowserSession,
|
|
28
|
+
});
|
|
29
|
+
if (!isExpectedCallback(response[nativeContract.fields.url], callbackUrl)) {
|
|
30
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.invalidCallback, 'The authentication callback does not match the configured redirect URI');
|
|
31
|
+
}
|
|
32
|
+
return { url: response[nativeContract.fields.url] };
|
|
33
|
+
}
|
|
34
|
+
close() {
|
|
35
|
+
void NativeOidc.cancel();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function assertSecureRequestUrl(requestUrl) {
|
|
39
|
+
const url = new URL(requestUrl);
|
|
40
|
+
const isLocalDevelopment = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';
|
|
41
|
+
if (url.protocol !== 'https:' && !isLocalDevelopment) {
|
|
42
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.browserUnavailable, 'OIDC authorization and logout endpoints must use HTTPS');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function callbackUrlFromRequest(requestUrl) {
|
|
46
|
+
const url = new URL(requestUrl);
|
|
47
|
+
const callback = url.searchParams.get('redirect_uri') ?? url.searchParams.get('post_logout_redirect_uri');
|
|
48
|
+
if (!callback) {
|
|
49
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.invalidCallback, 'The OIDC request does not contain a redirect URI');
|
|
50
|
+
}
|
|
51
|
+
return callback;
|
|
52
|
+
}
|
|
53
|
+
export function isExpectedCallback(actualValue, expectedValue) {
|
|
54
|
+
const actual = new URL(actualValue);
|
|
55
|
+
const expected = new URL(expectedValue);
|
|
56
|
+
return (actual.protocol.toLowerCase() === expected.protocol.toLowerCase() &&
|
|
57
|
+
actual.host.toLowerCase() === expected.host.toLowerCase() &&
|
|
58
|
+
actual.pathname === expected.pathname);
|
|
59
|
+
}
|
|
60
|
+
export class UnsupportedIframeNavigator {
|
|
61
|
+
async prepare() {
|
|
62
|
+
unsupported('Iframe navigation');
|
|
63
|
+
}
|
|
64
|
+
async callback() {
|
|
65
|
+
unsupported('Iframe navigation');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=capacitor-navigator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-navigator.js","sourceRoot":"","sources":["../../src/capacitor-navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { INavigator, IWindow, NavigateParams, NavigateResponse } from 'oidc-client-ts';\n\nimport { CapacitorOidcError, unsupported } from './errors';\nimport { nativeContract } from './generated/native-contract';\nimport { NativeOidc } from './native';\n\nexport class CapacitorNavigator implements INavigator {\n constructor(private readonly prefersEphemeralWebBrowserSession: boolean) {}\n\n async prepare(): Promise<IWindow> {\n return new CapacitorWindow(this.prefersEphemeralWebBrowserSession);\n }\n\n async callback(): Promise<void> {\n unsupported('Navigator callbacks');\n }\n}\n\nclass CapacitorWindow implements IWindow {\n constructor(private readonly prefersEphemeralWebBrowserSession: boolean) {}\n\n async navigate({ url }: NavigateParams): Promise<NavigateResponse> {\n assertSecureRequestUrl(url);\n const callbackUrl = callbackUrlFromRequest(url);\n const response = await NativeOidc.open({\n [nativeContract.fields.url]: url,\n [nativeContract.fields.callbackUrl]: callbackUrl,\n [nativeContract.fields.prefersEphemeralWebBrowserSession]: this.prefersEphemeralWebBrowserSession,\n });\n\n if (!isExpectedCallback(response[nativeContract.fields.url], callbackUrl)) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.invalidCallback,\n 'The authentication callback does not match the configured redirect URI',\n );\n }\n\n return { url: response[nativeContract.fields.url] };\n }\n\n close(): void {\n void NativeOidc.cancel();\n }\n}\n\nexport function assertSecureRequestUrl(requestUrl: string): void {\n const url = new URL(requestUrl);\n const isLocalDevelopment = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';\n if (url.protocol !== 'https:' && !isLocalDevelopment) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.browserUnavailable,\n 'OIDC authorization and logout endpoints must use HTTPS',\n );\n }\n}\n\nexport function callbackUrlFromRequest(requestUrl: string): string {\n const url = new URL(requestUrl);\n const callback = url.searchParams.get('redirect_uri') ?? url.searchParams.get('post_logout_redirect_uri');\n if (!callback) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.invalidCallback,\n 'The OIDC request does not contain a redirect URI',\n );\n }\n return callback;\n}\n\nexport function isExpectedCallback(actualValue: string, expectedValue: string): boolean {\n const actual = new URL(actualValue);\n const expected = new URL(expectedValue);\n return (\n actual.protocol.toLowerCase() === expected.protocol.toLowerCase() &&\n actual.host.toLowerCase() === expected.host.toLowerCase() &&\n actual.pathname === expected.pathname\n );\n}\n\nexport class UnsupportedIframeNavigator implements INavigator {\n async prepare(): Promise<IWindow> {\n unsupported('Iframe navigation');\n }\n\n async callback(): Promise<void> {\n unsupported('Iframe navigation');\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StateStore } from 'oidc-client-ts';
|
|
2
|
+
export declare class CapacitorSecureStateStore implements StateStore {
|
|
3
|
+
private readonly namespace;
|
|
4
|
+
constructor(namespace: string);
|
|
5
|
+
set(key: string, value: string): Promise<void>;
|
|
6
|
+
get(key: string): Promise<string | null>;
|
|
7
|
+
remove(key: string): Promise<string | null>;
|
|
8
|
+
getAllKeys(): Promise<string[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { nativeContract } from './generated/native-contract';
|
|
2
|
+
import { NativeOidc } from './native';
|
|
3
|
+
export class CapacitorSecureStateStore {
|
|
4
|
+
namespace;
|
|
5
|
+
constructor(namespace) {
|
|
6
|
+
this.namespace = namespace;
|
|
7
|
+
}
|
|
8
|
+
async set(key, value) {
|
|
9
|
+
await NativeOidc.storageSet({
|
|
10
|
+
[nativeContract.fields.namespace]: this.namespace,
|
|
11
|
+
[nativeContract.fields.key]: key,
|
|
12
|
+
[nativeContract.fields.value]: value,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async get(key) {
|
|
16
|
+
const result = await NativeOidc.storageGet({
|
|
17
|
+
[nativeContract.fields.namespace]: this.namespace,
|
|
18
|
+
[nativeContract.fields.key]: key,
|
|
19
|
+
});
|
|
20
|
+
return result[nativeContract.fields.value];
|
|
21
|
+
}
|
|
22
|
+
async remove(key) {
|
|
23
|
+
const result = await NativeOidc.storageRemove({
|
|
24
|
+
[nativeContract.fields.namespace]: this.namespace,
|
|
25
|
+
[nativeContract.fields.key]: key,
|
|
26
|
+
});
|
|
27
|
+
return result[nativeContract.fields.value];
|
|
28
|
+
}
|
|
29
|
+
async getAllKeys() {
|
|
30
|
+
const result = await NativeOidc.storageGetAllKeys({
|
|
31
|
+
[nativeContract.fields.namespace]: this.namespace,
|
|
32
|
+
});
|
|
33
|
+
return result[nativeContract.fields.keys];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=capacitor-secure-state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-secure-state-store.js","sourceRoot":"","sources":["../../src/capacitor-secure-state-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,OAAO,yBAAyB;IACP;IAA7B,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAElD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,UAAU,CAAC,UAAU,CAAC;YAC1B,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS;YACjD,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG;YAChC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK;SACrC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC;YACzC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS;YACjD,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG;SACjC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC;YAC5C,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS;YACjD,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG;SACjC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC;YAChD,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS;SAClD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF","sourcesContent":["import type { StateStore } from 'oidc-client-ts';\n\nimport { nativeContract } from './generated/native-contract';\nimport { NativeOidc } from './native';\n\nexport class CapacitorSecureStateStore implements StateStore {\n constructor(private readonly namespace: string) {}\n\n async set(key: string, value: string): Promise<void> {\n await NativeOidc.storageSet({\n [nativeContract.fields.namespace]: this.namespace,\n [nativeContract.fields.key]: key,\n [nativeContract.fields.value]: value,\n });\n }\n\n async get(key: string): Promise<string | null> {\n const result = await NativeOidc.storageGet({\n [nativeContract.fields.namespace]: this.namespace,\n [nativeContract.fields.key]: key,\n });\n return result[nativeContract.fields.value];\n }\n\n async remove(key: string): Promise<string | null> {\n const result = await NativeOidc.storageRemove({\n [nativeContract.fields.namespace]: this.namespace,\n [nativeContract.fields.key]: key,\n });\n return result[nativeContract.fields.value];\n }\n\n async getAllKeys(): Promise<string[]> {\n const result = await NativeOidc.storageGetAllKeys({\n [nativeContract.fields.namespace]: this.namespace,\n });\n return result[nativeContract.fields.keys];\n }\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { UserManager, type SigninPopupArgs, type SigninResourceOwnerCredentialsArgs, type SigninSilentArgs, type SignoutResponse, type SignoutPopupArgs, type User } from 'oidc-client-ts';
|
|
2
|
+
import type { CapacitorOidcNativeOptions, CapacitorUserManagerSettings } from './definitions';
|
|
3
|
+
export declare class CapacitorUserManager extends UserManager {
|
|
4
|
+
private readonly storageNamespace;
|
|
5
|
+
private refreshPromise?;
|
|
6
|
+
private appStateListener?;
|
|
7
|
+
private constructor();
|
|
8
|
+
static create(settings: CapacitorUserManagerSettings, nativeOptions?: CapacitorOidcNativeOptions): Promise<CapacitorUserManager>;
|
|
9
|
+
signin(args?: SigninPopupArgs): Promise<User>;
|
|
10
|
+
signout(args?: SignoutPopupArgs): Promise<void>;
|
|
11
|
+
getValidUser(minimumValiditySeconds?: number): Promise<User | null>;
|
|
12
|
+
signinSilent(args?: SigninSilentArgs): Promise<User | null>;
|
|
13
|
+
private refresh;
|
|
14
|
+
storeUser(user: User | null): Promise<void>;
|
|
15
|
+
cancel(): Promise<void>;
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
signinRedirect(): Promise<void>;
|
|
18
|
+
signinRedirectCallback(_url?: string): Promise<User>;
|
|
19
|
+
signinCallback(_url?: string): Promise<User | undefined>;
|
|
20
|
+
signinResourceOwnerCredentials(_args: SigninResourceOwnerCredentialsArgs): Promise<User>;
|
|
21
|
+
signinSilentCallback(_url?: string): Promise<void>;
|
|
22
|
+
signoutRedirect(): Promise<void>;
|
|
23
|
+
signoutRedirectCallback(_url?: string): Promise<SignoutResponse>;
|
|
24
|
+
signoutCallback(_url?: string, _keepOpen?: boolean): Promise<SignoutResponse | undefined>;
|
|
25
|
+
signoutSilent(): Promise<void>;
|
|
26
|
+
signoutSilentCallback(_url?: string): Promise<void>;
|
|
27
|
+
querySessionStatus(): Promise<null>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { App } from '@capacitor/app';
|
|
2
|
+
import { ErrorResponse, UserManager, } from 'oidc-client-ts';
|
|
3
|
+
import { CapacitorNavigator, UnsupportedIframeNavigator } from './capacitor-navigator';
|
|
4
|
+
import { CapacitorSecureStateStore } from './capacitor-secure-state-store';
|
|
5
|
+
import { CapacitorOidcError, unsupported } from './errors';
|
|
6
|
+
import { nativeContract } from './generated/native-contract';
|
|
7
|
+
import { NativeOidc } from './native';
|
|
8
|
+
export class CapacitorUserManager extends UserManager {
|
|
9
|
+
storageNamespace;
|
|
10
|
+
refreshPromise;
|
|
11
|
+
appStateListener;
|
|
12
|
+
constructor(settings, nativeOptions, storageNamespace) {
|
|
13
|
+
const stateStore = new CapacitorSecureStateStore(`${storageNamespace}.transactions`);
|
|
14
|
+
const userStore = new CapacitorSecureStateStore(`${storageNamespace}.session`);
|
|
15
|
+
const navigator = new CapacitorNavigator(nativeOptions.ios?.prefersEphemeralWebBrowserSession ?? false);
|
|
16
|
+
super({
|
|
17
|
+
...settings,
|
|
18
|
+
response_type: 'code',
|
|
19
|
+
disablePKCE: false,
|
|
20
|
+
monitorSession: false,
|
|
21
|
+
popup_redirect_uri: settings.redirect_uri,
|
|
22
|
+
popup_post_logout_redirect_uri: settings.post_logout_redirect_uri,
|
|
23
|
+
stateStore,
|
|
24
|
+
userStore,
|
|
25
|
+
}, navigator, navigator, new UnsupportedIframeNavigator());
|
|
26
|
+
this.storageNamespace = storageNamespace;
|
|
27
|
+
}
|
|
28
|
+
static async create(settings, nativeOptions = {}) {
|
|
29
|
+
assertRuntime();
|
|
30
|
+
assertSettings(settings);
|
|
31
|
+
await NativeOidc.configure({
|
|
32
|
+
[nativeContract.fields.prefersEphemeralWebBrowserSession]: nativeOptions.ios?.prefersEphemeralWebBrowserSession,
|
|
33
|
+
[nativeContract.fields.keychainAccessGroup]: nativeOptions.ios?.keychainAccessGroup,
|
|
34
|
+
[nativeContract.fields.keychainAccessibility]: nativeOptions.ios?.keychainAccessibility,
|
|
35
|
+
});
|
|
36
|
+
const manager = new CapacitorUserManager(settings, nativeOptions, nativeOptions.storageNamespace ?? 'default');
|
|
37
|
+
await manager.getValidUser();
|
|
38
|
+
manager.appStateListener = await App.addListener('appStateChange', ({ isActive }) => {
|
|
39
|
+
if (isActive) {
|
|
40
|
+
void manager
|
|
41
|
+
.getValidUser()
|
|
42
|
+
.catch((error) => manager.events._raiseSilentRenewError(error instanceof Error ? error : new Error('Silent renewal failed')));
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return manager;
|
|
46
|
+
}
|
|
47
|
+
async signin(args = {}) {
|
|
48
|
+
return super.signinPopup(args);
|
|
49
|
+
}
|
|
50
|
+
async signout(args = {}) {
|
|
51
|
+
await super.signoutPopup(args);
|
|
52
|
+
}
|
|
53
|
+
async getValidUser(minimumValiditySeconds = 60) {
|
|
54
|
+
const user = await this.getUser();
|
|
55
|
+
if (!user)
|
|
56
|
+
return null;
|
|
57
|
+
if (user.expires_in === undefined || user.expires_in > minimumValiditySeconds)
|
|
58
|
+
return user;
|
|
59
|
+
return this.signinSilent();
|
|
60
|
+
}
|
|
61
|
+
signinSilent(args = {}) {
|
|
62
|
+
if (!this.refreshPromise) {
|
|
63
|
+
this.refreshPromise = this.refresh(args).finally(() => {
|
|
64
|
+
this.refreshPromise = undefined;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return this.refreshPromise;
|
|
68
|
+
}
|
|
69
|
+
async refresh(args) {
|
|
70
|
+
const user = await this.getUser();
|
|
71
|
+
if (!user?.refresh_token) {
|
|
72
|
+
if (user?.expired)
|
|
73
|
+
await this.removeUser();
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const refresh = super.signinSilent({ ...args, forceIframeAuth: false }).catch(async (error) => {
|
|
77
|
+
if (error instanceof ErrorResponse && error.error === 'invalid_grant')
|
|
78
|
+
await this.removeUser();
|
|
79
|
+
throw error;
|
|
80
|
+
});
|
|
81
|
+
return refresh;
|
|
82
|
+
}
|
|
83
|
+
async storeUser(user) {
|
|
84
|
+
await super.storeUser(user);
|
|
85
|
+
await NativeOidc.setSessionSnapshot({
|
|
86
|
+
[nativeContract.fields.namespace]: this.storageNamespace,
|
|
87
|
+
[nativeContract.fields.value]: user
|
|
88
|
+
? JSON.stringify(toStoredSession(user, this.settings.authority, this.settings.client_id))
|
|
89
|
+
: null,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async cancel() {
|
|
93
|
+
await NativeOidc.cancel();
|
|
94
|
+
}
|
|
95
|
+
async dispose() {
|
|
96
|
+
this.stopSilentRenew();
|
|
97
|
+
await this.appStateListener?.remove();
|
|
98
|
+
await this.cancel();
|
|
99
|
+
}
|
|
100
|
+
async signinRedirect() {
|
|
101
|
+
unsupported('Redirect navigation');
|
|
102
|
+
}
|
|
103
|
+
async signinRedirectCallback(_url) {
|
|
104
|
+
unsupported('Redirect navigation');
|
|
105
|
+
}
|
|
106
|
+
async signinCallback(_url) {
|
|
107
|
+
unsupported('Browser callback dispatch');
|
|
108
|
+
}
|
|
109
|
+
async signinResourceOwnerCredentials(_args) {
|
|
110
|
+
unsupported('Resource Owner Password Credentials');
|
|
111
|
+
}
|
|
112
|
+
async signinSilentCallback(_url) {
|
|
113
|
+
unsupported('Iframe navigation');
|
|
114
|
+
}
|
|
115
|
+
async signoutRedirect() {
|
|
116
|
+
unsupported('Redirect navigation');
|
|
117
|
+
}
|
|
118
|
+
async signoutRedirectCallback(_url) {
|
|
119
|
+
unsupported('Redirect navigation');
|
|
120
|
+
}
|
|
121
|
+
async signoutCallback(_url, _keepOpen) {
|
|
122
|
+
unsupported('Browser callback dispatch');
|
|
123
|
+
}
|
|
124
|
+
async signoutSilent() {
|
|
125
|
+
unsupported('Iframe logout');
|
|
126
|
+
}
|
|
127
|
+
async signoutSilentCallback(_url) {
|
|
128
|
+
unsupported('Iframe logout');
|
|
129
|
+
}
|
|
130
|
+
async querySessionStatus() {
|
|
131
|
+
unsupported('Browser session monitoring');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function assertRuntime() {
|
|
135
|
+
if (!globalThis.crypto?.subtle || !globalThis.crypto.getRandomValues) {
|
|
136
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.unsupportedRuntime, 'Web Crypto is required by oidc-client-ts');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function assertSettings(settings) {
|
|
140
|
+
if ('client_secret' in settings) {
|
|
141
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.unsupportedRuntime, 'Native public clients must not contain a client secret');
|
|
142
|
+
}
|
|
143
|
+
if ('client_authentication' in settings || 'dpop' in settings) {
|
|
144
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.unsupportedRuntime, 'The supplied settings contain an unsupported native-client option');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function toStoredSession(user, issuer, clientId) {
|
|
148
|
+
return {
|
|
149
|
+
version: 1,
|
|
150
|
+
issuer,
|
|
151
|
+
clientId,
|
|
152
|
+
accessToken: user.access_token,
|
|
153
|
+
refreshToken: user.refresh_token,
|
|
154
|
+
idToken: user.id_token,
|
|
155
|
+
tokenType: user.token_type,
|
|
156
|
+
scope: user.scope,
|
|
157
|
+
expiresAt: user.expires_at,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=capacitor-user-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-user-manager.js","sourceRoot":"","sources":["../../src/capacitor-user-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { App } from '@capacitor/app';\nimport type { PluginListenerHandle } from '@capacitor/core';\nimport {\n ErrorResponse,\n UserManager,\n type SigninPopupArgs,\n type SigninResourceOwnerCredentialsArgs,\n type SigninSilentArgs,\n type SignoutResponse,\n type SignoutPopupArgs,\n type User,\n} from 'oidc-client-ts';\n\nimport { CapacitorNavigator, UnsupportedIframeNavigator } from './capacitor-navigator';\nimport { CapacitorSecureStateStore } from './capacitor-secure-state-store';\nimport type { CapacitorOidcNativeOptions, CapacitorUserManagerSettings, StoredSessionV1 } from './definitions';\nimport { CapacitorOidcError, unsupported } from './errors';\nimport { nativeContract } from './generated/native-contract';\nimport { NativeOidc } from './native';\n\nexport class CapacitorUserManager extends UserManager {\n private refreshPromise?: Promise<User | null>;\n private appStateListener?: PluginListenerHandle;\n\n private constructor(\n settings: CapacitorUserManagerSettings,\n nativeOptions: CapacitorOidcNativeOptions,\n private readonly storageNamespace: string,\n ) {\n const stateStore = new CapacitorSecureStateStore(`${storageNamespace}.transactions`);\n const userStore = new CapacitorSecureStateStore(`${storageNamespace}.session`);\n const navigator = new CapacitorNavigator(nativeOptions.ios?.prefersEphemeralWebBrowserSession ?? false);\n\n super(\n {\n ...settings,\n response_type: 'code',\n disablePKCE: false,\n monitorSession: false,\n popup_redirect_uri: settings.redirect_uri,\n popup_post_logout_redirect_uri: settings.post_logout_redirect_uri,\n stateStore,\n userStore,\n },\n navigator,\n navigator,\n new UnsupportedIframeNavigator(),\n );\n }\n\n static async create(\n settings: CapacitorUserManagerSettings,\n nativeOptions: CapacitorOidcNativeOptions = {},\n ): Promise<CapacitorUserManager> {\n assertRuntime();\n assertSettings(settings);\n await NativeOidc.configure({\n [nativeContract.fields.prefersEphemeralWebBrowserSession]: nativeOptions.ios?.prefersEphemeralWebBrowserSession,\n [nativeContract.fields.keychainAccessGroup]: nativeOptions.ios?.keychainAccessGroup,\n [nativeContract.fields.keychainAccessibility]: nativeOptions.ios?.keychainAccessibility,\n });\n const manager = new CapacitorUserManager(settings, nativeOptions, nativeOptions.storageNamespace ?? 'default');\n await manager.getValidUser();\n manager.appStateListener = await App.addListener('appStateChange', ({ isActive }) => {\n if (isActive) {\n void manager\n .getValidUser()\n .catch((error: unknown) =>\n manager.events._raiseSilentRenewError(error instanceof Error ? error : new Error('Silent renewal failed')),\n );\n }\n });\n return manager;\n }\n\n async signin(args: SigninPopupArgs = {}): Promise<User> {\n return super.signinPopup(args);\n }\n\n async signout(args: SignoutPopupArgs = {}): Promise<void> {\n await super.signoutPopup(args);\n }\n\n async getValidUser(minimumValiditySeconds = 60): Promise<User | null> {\n const user = await this.getUser();\n if (!user) return null;\n if (user.expires_in === undefined || user.expires_in > minimumValiditySeconds) return user;\n return this.signinSilent();\n }\n\n override signinSilent(args: SigninSilentArgs = {}): Promise<User | null> {\n if (!this.refreshPromise) {\n this.refreshPromise = this.refresh(args).finally(() => {\n this.refreshPromise = undefined;\n });\n }\n return this.refreshPromise;\n }\n\n private async refresh(args: SigninSilentArgs): Promise<User | null> {\n const user = await this.getUser();\n if (!user?.refresh_token) {\n if (user?.expired) await this.removeUser();\n return null;\n }\n\n const refresh = super.signinSilent({ ...args, forceIframeAuth: false }).catch(async (error: unknown) => {\n if (error instanceof ErrorResponse && error.error === 'invalid_grant') await this.removeUser();\n throw error;\n });\n return refresh;\n }\n\n override async storeUser(user: User | null): Promise<void> {\n await super.storeUser(user);\n await NativeOidc.setSessionSnapshot({\n [nativeContract.fields.namespace]: this.storageNamespace,\n [nativeContract.fields.value]: user\n ? JSON.stringify(toStoredSession(user, this.settings.authority, this.settings.client_id))\n : null,\n });\n }\n\n async cancel(): Promise<void> {\n await NativeOidc.cancel();\n }\n\n async dispose(): Promise<void> {\n this.stopSilentRenew();\n await this.appStateListener?.remove();\n await this.cancel();\n }\n\n override async signinRedirect(): Promise<void> {\n unsupported('Redirect navigation');\n }\n\n override async signinRedirectCallback(_url?: string): Promise<User> {\n unsupported('Redirect navigation');\n }\n\n override async signinCallback(_url?: string): Promise<User | undefined> {\n unsupported('Browser callback dispatch');\n }\n\n override async signinResourceOwnerCredentials(_args: SigninResourceOwnerCredentialsArgs): Promise<User> {\n unsupported('Resource Owner Password Credentials');\n }\n\n override async signinSilentCallback(_url?: string): Promise<void> {\n unsupported('Iframe navigation');\n }\n\n override async signoutRedirect(): Promise<void> {\n unsupported('Redirect navigation');\n }\n\n override async signoutRedirectCallback(_url?: string): Promise<SignoutResponse> {\n unsupported('Redirect navigation');\n }\n\n override async signoutCallback(_url?: string, _keepOpen?: boolean): Promise<SignoutResponse | undefined> {\n unsupported('Browser callback dispatch');\n }\n\n override async signoutSilent(): Promise<void> {\n unsupported('Iframe logout');\n }\n\n override async signoutSilentCallback(_url?: string): Promise<void> {\n unsupported('Iframe logout');\n }\n\n override async querySessionStatus(): Promise<null> {\n unsupported('Browser session monitoring');\n }\n}\n\nfunction assertRuntime(): void {\n if (!globalThis.crypto?.subtle || !globalThis.crypto.getRandomValues) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.unsupportedRuntime,\n 'Web Crypto is required by oidc-client-ts',\n );\n }\n}\n\nfunction assertSettings(settings: CapacitorUserManagerSettings): void {\n if ('client_secret' in settings) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.unsupportedRuntime,\n 'Native public clients must not contain a client secret',\n );\n }\n if ('client_authentication' in settings || 'dpop' in settings) {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.unsupportedRuntime,\n 'The supplied settings contain an unsupported native-client option',\n );\n }\n}\n\nfunction toStoredSession(user: User, issuer: string, clientId: string): StoredSessionV1 {\n return {\n version: 1,\n issuer,\n clientId,\n accessToken: user.access_token,\n refreshToken: user.refresh_token,\n idToken: user.id_token,\n tokenType: user.token_type,\n scope: user.scope,\n expiresAt: user.expires_at,\n };\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { UserManagerSettings } from 'oidc-client-ts';
|
|
2
|
+
import type { NativeErrorCode } from './generated/native-contract';
|
|
3
|
+
export type CapacitorOidcErrorCode = NativeErrorCode;
|
|
4
|
+
export interface IOSNativeOptions {
|
|
5
|
+
prefersEphemeralWebBrowserSession?: boolean;
|
|
6
|
+
keychainAccessGroup?: string;
|
|
7
|
+
keychainAccessibility?: 'afterFirstUnlockThisDeviceOnly' | 'whenUnlockedThisDeviceOnly';
|
|
8
|
+
}
|
|
9
|
+
export interface CapacitorOidcNativeOptions {
|
|
10
|
+
ios?: IOSNativeOptions;
|
|
11
|
+
storageNamespace?: string;
|
|
12
|
+
}
|
|
13
|
+
type UnsupportedSettings = 'client_secret' | 'client_authentication' | 'disablePKCE' | 'dpop' | 'monitorSession' | 'response_type' | 'silent_redirect_uri' | 'stateStore' | 'userStore';
|
|
14
|
+
export type CapacitorUserManagerSettings = Omit<UserManagerSettings, UnsupportedSettings | 'post_logout_redirect_uri'> & {
|
|
15
|
+
post_logout_redirect_uri: string;
|
|
16
|
+
};
|
|
17
|
+
export interface StoredSessionV1 {
|
|
18
|
+
version: 1;
|
|
19
|
+
issuer: string;
|
|
20
|
+
clientId: string;
|
|
21
|
+
accessToken: string;
|
|
22
|
+
refreshToken?: string;
|
|
23
|
+
idToken?: string;
|
|
24
|
+
tokenType: string;
|
|
25
|
+
scope?: string;
|
|
26
|
+
expiresAt?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface NativeOpenOptions {
|
|
29
|
+
url: string;
|
|
30
|
+
callbackUrl: string;
|
|
31
|
+
prefersEphemeralWebBrowserSession: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface NativeStorageOptions {
|
|
34
|
+
namespace: string;
|
|
35
|
+
key: string;
|
|
36
|
+
}
|
|
37
|
+
export interface CapacitorOidcPlugin {
|
|
38
|
+
configure(options: IOSNativeOptions): Promise<void>;
|
|
39
|
+
open(options: NativeOpenOptions): Promise<{
|
|
40
|
+
url: string;
|
|
41
|
+
}>;
|
|
42
|
+
cancel(): Promise<void>;
|
|
43
|
+
storageSet(options: NativeStorageOptions & {
|
|
44
|
+
value: string;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
storageGet(options: NativeStorageOptions): Promise<{
|
|
47
|
+
value: string | null;
|
|
48
|
+
}>;
|
|
49
|
+
storageRemove(options: NativeStorageOptions): Promise<{
|
|
50
|
+
value: string | null;
|
|
51
|
+
}>;
|
|
52
|
+
storageGetAllKeys(options: {
|
|
53
|
+
namespace: string;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
keys: string[];
|
|
56
|
+
}>;
|
|
57
|
+
setSessionSnapshot(options: {
|
|
58
|
+
namespace: string;
|
|
59
|
+
value: string | null;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import type { UserManagerSettings } from 'oidc-client-ts';\n\nimport type { NativeErrorCode } from './generated/native-contract';\n\nexport type CapacitorOidcErrorCode = NativeErrorCode;\n\nexport interface IOSNativeOptions {\n prefersEphemeralWebBrowserSession?: boolean;\n keychainAccessGroup?: string;\n keychainAccessibility?: 'afterFirstUnlockThisDeviceOnly' | 'whenUnlockedThisDeviceOnly';\n}\n\nexport interface CapacitorOidcNativeOptions {\n ios?: IOSNativeOptions;\n storageNamespace?: string;\n}\n\ntype UnsupportedSettings =\n | 'client_secret'\n | 'client_authentication'\n | 'disablePKCE'\n | 'dpop'\n | 'monitorSession'\n | 'response_type'\n | 'silent_redirect_uri'\n | 'stateStore'\n | 'userStore';\n\nexport type CapacitorUserManagerSettings = Omit<\n UserManagerSettings,\n UnsupportedSettings | 'post_logout_redirect_uri'\n> & {\n post_logout_redirect_uri: string;\n};\n\nexport interface StoredSessionV1 {\n version: 1;\n issuer: string;\n clientId: string;\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n tokenType: string;\n scope?: string;\n expiresAt?: number;\n}\n\nexport interface NativeOpenOptions {\n url: string;\n callbackUrl: string;\n prefersEphemeralWebBrowserSession: boolean;\n}\n\nexport interface NativeStorageOptions {\n namespace: string;\n key: string;\n}\n\nexport interface CapacitorOidcPlugin {\n configure(options: IOSNativeOptions): Promise<void>;\n open(options: NativeOpenOptions): Promise<{ url: string }>;\n cancel(): Promise<void>;\n storageSet(options: NativeStorageOptions & { value: string }): Promise<void>;\n storageGet(options: NativeStorageOptions): Promise<{ value: string | null }>;\n storageRemove(options: NativeStorageOptions): Promise<{ value: string | null }>;\n storageGetAllKeys(options: { namespace: string }): Promise<{ keys: string[] }>;\n setSessionSnapshot(options: { namespace: string; value: string | null }): Promise<void>;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CapacitorOidcErrorCode } from './definitions';
|
|
2
|
+
export declare class CapacitorOidcError extends Error {
|
|
3
|
+
readonly code: CapacitorOidcErrorCode;
|
|
4
|
+
constructor(code: CapacitorOidcErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function unsupported(feature: string): never;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { nativeContract } from './generated/native-contract';
|
|
2
|
+
export class CapacitorOidcError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = 'CapacitorOidcError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function unsupported(feature) {
|
|
11
|
+
throw new CapacitorOidcError(nativeContract.errorCodes.unsupportedRuntime, `${feature} is not available in a native Capacitor runtime`);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IADlB,YACkB,IAA4B,EAC5C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAwB;QAI5C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,kBAAkB,CAC1B,cAAc,CAAC,UAAU,CAAC,kBAAkB,EAC5C,GAAG,OAAO,iDAAiD,CAC5D,CAAC;AACJ,CAAC","sourcesContent":["import type { CapacitorOidcErrorCode } from './definitions';\nimport { nativeContract } from './generated/native-contract';\n\nexport class CapacitorOidcError extends Error {\n constructor(\n public readonly code: CapacitorOidcErrorCode,\n message: string,\n ) {\n super(message);\n this.name = 'CapacitorOidcError';\n }\n}\n\nexport function unsupported(feature: string): never {\n throw new CapacitorOidcError(\n nativeContract.errorCodes.unsupportedRuntime,\n `${feature} is not available in a native Capacitor runtime`,\n );\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const nativeContract: {
|
|
2
|
+
readonly pluginName: "CapacitorOidc";
|
|
3
|
+
readonly methods: {
|
|
4
|
+
readonly configure: "configure";
|
|
5
|
+
readonly open: "open";
|
|
6
|
+
readonly cancel: "cancel";
|
|
7
|
+
readonly storageSet: "storageSet";
|
|
8
|
+
readonly storageGet: "storageGet";
|
|
9
|
+
readonly storageRemove: "storageRemove";
|
|
10
|
+
readonly storageGetAllKeys: "storageGetAllKeys";
|
|
11
|
+
readonly setSessionSnapshot: "setSessionSnapshot";
|
|
12
|
+
};
|
|
13
|
+
readonly fields: {
|
|
14
|
+
readonly url: "url";
|
|
15
|
+
readonly callbackUrl: "callbackUrl";
|
|
16
|
+
readonly prefersEphemeralWebBrowserSession: "prefersEphemeralWebBrowserSession";
|
|
17
|
+
readonly keychainAccessGroup: "keychainAccessGroup";
|
|
18
|
+
readonly keychainAccessibility: "keychainAccessibility";
|
|
19
|
+
readonly namespace: "namespace";
|
|
20
|
+
readonly key: "key";
|
|
21
|
+
readonly value: "value";
|
|
22
|
+
readonly keys: "keys";
|
|
23
|
+
};
|
|
24
|
+
readonly errorCodes: {
|
|
25
|
+
readonly authSessionInProgress: "AUTH_SESSION_IN_PROGRESS";
|
|
26
|
+
readonly userCancelled: "USER_CANCELLED";
|
|
27
|
+
readonly browserUnavailable: "BROWSER_UNAVAILABLE";
|
|
28
|
+
readonly invalidCallback: "INVALID_CALLBACK";
|
|
29
|
+
readonly secureStorageError: "SECURE_STORAGE_ERROR";
|
|
30
|
+
readonly unsupportedRuntime: "UNSUPPORTED_RUNTIME";
|
|
31
|
+
};
|
|
32
|
+
readonly keychainAccessibility: {
|
|
33
|
+
readonly afterFirstUnlockThisDeviceOnly: "afterFirstUnlockThisDeviceOnly";
|
|
34
|
+
readonly whenUnlockedThisDeviceOnly: "whenUnlockedThisDeviceOnly";
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type NativeErrorCode = (typeof nativeContract.errorCodes)[keyof typeof nativeContract.errorCodes];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Generated by scripts/generate-native-contract.mjs. Do not edit.
|
|
2
|
+
export const nativeContract = {
|
|
3
|
+
pluginName: 'CapacitorOidc',
|
|
4
|
+
methods: {
|
|
5
|
+
configure: 'configure',
|
|
6
|
+
open: 'open',
|
|
7
|
+
cancel: 'cancel',
|
|
8
|
+
storageSet: 'storageSet',
|
|
9
|
+
storageGet: 'storageGet',
|
|
10
|
+
storageRemove: 'storageRemove',
|
|
11
|
+
storageGetAllKeys: 'storageGetAllKeys',
|
|
12
|
+
setSessionSnapshot: 'setSessionSnapshot',
|
|
13
|
+
},
|
|
14
|
+
fields: {
|
|
15
|
+
url: 'url',
|
|
16
|
+
callbackUrl: 'callbackUrl',
|
|
17
|
+
prefersEphemeralWebBrowserSession: 'prefersEphemeralWebBrowserSession',
|
|
18
|
+
keychainAccessGroup: 'keychainAccessGroup',
|
|
19
|
+
keychainAccessibility: 'keychainAccessibility',
|
|
20
|
+
namespace: 'namespace',
|
|
21
|
+
key: 'key',
|
|
22
|
+
value: 'value',
|
|
23
|
+
keys: 'keys',
|
|
24
|
+
},
|
|
25
|
+
errorCodes: {
|
|
26
|
+
authSessionInProgress: 'AUTH_SESSION_IN_PROGRESS',
|
|
27
|
+
userCancelled: 'USER_CANCELLED',
|
|
28
|
+
browserUnavailable: 'BROWSER_UNAVAILABLE',
|
|
29
|
+
invalidCallback: 'INVALID_CALLBACK',
|
|
30
|
+
secureStorageError: 'SECURE_STORAGE_ERROR',
|
|
31
|
+
unsupportedRuntime: 'UNSUPPORTED_RUNTIME',
|
|
32
|
+
},
|
|
33
|
+
keychainAccessibility: {
|
|
34
|
+
afterFirstUnlockThisDeviceOnly: 'afterFirstUnlockThisDeviceOnly',
|
|
35
|
+
whenUnlockedThisDeviceOnly: 'whenUnlockedThisDeviceOnly',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=native-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-contract.js","sourceRoot":"","sources":["../../../src/generated/native-contract.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE;QACP,SAAS,EAAE,WAAW;QACtB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,YAAY;QACxB,aAAa,EAAE,eAAe;QAC9B,iBAAiB,EAAE,mBAAmB;QACtC,kBAAkB,EAAE,oBAAoB;KACzC;IACD,MAAM,EAAE;QACN,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,aAAa;QAC1B,iCAAiC,EAAE,mCAAmC;QACtE,mBAAmB,EAAE,qBAAqB;QAC1C,qBAAqB,EAAE,uBAAuB;QAC9C,SAAS,EAAE,WAAW;QACtB,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;KACb;IACD,UAAU,EAAE;QACV,qBAAqB,EAAE,0BAA0B;QACjD,aAAa,EAAE,gBAAgB;QAC/B,kBAAkB,EAAE,qBAAqB;QACzC,eAAe,EAAE,kBAAkB;QACnC,kBAAkB,EAAE,sBAAsB;QAC1C,kBAAkB,EAAE,qBAAqB;KAC1C;IACD,qBAAqB,EAAE;QACrB,8BAA8B,EAAE,gCAAgC;QAChE,0BAA0B,EAAE,4BAA4B;KACzD;CACO,CAAC","sourcesContent":["// Generated by scripts/generate-native-contract.mjs. Do not edit.\n\nexport const nativeContract = {\n pluginName: 'CapacitorOidc',\n methods: {\n configure: 'configure',\n open: 'open',\n cancel: 'cancel',\n storageSet: 'storageSet',\n storageGet: 'storageGet',\n storageRemove: 'storageRemove',\n storageGetAllKeys: 'storageGetAllKeys',\n setSessionSnapshot: 'setSessionSnapshot',\n },\n fields: {\n url: 'url',\n callbackUrl: 'callbackUrl',\n prefersEphemeralWebBrowserSession: 'prefersEphemeralWebBrowserSession',\n keychainAccessGroup: 'keychainAccessGroup',\n keychainAccessibility: 'keychainAccessibility',\n namespace: 'namespace',\n key: 'key',\n value: 'value',\n keys: 'keys',\n },\n errorCodes: {\n authSessionInProgress: 'AUTH_SESSION_IN_PROGRESS',\n userCancelled: 'USER_CANCELLED',\n browserUnavailable: 'BROWSER_UNAVAILABLE',\n invalidCallback: 'INVALID_CALLBACK',\n secureStorageError: 'SECURE_STORAGE_ERROR',\n unsupportedRuntime: 'UNSUPPORTED_RUNTIME',\n },\n keychainAccessibility: {\n afterFirstUnlockThisDeviceOnly: 'afterFirstUnlockThisDeviceOnly',\n whenUnlockedThisDeviceOnly: 'whenUnlockedThisDeviceOnly',\n },\n} as const;\n\nexport type NativeErrorCode = (typeof nativeContract.errorCodes)[keyof typeof nativeContract.errorCodes];\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CapacitorUserManager } from './capacitor-user-manager';
|
|
2
|
+
export { CapacitorSecureStateStore } from './capacitor-secure-state-store';
|
|
3
|
+
export { CapacitorOidcError } from './errors';
|
|
4
|
+
export type { CapacitorOidcErrorCode, CapacitorOidcNativeOptions, CapacitorUserManagerSettings, IOSNativeOptions, StoredSessionV1, } from './definitions';
|
|
5
|
+
export { User, UserManagerEvents } from 'oidc-client-ts';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CapacitorUserManager } from './capacitor-user-manager';
|
|
2
|
+
export { CapacitorSecureStateStore } from './capacitor-secure-state-store';
|
|
3
|
+
export { CapacitorOidcError } from './errors';
|
|
4
|
+
export { User, UserManagerEvents } from 'oidc-client-ts';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAQ9C,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { CapacitorUserManager } from './capacitor-user-manager';\nexport { CapacitorSecureStateStore } from './capacitor-secure-state-store';\nexport { CapacitorOidcError } from './errors';\nexport type {\n CapacitorOidcErrorCode,\n CapacitorOidcNativeOptions,\n CapacitorUserManagerSettings,\n IOSNativeOptions,\n StoredSessionV1,\n} from './definitions';\nexport { User, UserManagerEvents } from 'oidc-client-ts';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAsB,cAAc,CAAC,UAAU,CAAC,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type { CapacitorOidcPlugin } from './definitions';\nimport { nativeContract } from './generated/native-contract';\n\nexport const NativeOidc = registerPlugin<CapacitorOidcPlugin>(nativeContract.pluginName);\n"]}
|