Loading...
Loading...
Configure authentication methods for Cartridge Controller including passkeys, social login, and external wallets. Use when implementing user authentication, adding multiple signers for account recovery, customizing signup options, or integrating external wallets like MetaMask or Phantom. Covers WebAuthn passkeys, Google/Discord/Twitter OAuth, wallet connections, and dynamic authentication flows.
npx skill4agent add cartridge-gg/docs controller-signers| Type | Description | Best For |
|---|---|---|
| Passkey (biometric/hardware key) | Primary auth, most secure |
| Google OAuth | Easy onboarding |
| Discord OAuth | Gaming communities |
| Twitter/X OAuth | Social integration |
| Argent wallet (Starknet) | Starknet native users |
| Braavos wallet (Starknet) | Starknet native users |
| MetaMask (desktop only) | EVM users |
| Phantom EVM mode (desktop only) | Multi-chain users |
| Rabby wallet (desktop only) | Security-focused users |
| WalletConnect (desktop only) | Cross-device |
| Email/password | Testing only |
Warning: Password authentication is non-recoverable. If users lose their password, they permanently lose account access. Do not use in production.
const controller = new Controller({
signupOptions: [
"webauthn", // Passkeys
"google", // Google OAuth
"discord", // Discord OAuth
"twitter", // Twitter/X OAuth
"argent", // Argent wallet
"braavos", // Braavos wallet
"metamask", // MetaMask (desktop)
"phantom-evm", // Phantom (desktop)
"rabby", // Rabby (desktop)
"walletconnect",// WalletConnect (desktop)
],
});// Default options
const controller = new Controller({
signupOptions: ["webauthn", "google", "discord"],
});
// Branded Phantom flow
await controller.connect(["phantom-evm"]);
// Branded Google flow
await controller.connect(["google"]);// Shows "sign up with Phantom" button with Phantom branding
const controller = new Controller({
signupOptions: ["phantom-evm"],
});const success = await controller.externalSwitchChain(
"metamask", // wallet type
chainId // target chain (hex)
);const response = await controller.externalWaitForTransaction(
"metamask",
txHash,
30000 // timeout ms
);
if (response.success) {
console.log("Receipt:", response.result);
} else {
console.error("Error:", response.error);
}accountsChangedconst isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
const authOptions = isMobile
? ["webauthn", "google", "discord", "argent", "braavos"]
: ["webauthn", "google", "discord", "argent", "braavos", "metamask", "walletconnect"];
await controller.connect(authOptions);