From 25e208fce53a56bff44a93099b07aefe37f01bbf Mon Sep 17 00:00:00 2001 From: Haris Chaniotakis Date: Tue, 8 Oct 2024 13:50:24 +0200 Subject: [PATCH] fix(clerk-js): Handle gracefully Coinbase Wallet use of existing Passkey There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing Passkey in order to authenticate, the initial generate signature request to be rejected. For this reason we retry the request once more in order for the flow to be able to be completed successfully. --- .changeset/khaki-cycles-appear.md | 5 +++++ .../clerk-js/src/core/resources/SignIn.ts | 21 ++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 .changeset/khaki-cycles-appear.md diff --git a/.changeset/khaki-cycles-appear.md b/.changeset/khaki-cycles-appear.md new file mode 100644 index 00000000000..89de34fa562 --- /dev/null +++ b/.changeset/khaki-cycles-appear.md @@ -0,0 +1,5 @@ +--- +"@clerk/clerk-js": patch +--- + +Handle gracefully Coinbase Wallet use of existing Passkey diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 27bfc60da2d..e9124638042 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -255,11 +255,22 @@ export class SignIn extends BaseResource implements SignInResource { clerkVerifyWeb3WalletCalledBeforeCreate('SignIn'); } - const signature = await generateSignature({ - identifier: this.identifier!, - nonce: nonce, - provider, - }); + let signature: string; + try { + signature = await generateSignature({ identifier, nonce, provider }); + } catch (err) { + // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing + // Passkey in order to authenticate, the initial generate signature request to be rejected. For this + // reason we retry the request once more in order for the flow to be able to be completed successfully. + // + // error code 4001 means the user rejected the request + // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors + if (provider === 'coinbase_wallet' && err.code === 4001) { + signature = await generateSignature({ identifier, nonce, provider }); + } else { + throw err; + } + } return this.attemptFirstFactor({ signature,