@aws-amplify/auth 6.15.1 → 6.15.2-unstable.42b6d67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/client/utils/index.js +2 -1
- package/dist/cjs/client/utils/index.js.map +1 -1
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyAuthenticationError.js +34 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyAuthenticationError.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.js +44 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyError.js +47 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyError.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyError.native.js +46 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyError.native.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyRegistrationError.js +45 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyRegistrationError.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyRegistrationError.native.js +55 -0
- package/dist/cjs/client/utils/passkey/errors/handlePasskeyRegistrationError.native.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/index.js +15 -0
- package/dist/cjs/client/utils/passkey/errors/index.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyError.js +82 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyError.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyErrorPlatformConstants.js +8 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyErrorPlatformConstants.js.map +1 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.js +8 -0
- package/dist/cjs/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.js.map +1 -0
- package/dist/cjs/client/utils/passkey/getIsPasskeySupported.native.js +2 -2
- package/dist/cjs/client/utils/passkey/getIsPasskeySupported.native.js.map +1 -1
- package/dist/cjs/client/utils/passkey/getPasskey.native.js +9 -3
- package/dist/cjs/client/utils/passkey/getPasskey.native.js.map +1 -1
- package/dist/cjs/client/utils/passkey/registerPasskey.native.js +9 -3
- package/dist/cjs/client/utils/passkey/registerPasskey.native.js.map +1 -1
- package/dist/cjs/index.js +2 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/cognito/apis/signInWithRedirect.js +3 -0
- package/dist/cjs/providers/cognito/apis/signInWithRedirect.js.map +1 -1
- package/dist/esm/client/apis/associateWebAuthnCredential.mjs +1 -1
- package/dist/esm/client/flows/userAuth/handleWebAuthnSignInResult.mjs +1 -1
- package/dist/esm/client/utils/index.d.ts +1 -1
- package/dist/esm/client/utils/index.mjs +1 -2
- package/dist/esm/client/utils/index.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.d.ts +9 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.mjs +32 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.d.ts +8 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.mjs +42 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.d.ts +10 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.mjs +45 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.native.d.ts +8 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.native.mjs +44 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyError.native.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.d.ts +9 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.mjs +43 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.native.d.ts +8 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.native.mjs +53 -0
- package/dist/esm/client/utils/passkey/errors/handlePasskeyRegistrationError.native.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/index.d.ts +3 -0
- package/dist/esm/client/utils/passkey/errors/index.mjs +4 -0
- package/dist/esm/client/utils/passkey/errors/index.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/{errors.d.ts → errors/passkeyError.d.ts} +2 -17
- package/dist/esm/client/utils/passkey/errors/passkeyError.mjs +80 -0
- package/dist/esm/client/utils/passkey/errors/passkeyError.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.d.ts +1 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.mjs +6 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.d.ts +1 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.mjs +6 -0
- package/dist/esm/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.mjs.map +1 -0
- package/dist/esm/client/utils/passkey/getIsPasskeySupported.native.d.ts +1 -1
- package/dist/esm/client/utils/passkey/getIsPasskeySupported.native.mjs +2 -2
- package/dist/esm/client/utils/passkey/getIsPasskeySupported.native.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/getPasskey.mjs +3 -1
- package/dist/esm/client/utils/passkey/getPasskey.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/getPasskey.native.d.ts +2 -1
- package/dist/esm/client/utils/passkey/getPasskey.native.mjs +11 -3
- package/dist/esm/client/utils/passkey/getPasskey.native.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/registerPasskey.mjs +3 -1
- package/dist/esm/client/utils/passkey/registerPasskey.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/registerPasskey.native.d.ts +2 -1
- package/dist/esm/client/utils/passkey/registerPasskey.native.mjs +11 -3
- package/dist/esm/client/utils/passkey/registerPasskey.native.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/types/index.mjs +2 -1
- package/dist/esm/client/utils/passkey/types/index.mjs.map +1 -1
- package/dist/esm/client/utils/passkey/types/shared.d.ts +4 -4
- package/dist/esm/client/utils/passkey/types/shared.mjs +2 -1
- package/dist/esm/client/utils/passkey/types/shared.mjs.map +1 -1
- package/dist/esm/index.d.ts +1 -2
- package/dist/esm/providers/cognito/apis/signInWithRedirect.mjs +3 -0
- package/dist/esm/providers/cognito/apis/signInWithRedirect.mjs.map +1 -1
- package/package.json +111 -105
- package/src/client/utils/index.ts +1 -1
- package/src/client/utils/passkey/errors/handlePasskeyAuthenticationError.native.ts +54 -0
- package/src/client/utils/passkey/errors/handlePasskeyAuthenticationError.ts +40 -0
- package/src/client/utils/passkey/errors/handlePasskeyError.native.ts +53 -0
- package/src/client/utils/passkey/errors/handlePasskeyError.ts +53 -0
- package/src/client/utils/passkey/errors/handlePasskeyRegistrationError.native.ts +66 -0
- package/src/client/utils/passkey/errors/handlePasskeyRegistrationError.ts +52 -0
- package/src/client/utils/passkey/errors/index.ts +10 -0
- package/src/client/utils/passkey/errors/passkeyError.ts +96 -0
- package/src/client/utils/passkey/errors/passkeyErrorPlatformConstants.native.ts +5 -0
- package/src/client/utils/passkey/errors/passkeyErrorPlatformConstants.ts +5 -0
- package/src/client/utils/passkey/getIsPasskeySupported.native.ts +2 -2
- package/src/client/utils/passkey/getPasskey.native.ts +12 -3
- package/src/client/utils/passkey/registerPasskey.native.ts +12 -3
- package/src/client/utils/passkey/types/shared.ts +4 -4
- package/src/index.ts +1 -2
- package/src/providers/cognito/apis/signInWithRedirect.ts +3 -0
- package/dist/cjs/client/utils/passkey/errors.js +0 -180
- package/dist/cjs/client/utils/passkey/errors.js.map +0 -1
- package/dist/esm/client/utils/passkey/errors.mjs +0 -176
- package/dist/esm/client/utils/passkey/errors.mjs.map +0 -1
- package/src/client/utils/passkey/errors.ts +0 -214
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { loadAmplifyRtnPasskeys } from '@aws-amplify/react-native';
|
|
5
5
|
|
|
6
6
|
export const getIsPasskeySupported = () => {
|
|
7
|
-
|
|
7
|
+
return loadAmplifyRtnPasskeys().getIsPasskeySupported();
|
|
8
8
|
};
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { loadAmplifyRtnPasskeys } from '@aws-amplify/react-native';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { PasskeyGetOptionsJson, PasskeyGetResultJson } from './types';
|
|
7
|
+
import { handlePasskeyAuthenticationError } from './errors';
|
|
8
|
+
|
|
9
|
+
export const getPasskey = async (
|
|
10
|
+
input: PasskeyGetOptionsJson,
|
|
11
|
+
): Promise<PasskeyGetResultJson> => {
|
|
12
|
+
try {
|
|
13
|
+
return await loadAmplifyRtnPasskeys().getPasskey(input);
|
|
14
|
+
} catch (err: unknown) {
|
|
15
|
+
throw handlePasskeyAuthenticationError(err);
|
|
16
|
+
}
|
|
8
17
|
};
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { loadAmplifyRtnPasskeys } from '@aws-amplify/react-native';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { PasskeyCreateOptionsJson, PasskeyCreateResultJson } from './types';
|
|
7
|
+
import { handlePasskeyRegistrationError } from './errors';
|
|
8
|
+
|
|
9
|
+
export const registerPasskey = async (
|
|
10
|
+
input: PasskeyCreateOptionsJson,
|
|
11
|
+
): Promise<PasskeyCreateResultJson> => {
|
|
12
|
+
try {
|
|
13
|
+
return await loadAmplifyRtnPasskeys().createPasskey(input);
|
|
14
|
+
} catch (err: unknown) {
|
|
15
|
+
throw handlePasskeyRegistrationError(err);
|
|
16
|
+
}
|
|
8
17
|
};
|
|
@@ -55,8 +55,8 @@ export interface PkcAttestationResponse<T> {
|
|
|
55
55
|
attestationObject: T;
|
|
56
56
|
transports: string[];
|
|
57
57
|
publicKey?: string;
|
|
58
|
-
publicKeyAlgorithm
|
|
59
|
-
authenticatorData
|
|
58
|
+
publicKeyAlgorithm?: number;
|
|
59
|
+
authenticatorData?: T;
|
|
60
60
|
}
|
|
61
61
|
export interface PasskeyCreateResult {
|
|
62
62
|
id: string;
|
|
@@ -69,7 +69,7 @@ export interface PasskeyCreateResultJson {
|
|
|
69
69
|
id: string;
|
|
70
70
|
rawId: string;
|
|
71
71
|
type: string;
|
|
72
|
-
clientExtensionResults
|
|
72
|
+
clientExtensionResults?: {
|
|
73
73
|
appId?: boolean;
|
|
74
74
|
credProps?: { rk?: boolean };
|
|
75
75
|
hmacCreateSecret?: boolean;
|
|
@@ -121,7 +121,7 @@ export interface PasskeyGetResultJson {
|
|
|
121
121
|
id: string;
|
|
122
122
|
rawId: string;
|
|
123
123
|
type: string;
|
|
124
|
-
clientExtensionResults
|
|
124
|
+
clientExtensionResults?: {
|
|
125
125
|
appId?: boolean;
|
|
126
126
|
credProps?: { rk?: boolean };
|
|
127
127
|
hmacCreateSecret?: boolean;
|
package/src/index.ts
CHANGED
|
@@ -149,6 +149,9 @@ const oauthSignIn = async ({
|
|
|
149
149
|
if (type === 'error') {
|
|
150
150
|
throw createOAuthError(String(error));
|
|
151
151
|
}
|
|
152
|
+
if (type === 'canceled') {
|
|
153
|
+
throw createOAuthError(String(type));
|
|
154
|
+
}
|
|
152
155
|
if (type === 'success' && url) {
|
|
153
156
|
await completeOAuthFlow({
|
|
154
157
|
currentUrl: url,
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.handlePasskeyRegistrationError = exports.handlePasskeyAuthenticationError = exports.assertPasskeyError = exports.PasskeyErrorCode = exports.PasskeyError = void 0;
|
|
7
|
-
const utils_1 = require("@aws-amplify/core/internals/utils");
|
|
8
|
-
class PasskeyError extends utils_1.AmplifyError {
|
|
9
|
-
constructor(params) {
|
|
10
|
-
super(params);
|
|
11
|
-
// Hack for making the custom error class work when transpiled to es5
|
|
12
|
-
// TODO: Delete the following 2 lines after we change the build target to >= es2015
|
|
13
|
-
this.constructor = PasskeyError;
|
|
14
|
-
Object.setPrototypeOf(this, PasskeyError.prototype);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
exports.PasskeyError = PasskeyError;
|
|
18
|
-
var PasskeyErrorCode;
|
|
19
|
-
(function (PasskeyErrorCode) {
|
|
20
|
-
// not supported
|
|
21
|
-
PasskeyErrorCode["PasskeyNotSupported"] = "PasskeyNotSupported";
|
|
22
|
-
// duplicate passkey
|
|
23
|
-
PasskeyErrorCode["PasskeyAlreadyExists"] = "PasskeyAlreadyExists";
|
|
24
|
-
// misconfigurations
|
|
25
|
-
PasskeyErrorCode["InvalidPasskeyRegistrationOptions"] = "InvalidPasskeyRegistrationOptions";
|
|
26
|
-
PasskeyErrorCode["InvalidPasskeyAuthenticationOptions"] = "InvalidPasskeyAuthenticationOptions";
|
|
27
|
-
PasskeyErrorCode["RelyingPartyMismatch"] = "RelyingPartyMismatch";
|
|
28
|
-
// failed credential creation / retrieval
|
|
29
|
-
PasskeyErrorCode["PasskeyRegistrationFailed"] = "PasskeyRegistrationFailed";
|
|
30
|
-
PasskeyErrorCode["PasskeyRetrievalFailed"] = "PasskeyRetrievalFailed";
|
|
31
|
-
// cancel / aborts
|
|
32
|
-
PasskeyErrorCode["PasskeyRegistrationCanceled"] = "PasskeyRegistrationCanceled";
|
|
33
|
-
PasskeyErrorCode["PasskeyAuthenticationCanceled"] = "PasskeyAuthenticationCanceled";
|
|
34
|
-
PasskeyErrorCode["PasskeyOperationAborted"] = "PasskeyOperationAborted";
|
|
35
|
-
})(PasskeyErrorCode || (exports.PasskeyErrorCode = PasskeyErrorCode = {}));
|
|
36
|
-
const notSupportedRecoverySuggestion = 'Passkeys may not be supported on this device. Ensure your application is running in a secure context (HTTPS) and Web Authentication API is supported.';
|
|
37
|
-
const abortOrCancelRecoverySuggestion = 'User may have canceled the ceremony or another interruption has occurred. Check underlying error for details.';
|
|
38
|
-
const misconfigurationRecoverySuggestion = 'Ensure your user pool is configured to support the WEB_AUTHN as an authentication factor.';
|
|
39
|
-
const passkeyErrorMap = {
|
|
40
|
-
[PasskeyErrorCode.PasskeyNotSupported]: {
|
|
41
|
-
message: 'Passkeys may not be supported on this device.',
|
|
42
|
-
recoverySuggestion: notSupportedRecoverySuggestion,
|
|
43
|
-
},
|
|
44
|
-
[PasskeyErrorCode.InvalidPasskeyRegistrationOptions]: {
|
|
45
|
-
message: 'Invalid passkey registration options.',
|
|
46
|
-
recoverySuggestion: misconfigurationRecoverySuggestion,
|
|
47
|
-
},
|
|
48
|
-
[PasskeyErrorCode.InvalidPasskeyAuthenticationOptions]: {
|
|
49
|
-
message: 'Invalid passkey authentication options.',
|
|
50
|
-
recoverySuggestion: misconfigurationRecoverySuggestion,
|
|
51
|
-
},
|
|
52
|
-
[PasskeyErrorCode.PasskeyRegistrationFailed]: {
|
|
53
|
-
message: 'Device failed to create passkey.',
|
|
54
|
-
recoverySuggestion: notSupportedRecoverySuggestion,
|
|
55
|
-
},
|
|
56
|
-
[PasskeyErrorCode.PasskeyRetrievalFailed]: {
|
|
57
|
-
message: 'Device failed to retrieve passkey.',
|
|
58
|
-
recoverySuggestion: 'Passkeys may not be available on this device. Try an alternative authentication factor like PASSWORD, EMAIL_OTP, or SMS_OTP.',
|
|
59
|
-
},
|
|
60
|
-
[PasskeyErrorCode.PasskeyAlreadyExists]: {
|
|
61
|
-
message: 'Passkey already exists in authenticator.',
|
|
62
|
-
recoverySuggestion: 'Proceed with existing passkey or try again after deleting the credential.',
|
|
63
|
-
},
|
|
64
|
-
[PasskeyErrorCode.PasskeyRegistrationCanceled]: {
|
|
65
|
-
message: 'Passkey registration ceremony has been canceled.',
|
|
66
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
67
|
-
},
|
|
68
|
-
[PasskeyErrorCode.PasskeyAuthenticationCanceled]: {
|
|
69
|
-
message: 'Passkey authentication ceremony has been canceled.',
|
|
70
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
71
|
-
},
|
|
72
|
-
[PasskeyErrorCode.PasskeyOperationAborted]: {
|
|
73
|
-
message: 'Passkey operation has been aborted.',
|
|
74
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
75
|
-
},
|
|
76
|
-
[PasskeyErrorCode.RelyingPartyMismatch]: {
|
|
77
|
-
message: 'Relying party does not match current domain.',
|
|
78
|
-
recoverySuggestion: 'Ensure relying party identifier matches current domain.',
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
exports.assertPasskeyError = (0, utils_1.createAssertionFunction)(passkeyErrorMap, PasskeyError);
|
|
82
|
-
/**
|
|
83
|
-
* Handle Passkey Authentication Errors
|
|
84
|
-
* https://w3c.github.io/webauthn/#sctn-get-request-exceptions
|
|
85
|
-
*
|
|
86
|
-
* @param err unknown
|
|
87
|
-
* @returns PasskeyError
|
|
88
|
-
*/
|
|
89
|
-
const handlePasskeyAuthenticationError = (err) => {
|
|
90
|
-
if (err instanceof PasskeyError) {
|
|
91
|
-
return err;
|
|
92
|
-
}
|
|
93
|
-
if (err instanceof Error) {
|
|
94
|
-
if (err.name === 'NotAllowedError') {
|
|
95
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];
|
|
96
|
-
return new PasskeyError({
|
|
97
|
-
name: PasskeyErrorCode.PasskeyAuthenticationCanceled,
|
|
98
|
-
message,
|
|
99
|
-
recoverySuggestion,
|
|
100
|
-
underlyingError: err,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return handlePasskeyError(err);
|
|
105
|
-
};
|
|
106
|
-
exports.handlePasskeyAuthenticationError = handlePasskeyAuthenticationError;
|
|
107
|
-
/**
|
|
108
|
-
* Handle Passkey Registration Errors
|
|
109
|
-
* https://w3c.github.io/webauthn/#sctn-create-request-exceptions
|
|
110
|
-
*
|
|
111
|
-
* @param err unknown
|
|
112
|
-
* @returns PasskeyError
|
|
113
|
-
*/
|
|
114
|
-
const handlePasskeyRegistrationError = (err) => {
|
|
115
|
-
if (err instanceof PasskeyError) {
|
|
116
|
-
return err;
|
|
117
|
-
}
|
|
118
|
-
if (err instanceof Error) {
|
|
119
|
-
// Duplicate Passkey
|
|
120
|
-
if (err.name === 'InvalidStateError') {
|
|
121
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAlreadyExists];
|
|
122
|
-
return new PasskeyError({
|
|
123
|
-
name: PasskeyErrorCode.PasskeyAlreadyExists,
|
|
124
|
-
message,
|
|
125
|
-
recoverySuggestion,
|
|
126
|
-
underlyingError: err,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
// User Cancels Ceremony / Generic Catch All
|
|
130
|
-
if (err.name === 'NotAllowedError') {
|
|
131
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationCanceled];
|
|
132
|
-
return new PasskeyError({
|
|
133
|
-
name: PasskeyErrorCode.PasskeyRegistrationCanceled,
|
|
134
|
-
message,
|
|
135
|
-
recoverySuggestion,
|
|
136
|
-
underlyingError: err,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return handlePasskeyError(err);
|
|
141
|
-
};
|
|
142
|
-
exports.handlePasskeyRegistrationError = handlePasskeyRegistrationError;
|
|
143
|
-
/**
|
|
144
|
-
* Handles Overlapping Passkey Errors Between Registration & Authentication
|
|
145
|
-
* https://w3c.github.io/webauthn/#sctn-create-request-exceptions
|
|
146
|
-
* https://w3c.github.io/webauthn/#sctn-get-request-exceptions
|
|
147
|
-
*
|
|
148
|
-
* @param err unknown
|
|
149
|
-
* @returns PasskeyError
|
|
150
|
-
*/
|
|
151
|
-
const handlePasskeyError = (err) => {
|
|
152
|
-
if (err instanceof Error) {
|
|
153
|
-
// Passkey Operation Aborted
|
|
154
|
-
if (err.name === 'AbortError') {
|
|
155
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyOperationAborted];
|
|
156
|
-
return new PasskeyError({
|
|
157
|
-
name: PasskeyErrorCode.PasskeyOperationAborted,
|
|
158
|
-
message,
|
|
159
|
-
recoverySuggestion,
|
|
160
|
-
underlyingError: err,
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// Relying Party / Domain Mismatch
|
|
164
|
-
if (err.name === 'SecurityError') {
|
|
165
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];
|
|
166
|
-
return new PasskeyError({
|
|
167
|
-
name: PasskeyErrorCode.RelyingPartyMismatch,
|
|
168
|
-
message,
|
|
169
|
-
recoverySuggestion,
|
|
170
|
-
underlyingError: err,
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
return new PasskeyError({
|
|
175
|
-
name: utils_1.AmplifyErrorCode.Unknown,
|
|
176
|
-
message: 'An unknown error has occurred.',
|
|
177
|
-
underlyingError: err,
|
|
178
|
-
});
|
|
179
|
-
};
|
|
180
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sources":["../../../../../src/client/utils/passkey/errors.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.handlePasskeyRegistrationError = exports.handlePasskeyAuthenticationError = exports.assertPasskeyError = exports.PasskeyErrorCode = exports.PasskeyError = void 0;\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nclass PasskeyError extends utils_1.AmplifyError {\n constructor(params) {\n super(params);\n // Hack for making the custom error class work when transpiled to es5\n // TODO: Delete the following 2 lines after we change the build target to >= es2015\n this.constructor = PasskeyError;\n Object.setPrototypeOf(this, PasskeyError.prototype);\n }\n}\nexports.PasskeyError = PasskeyError;\nvar PasskeyErrorCode;\n(function (PasskeyErrorCode) {\n // not supported\n PasskeyErrorCode[\"PasskeyNotSupported\"] = \"PasskeyNotSupported\";\n // duplicate passkey\n PasskeyErrorCode[\"PasskeyAlreadyExists\"] = \"PasskeyAlreadyExists\";\n // misconfigurations\n PasskeyErrorCode[\"InvalidPasskeyRegistrationOptions\"] = \"InvalidPasskeyRegistrationOptions\";\n PasskeyErrorCode[\"InvalidPasskeyAuthenticationOptions\"] = \"InvalidPasskeyAuthenticationOptions\";\n PasskeyErrorCode[\"RelyingPartyMismatch\"] = \"RelyingPartyMismatch\";\n // failed credential creation / retrieval\n PasskeyErrorCode[\"PasskeyRegistrationFailed\"] = \"PasskeyRegistrationFailed\";\n PasskeyErrorCode[\"PasskeyRetrievalFailed\"] = \"PasskeyRetrievalFailed\";\n // cancel / aborts\n PasskeyErrorCode[\"PasskeyRegistrationCanceled\"] = \"PasskeyRegistrationCanceled\";\n PasskeyErrorCode[\"PasskeyAuthenticationCanceled\"] = \"PasskeyAuthenticationCanceled\";\n PasskeyErrorCode[\"PasskeyOperationAborted\"] = \"PasskeyOperationAborted\";\n})(PasskeyErrorCode || (exports.PasskeyErrorCode = PasskeyErrorCode = {}));\nconst notSupportedRecoverySuggestion = 'Passkeys may not be supported on this device. Ensure your application is running in a secure context (HTTPS) and Web Authentication API is supported.';\nconst abortOrCancelRecoverySuggestion = 'User may have canceled the ceremony or another interruption has occurred. Check underlying error for details.';\nconst misconfigurationRecoverySuggestion = 'Ensure your user pool is configured to support the WEB_AUTHN as an authentication factor.';\nconst passkeyErrorMap = {\n [PasskeyErrorCode.PasskeyNotSupported]: {\n message: 'Passkeys may not be supported on this device.',\n recoverySuggestion: notSupportedRecoverySuggestion,\n },\n [PasskeyErrorCode.InvalidPasskeyRegistrationOptions]: {\n message: 'Invalid passkey registration options.',\n recoverySuggestion: misconfigurationRecoverySuggestion,\n },\n [PasskeyErrorCode.InvalidPasskeyAuthenticationOptions]: {\n message: 'Invalid passkey authentication options.',\n recoverySuggestion: misconfigurationRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyRegistrationFailed]: {\n message: 'Device failed to create passkey.',\n recoverySuggestion: notSupportedRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyRetrievalFailed]: {\n message: 'Device failed to retrieve passkey.',\n recoverySuggestion: 'Passkeys may not be available on this device. Try an alternative authentication factor like PASSWORD, EMAIL_OTP, or SMS_OTP.',\n },\n [PasskeyErrorCode.PasskeyAlreadyExists]: {\n message: 'Passkey already exists in authenticator.',\n recoverySuggestion: 'Proceed with existing passkey or try again after deleting the credential.',\n },\n [PasskeyErrorCode.PasskeyRegistrationCanceled]: {\n message: 'Passkey registration ceremony has been canceled.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyAuthenticationCanceled]: {\n message: 'Passkey authentication ceremony has been canceled.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyOperationAborted]: {\n message: 'Passkey operation has been aborted.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.RelyingPartyMismatch]: {\n message: 'Relying party does not match current domain.',\n recoverySuggestion: 'Ensure relying party identifier matches current domain.',\n },\n};\nexports.assertPasskeyError = (0, utils_1.createAssertionFunction)(passkeyErrorMap, PasskeyError);\n/**\n * Handle Passkey Authentication Errors\n * https://w3c.github.io/webauthn/#sctn-get-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nconst handlePasskeyAuthenticationError = (err) => {\n if (err instanceof PasskeyError) {\n return err;\n }\n if (err instanceof Error) {\n if (err.name === 'NotAllowedError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyAuthenticationCanceled,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return handlePasskeyError(err);\n};\nexports.handlePasskeyAuthenticationError = handlePasskeyAuthenticationError;\n/**\n * Handle Passkey Registration Errors\n * https://w3c.github.io/webauthn/#sctn-create-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nconst handlePasskeyRegistrationError = (err) => {\n if (err instanceof PasskeyError) {\n return err;\n }\n if (err instanceof Error) {\n // Duplicate Passkey\n if (err.name === 'InvalidStateError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAlreadyExists];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyAlreadyExists,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n // User Cancels Ceremony / Generic Catch All\n if (err.name === 'NotAllowedError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationCanceled];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyRegistrationCanceled,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return handlePasskeyError(err);\n};\nexports.handlePasskeyRegistrationError = handlePasskeyRegistrationError;\n/**\n * Handles Overlapping Passkey Errors Between Registration & Authentication\n * https://w3c.github.io/webauthn/#sctn-create-request-exceptions\n * https://w3c.github.io/webauthn/#sctn-get-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nconst handlePasskeyError = (err) => {\n if (err instanceof Error) {\n // Passkey Operation Aborted\n if (err.name === 'AbortError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyOperationAborted];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyOperationAborted,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n // Relying Party / Domain Mismatch\n if (err.name === 'SecurityError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];\n return new PasskeyError({\n name: PasskeyErrorCode.RelyingPartyMismatch,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return new PasskeyError({\n name: utils_1.AmplifyErrorCode.Unknown,\n message: 'An unknown error has occurred.',\n underlyingError: err,\n });\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { createAssertionFunction, AmplifyError, AmplifyErrorCode } from '@aws-amplify/core/internals/utils';
|
|
2
|
-
|
|
3
|
-
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
class PasskeyError extends AmplifyError {
|
|
6
|
-
constructor(params) {
|
|
7
|
-
super(params);
|
|
8
|
-
// Hack for making the custom error class work when transpiled to es5
|
|
9
|
-
// TODO: Delete the following 2 lines after we change the build target to >= es2015
|
|
10
|
-
this.constructor = PasskeyError;
|
|
11
|
-
Object.setPrototypeOf(this, PasskeyError.prototype);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
var PasskeyErrorCode;
|
|
15
|
-
(function (PasskeyErrorCode) {
|
|
16
|
-
// not supported
|
|
17
|
-
PasskeyErrorCode["PasskeyNotSupported"] = "PasskeyNotSupported";
|
|
18
|
-
// duplicate passkey
|
|
19
|
-
PasskeyErrorCode["PasskeyAlreadyExists"] = "PasskeyAlreadyExists";
|
|
20
|
-
// misconfigurations
|
|
21
|
-
PasskeyErrorCode["InvalidPasskeyRegistrationOptions"] = "InvalidPasskeyRegistrationOptions";
|
|
22
|
-
PasskeyErrorCode["InvalidPasskeyAuthenticationOptions"] = "InvalidPasskeyAuthenticationOptions";
|
|
23
|
-
PasskeyErrorCode["RelyingPartyMismatch"] = "RelyingPartyMismatch";
|
|
24
|
-
// failed credential creation / retrieval
|
|
25
|
-
PasskeyErrorCode["PasskeyRegistrationFailed"] = "PasskeyRegistrationFailed";
|
|
26
|
-
PasskeyErrorCode["PasskeyRetrievalFailed"] = "PasskeyRetrievalFailed";
|
|
27
|
-
// cancel / aborts
|
|
28
|
-
PasskeyErrorCode["PasskeyRegistrationCanceled"] = "PasskeyRegistrationCanceled";
|
|
29
|
-
PasskeyErrorCode["PasskeyAuthenticationCanceled"] = "PasskeyAuthenticationCanceled";
|
|
30
|
-
PasskeyErrorCode["PasskeyOperationAborted"] = "PasskeyOperationAborted";
|
|
31
|
-
})(PasskeyErrorCode || (PasskeyErrorCode = {}));
|
|
32
|
-
const notSupportedRecoverySuggestion = 'Passkeys may not be supported on this device. Ensure your application is running in a secure context (HTTPS) and Web Authentication API is supported.';
|
|
33
|
-
const abortOrCancelRecoverySuggestion = 'User may have canceled the ceremony or another interruption has occurred. Check underlying error for details.';
|
|
34
|
-
const misconfigurationRecoverySuggestion = 'Ensure your user pool is configured to support the WEB_AUTHN as an authentication factor.';
|
|
35
|
-
const passkeyErrorMap = {
|
|
36
|
-
[PasskeyErrorCode.PasskeyNotSupported]: {
|
|
37
|
-
message: 'Passkeys may not be supported on this device.',
|
|
38
|
-
recoverySuggestion: notSupportedRecoverySuggestion,
|
|
39
|
-
},
|
|
40
|
-
[PasskeyErrorCode.InvalidPasskeyRegistrationOptions]: {
|
|
41
|
-
message: 'Invalid passkey registration options.',
|
|
42
|
-
recoverySuggestion: misconfigurationRecoverySuggestion,
|
|
43
|
-
},
|
|
44
|
-
[PasskeyErrorCode.InvalidPasskeyAuthenticationOptions]: {
|
|
45
|
-
message: 'Invalid passkey authentication options.',
|
|
46
|
-
recoverySuggestion: misconfigurationRecoverySuggestion,
|
|
47
|
-
},
|
|
48
|
-
[PasskeyErrorCode.PasskeyRegistrationFailed]: {
|
|
49
|
-
message: 'Device failed to create passkey.',
|
|
50
|
-
recoverySuggestion: notSupportedRecoverySuggestion,
|
|
51
|
-
},
|
|
52
|
-
[PasskeyErrorCode.PasskeyRetrievalFailed]: {
|
|
53
|
-
message: 'Device failed to retrieve passkey.',
|
|
54
|
-
recoverySuggestion: 'Passkeys may not be available on this device. Try an alternative authentication factor like PASSWORD, EMAIL_OTP, or SMS_OTP.',
|
|
55
|
-
},
|
|
56
|
-
[PasskeyErrorCode.PasskeyAlreadyExists]: {
|
|
57
|
-
message: 'Passkey already exists in authenticator.',
|
|
58
|
-
recoverySuggestion: 'Proceed with existing passkey or try again after deleting the credential.',
|
|
59
|
-
},
|
|
60
|
-
[PasskeyErrorCode.PasskeyRegistrationCanceled]: {
|
|
61
|
-
message: 'Passkey registration ceremony has been canceled.',
|
|
62
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
63
|
-
},
|
|
64
|
-
[PasskeyErrorCode.PasskeyAuthenticationCanceled]: {
|
|
65
|
-
message: 'Passkey authentication ceremony has been canceled.',
|
|
66
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
67
|
-
},
|
|
68
|
-
[PasskeyErrorCode.PasskeyOperationAborted]: {
|
|
69
|
-
message: 'Passkey operation has been aborted.',
|
|
70
|
-
recoverySuggestion: abortOrCancelRecoverySuggestion,
|
|
71
|
-
},
|
|
72
|
-
[PasskeyErrorCode.RelyingPartyMismatch]: {
|
|
73
|
-
message: 'Relying party does not match current domain.',
|
|
74
|
-
recoverySuggestion: 'Ensure relying party identifier matches current domain.',
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
const assertPasskeyError = createAssertionFunction(passkeyErrorMap, PasskeyError);
|
|
78
|
-
/**
|
|
79
|
-
* Handle Passkey Authentication Errors
|
|
80
|
-
* https://w3c.github.io/webauthn/#sctn-get-request-exceptions
|
|
81
|
-
*
|
|
82
|
-
* @param err unknown
|
|
83
|
-
* @returns PasskeyError
|
|
84
|
-
*/
|
|
85
|
-
const handlePasskeyAuthenticationError = (err) => {
|
|
86
|
-
if (err instanceof PasskeyError) {
|
|
87
|
-
return err;
|
|
88
|
-
}
|
|
89
|
-
if (err instanceof Error) {
|
|
90
|
-
if (err.name === 'NotAllowedError') {
|
|
91
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];
|
|
92
|
-
return new PasskeyError({
|
|
93
|
-
name: PasskeyErrorCode.PasskeyAuthenticationCanceled,
|
|
94
|
-
message,
|
|
95
|
-
recoverySuggestion,
|
|
96
|
-
underlyingError: err,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return handlePasskeyError(err);
|
|
101
|
-
};
|
|
102
|
-
/**
|
|
103
|
-
* Handle Passkey Registration Errors
|
|
104
|
-
* https://w3c.github.io/webauthn/#sctn-create-request-exceptions
|
|
105
|
-
*
|
|
106
|
-
* @param err unknown
|
|
107
|
-
* @returns PasskeyError
|
|
108
|
-
*/
|
|
109
|
-
const handlePasskeyRegistrationError = (err) => {
|
|
110
|
-
if (err instanceof PasskeyError) {
|
|
111
|
-
return err;
|
|
112
|
-
}
|
|
113
|
-
if (err instanceof Error) {
|
|
114
|
-
// Duplicate Passkey
|
|
115
|
-
if (err.name === 'InvalidStateError') {
|
|
116
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAlreadyExists];
|
|
117
|
-
return new PasskeyError({
|
|
118
|
-
name: PasskeyErrorCode.PasskeyAlreadyExists,
|
|
119
|
-
message,
|
|
120
|
-
recoverySuggestion,
|
|
121
|
-
underlyingError: err,
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
// User Cancels Ceremony / Generic Catch All
|
|
125
|
-
if (err.name === 'NotAllowedError') {
|
|
126
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationCanceled];
|
|
127
|
-
return new PasskeyError({
|
|
128
|
-
name: PasskeyErrorCode.PasskeyRegistrationCanceled,
|
|
129
|
-
message,
|
|
130
|
-
recoverySuggestion,
|
|
131
|
-
underlyingError: err,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return handlePasskeyError(err);
|
|
136
|
-
};
|
|
137
|
-
/**
|
|
138
|
-
* Handles Overlapping Passkey Errors Between Registration & Authentication
|
|
139
|
-
* https://w3c.github.io/webauthn/#sctn-create-request-exceptions
|
|
140
|
-
* https://w3c.github.io/webauthn/#sctn-get-request-exceptions
|
|
141
|
-
*
|
|
142
|
-
* @param err unknown
|
|
143
|
-
* @returns PasskeyError
|
|
144
|
-
*/
|
|
145
|
-
const handlePasskeyError = (err) => {
|
|
146
|
-
if (err instanceof Error) {
|
|
147
|
-
// Passkey Operation Aborted
|
|
148
|
-
if (err.name === 'AbortError') {
|
|
149
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyOperationAborted];
|
|
150
|
-
return new PasskeyError({
|
|
151
|
-
name: PasskeyErrorCode.PasskeyOperationAborted,
|
|
152
|
-
message,
|
|
153
|
-
recoverySuggestion,
|
|
154
|
-
underlyingError: err,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
// Relying Party / Domain Mismatch
|
|
158
|
-
if (err.name === 'SecurityError') {
|
|
159
|
-
const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];
|
|
160
|
-
return new PasskeyError({
|
|
161
|
-
name: PasskeyErrorCode.RelyingPartyMismatch,
|
|
162
|
-
message,
|
|
163
|
-
recoverySuggestion,
|
|
164
|
-
underlyingError: err,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return new PasskeyError({
|
|
169
|
-
name: AmplifyErrorCode.Unknown,
|
|
170
|
-
message: 'An unknown error has occurred.',
|
|
171
|
-
underlyingError: err,
|
|
172
|
-
});
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
export { PasskeyError, PasskeyErrorCode, assertPasskeyError, handlePasskeyAuthenticationError, handlePasskeyRegistrationError };
|
|
176
|
-
//# sourceMappingURL=errors.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","sources":["../../../../../src/client/utils/passkey/errors.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { AmplifyError, AmplifyErrorCode, createAssertionFunction, } from '@aws-amplify/core/internals/utils';\nexport class PasskeyError extends AmplifyError {\n constructor(params) {\n super(params);\n // Hack for making the custom error class work when transpiled to es5\n // TODO: Delete the following 2 lines after we change the build target to >= es2015\n this.constructor = PasskeyError;\n Object.setPrototypeOf(this, PasskeyError.prototype);\n }\n}\nexport var PasskeyErrorCode;\n(function (PasskeyErrorCode) {\n // not supported\n PasskeyErrorCode[\"PasskeyNotSupported\"] = \"PasskeyNotSupported\";\n // duplicate passkey\n PasskeyErrorCode[\"PasskeyAlreadyExists\"] = \"PasskeyAlreadyExists\";\n // misconfigurations\n PasskeyErrorCode[\"InvalidPasskeyRegistrationOptions\"] = \"InvalidPasskeyRegistrationOptions\";\n PasskeyErrorCode[\"InvalidPasskeyAuthenticationOptions\"] = \"InvalidPasskeyAuthenticationOptions\";\n PasskeyErrorCode[\"RelyingPartyMismatch\"] = \"RelyingPartyMismatch\";\n // failed credential creation / retrieval\n PasskeyErrorCode[\"PasskeyRegistrationFailed\"] = \"PasskeyRegistrationFailed\";\n PasskeyErrorCode[\"PasskeyRetrievalFailed\"] = \"PasskeyRetrievalFailed\";\n // cancel / aborts\n PasskeyErrorCode[\"PasskeyRegistrationCanceled\"] = \"PasskeyRegistrationCanceled\";\n PasskeyErrorCode[\"PasskeyAuthenticationCanceled\"] = \"PasskeyAuthenticationCanceled\";\n PasskeyErrorCode[\"PasskeyOperationAborted\"] = \"PasskeyOperationAborted\";\n})(PasskeyErrorCode || (PasskeyErrorCode = {}));\nconst notSupportedRecoverySuggestion = 'Passkeys may not be supported on this device. Ensure your application is running in a secure context (HTTPS) and Web Authentication API is supported.';\nconst abortOrCancelRecoverySuggestion = 'User may have canceled the ceremony or another interruption has occurred. Check underlying error for details.';\nconst misconfigurationRecoverySuggestion = 'Ensure your user pool is configured to support the WEB_AUTHN as an authentication factor.';\nconst passkeyErrorMap = {\n [PasskeyErrorCode.PasskeyNotSupported]: {\n message: 'Passkeys may not be supported on this device.',\n recoverySuggestion: notSupportedRecoverySuggestion,\n },\n [PasskeyErrorCode.InvalidPasskeyRegistrationOptions]: {\n message: 'Invalid passkey registration options.',\n recoverySuggestion: misconfigurationRecoverySuggestion,\n },\n [PasskeyErrorCode.InvalidPasskeyAuthenticationOptions]: {\n message: 'Invalid passkey authentication options.',\n recoverySuggestion: misconfigurationRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyRegistrationFailed]: {\n message: 'Device failed to create passkey.',\n recoverySuggestion: notSupportedRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyRetrievalFailed]: {\n message: 'Device failed to retrieve passkey.',\n recoverySuggestion: 'Passkeys may not be available on this device. Try an alternative authentication factor like PASSWORD, EMAIL_OTP, or SMS_OTP.',\n },\n [PasskeyErrorCode.PasskeyAlreadyExists]: {\n message: 'Passkey already exists in authenticator.',\n recoverySuggestion: 'Proceed with existing passkey or try again after deleting the credential.',\n },\n [PasskeyErrorCode.PasskeyRegistrationCanceled]: {\n message: 'Passkey registration ceremony has been canceled.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyAuthenticationCanceled]: {\n message: 'Passkey authentication ceremony has been canceled.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.PasskeyOperationAborted]: {\n message: 'Passkey operation has been aborted.',\n recoverySuggestion: abortOrCancelRecoverySuggestion,\n },\n [PasskeyErrorCode.RelyingPartyMismatch]: {\n message: 'Relying party does not match current domain.',\n recoverySuggestion: 'Ensure relying party identifier matches current domain.',\n },\n};\nexport const assertPasskeyError = createAssertionFunction(passkeyErrorMap, PasskeyError);\n/**\n * Handle Passkey Authentication Errors\n * https://w3c.github.io/webauthn/#sctn-get-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nexport const handlePasskeyAuthenticationError = (err) => {\n if (err instanceof PasskeyError) {\n return err;\n }\n if (err instanceof Error) {\n if (err.name === 'NotAllowedError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyAuthenticationCanceled,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return handlePasskeyError(err);\n};\n/**\n * Handle Passkey Registration Errors\n * https://w3c.github.io/webauthn/#sctn-create-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nexport const handlePasskeyRegistrationError = (err) => {\n if (err instanceof PasskeyError) {\n return err;\n }\n if (err instanceof Error) {\n // Duplicate Passkey\n if (err.name === 'InvalidStateError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyAlreadyExists];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyAlreadyExists,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n // User Cancels Ceremony / Generic Catch All\n if (err.name === 'NotAllowedError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationCanceled];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyRegistrationCanceled,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return handlePasskeyError(err);\n};\n/**\n * Handles Overlapping Passkey Errors Between Registration & Authentication\n * https://w3c.github.io/webauthn/#sctn-create-request-exceptions\n * https://w3c.github.io/webauthn/#sctn-get-request-exceptions\n *\n * @param err unknown\n * @returns PasskeyError\n */\nconst handlePasskeyError = (err) => {\n if (err instanceof Error) {\n // Passkey Operation Aborted\n if (err.name === 'AbortError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.PasskeyOperationAborted];\n return new PasskeyError({\n name: PasskeyErrorCode.PasskeyOperationAborted,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n // Relying Party / Domain Mismatch\n if (err.name === 'SecurityError') {\n const { message, recoverySuggestion } = passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];\n return new PasskeyError({\n name: PasskeyErrorCode.RelyingPartyMismatch,\n message,\n recoverySuggestion,\n underlyingError: err,\n });\n }\n }\n return new PasskeyError({\n name: AmplifyErrorCode.Unknown,\n message: 'An unknown error has occurred.',\n underlyingError: err,\n });\n};\n"],"names":[],"mappings":"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"}
|