Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add mfa on sign in with an authenticator app #1398

Merged
merged 91 commits into from
Apr 4, 2025
Merged
Changes from 1 commit
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
8ca926a
feat: add mfa totp to the email otp flow
blakecduncan Feb 25, 2025
a5038db
chore: fix rn build after mfa changes
blakecduncan Feb 25, 2025
bc887b6
feat: support mfa for magic link
blakecduncan Feb 26, 2025
e572159
feat: update auto generated docs
blakecduncan Feb 26, 2025
dc2c484
chore: fix signer build from missing listener
blakecduncan Feb 26, 2025
c021c79
feat: update api endpoints for mfa
blakecduncan Feb 26, 2025
e4f65fc
chore: update signer docs
blakecduncan Feb 26, 2025
8113753
chore: fix build
blakecduncan Feb 26, 2025
af789b6
chore: update signer docs
blakecduncan Feb 26, 2025
180935e
feat: wip mfa card
RobChangCA Feb 26, 2025
3e06598
chore: update types to match api responses
blakecduncan Feb 27, 2025
40da2d2
chore: auto generated docs pages
blakecduncan Feb 27, 2025
ae47938
chore: use AlchemyMfaStatus type
blakecduncan Feb 27, 2025
901747a
feat: med-fi full flow
RobChangCA Feb 27, 2025
3e89cd6
feat: verify handler for otp
RobChangCA Feb 27, 2025
6cbf5b8
chore: use correct mfa verify api endpoint
blakecduncan Feb 27, 2025
24aeb93
chore: fix verify mfa return value
blakecduncan Feb 27, 2025
fca6b30
chore: auto generated docs pages
blakecduncan Feb 27, 2025
9f73714
chore: fix rn build
blakecduncan Feb 27, 2025
4eea86c
Merge branch 'blake/add-mfa-totp' into mfa/demo
blakecduncan Feb 27, 2025
f477d36
feat: add mfa crud functionality to the UI
blakecduncan Feb 27, 2025
0543c03
feat: dark mode, magic link
RobChangCA Feb 27, 2025
98f3890
feat: add mfa to email otp authentication
blakecduncan Feb 28, 2025
27ce637
Merge branch 'mfa/demo' of https://github.com/alchemyplatform/aa-sdk …
blakecduncan Feb 28, 2025
a5a47f3
chore: fix build
blakecduncan Feb 28, 2025
c33ff93
chore: temporarily using otp email instead of magic link
blakecduncan Feb 28, 2025
07516d2
chore: remove image from qr code
blakecduncan Feb 28, 2025
b8ee838
chore: remove unused import
blakecduncan Feb 28, 2025
0c20735
fix: increase card dimensions
RobChangCA Feb 28, 2025
af94812
fix: min height to cards
RobChangCA Feb 28, 2025
13023b4
chore: fix auth mfa otp endpoint
blakecduncan Feb 28, 2025
cf2a82f
Merge branch 'rob/card-dimensions' into mfa/demo
blakecduncan Feb 28, 2025
e475a71
chore: auto generated docs pages
blakecduncan Feb 28, 2025
46b3bd7
feat: minor ui tweaks
RobChangCA Feb 28, 2025
263e202
feat: check status of mfa in mfa card
blakecduncan Feb 28, 2025
7c43f87
chore: remove unused import
blakecduncan Feb 28, 2025
9a1e543
chore: remove image from qr code
blakecduncan Feb 28, 2025
ef174aa
feat: ui tweaks
RobChangCA Feb 28, 2025
4f04878
fix: image file name
RobChangCA Feb 28, 2025
7e82e4e
feat: add mfa for magic link in the demo
blakecduncan Mar 4, 2025
171ff78
Merge branch 'main' into mfa/demo
RobChangCA Mar 4, 2025
bde11ff
feat: cleanup mfa logic in signer (#1409)
blakecduncan Mar 4, 2025
4b7973d
feat: add mfa hook (#1410)
blakecduncan Mar 4, 2025
7edd6d0
feat: pass multiFactorType to api
blakecduncan Mar 4, 2025
0460be1
chore: update error message
blakecduncan Mar 5, 2025
c88b569
feat: split mfa, clean up animation, error state (#1418)
RobChangCA Mar 6, 2025
e99325c
feat: update the stampedRequest on mfa calls
blakecduncan Mar 11, 2025
75fcbed
feat: update mfa request payload
blakecduncan Mar 11, 2025
6eb9300
Merge branch 'main' into mfa/demo
blakecduncan Mar 13, 2025
e9fdbfd
feat: fix build and wrap cards
blakecduncan Mar 13, 2025
c3ce923
docs: auto generated docs
blakecduncan Mar 13, 2025
250c912
docs: add mfa docs
blakecduncan Mar 13, 2025
2af3651
feat: use mfa hooks in the mfaModal
blakecduncan Mar 14, 2025
ba0e67b
docs: auto generated docs
blakecduncan Mar 14, 2025
bc22a0d
fix: fix lint error
blakecduncan Mar 14, 2025
71775b4
feat: use staging signer
blakecduncan Mar 17, 2025
0f7c6b9
feat: update hook exports
blakecduncan Mar 17, 2025
13bdeaf
feat: fix error states for totp
blakecduncan Mar 18, 2025
efd6edd
feat: fix text overflow on small screens
blakecduncan Mar 18, 2025
9719e29
docs: dogfooding feedback
blakecduncan Mar 18, 2025
4eb58b6
docs: add social login with mfa docs page
blakecduncan Mar 19, 2025
f0f569c
docs: add reference to mfa in the getting started docs
blakecduncan Mar 19, 2025
6980b35
docs: dogfooding feedback
blakecduncan Mar 19, 2025
914b565
feat: clean up useMfa hook and documenation after dogfooding
blakecduncan Mar 20, 2025
e5cb8a3
Merge branch 'main' into mfa/demo
RobChangCA Mar 20, 2025
5ec990b
feat: card alignment - switch to grid
RobChangCA Mar 21, 2025
b9a5603
test: add tests for the authenticate method
blakecduncan Mar 21, 2025
709eec1
test: clean up mocks and base test
blakecduncan Mar 21, 2025
b66f88b
Merge branch 'mfa/demo' of github.com:alchemyplatform/aa-sdk into mfa…
blakecduncan Mar 21, 2025
13bf95e
feat: mobile auth store (#1477)
RobChangCA Mar 24, 2025
b36865a
feat: use new verify mfa api
blakecduncan Mar 25, 2025
47d0d0d
feat: fix build
blakecduncan Mar 26, 2025
f043d8a
feat: use new verify mfa api in the demo
blakecduncan Mar 27, 2025
3325da7
feat: fix the demo app
blakecduncan Mar 27, 2025
4d3fefb
feat: remove unused comment
blakecduncan Mar 27, 2025
4aaa975
test: fix base.test.ts
blakecduncan Mar 28, 2025
cca8114
feat: change modal background to a blur
blakecduncan Apr 1, 2025
126216d
docs: refactor docs after mfa api changes
blakecduncan Apr 1, 2025
6f4cb87
Merge branch 'main' into mfa/demo
blakecduncan Apr 1, 2025
92f70a4
fix: ui merge issues
blakecduncan Apr 1, 2025
30c4e0b
Merge branch 'blake/test-modal-blur' into mfa/demo
blakecduncan Apr 1, 2025
6c20e2b
fix: fix magic link auth card flow
blakecduncan Apr 2, 2025
a10199d
docs: make mfa docs more clear
blakecduncan Apr 2, 2025
fa4f9b5
docs: fix signer mfa docs with updates
blakecduncan Apr 2, 2025
2aa64ac
docs: fix code example build
blakecduncan Apr 2, 2025
9ea28df
fix: fix card ui jumping issue
blakecduncan Apr 2, 2025
079d21b
docs: remove unnecessary text
blakecduncan Apr 4, 2025
a176a6e
fix: ignore eslint error
blakecduncan Apr 4, 2025
cf1ff2a
Merge branch 'main' into mfa/demo
blakecduncan Apr 4, 2025
2210bb4
chore: remove staging config
blakecduncan Apr 4, 2025
90f3223
Merge branch 'main' into mfa/demo
blakecduncan Apr 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: card alignment - switch to grid
RobChangCA committed Mar 21, 2025
commit 5ec990ba7a8d9e4e9d5a3aee44f3ff8b23183c68
2 changes: 2 additions & 0 deletions examples/ui-demo/src/components/modals/MFA/MFAModal.tsx
Original file line number Diff line number Diff line change
@@ -218,6 +218,7 @@ export function MFAModal({
<>
{isMfaActive ? (
<Button
className="mt-auto"
onClick={handleRemoveMFA}
disabled={
removeMFA.isPending || getMFAFactors.isPending || isLoadingClient
@@ -229,6 +230,7 @@ export function MFAModal({
</Button>
) : (
<Button
className="mt-auto"
onClick={handleInitMFASetup}
disabled={isLoadingClient || isLoading}
>
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ export function PreviewWrapper({ showCode }: { showCode: boolean }) {
{/* Don't unmount when showing code preview so that the auth card retains its state */}
<div
className={cn(
"flex flex-col flex-1 overflow-y-auto scrollbar-none relative p-3 lg:p-6",
"flex flex-col flex-1 overflow-y-auto scrollbar-none relative p-3 lg:p-6 pt-0",
showCode && "hidden"
)}
>
15 changes: 10 additions & 5 deletions examples/ui-demo/src/components/small-cards/Card.tsx
Original file line number Diff line number Diff line change
@@ -6,13 +6,14 @@ export function Card({
badgeSlot,
}: {
imageSlot: React.ReactNode;
heading: string;
heading: string | React.ReactNode;
content: React.ReactNode;
buttons: React.ReactNode;
badgeSlot?: React.ReactNode;
}) {
const isStringHeading = typeof heading === "string";
return (
<div className="bg-bg-surface-default rounded-lg p-4 w-full xl:p-6 xl:w-[326px] xl:h-[570px] flex flex-col border hover:border-fg-tertiary mb-5 xl:mb-0 min-h-[220px]">
<div className="bg-bg-surface-default rounded-lg p-4 w-full xl:p-6 xl:h-[570px] flex flex-col border hover:border-fg-tertiary min-h-[220px]">
<div className="flex xl:flex-col gap-4 relative">
<div className="absolute top-[-6px] left-[-6px] sm:top-1 sm:left-1 xl:left-auto xl:right-3 xl:top-3 z-10">
{badgeSlot}
@@ -21,9 +22,13 @@ export function Card({
{imageSlot}
</div>
<div className="w-full mb-3">
<h3 className="text-fg-primary xl:text-xl font-semibold mb-2 xl:mb-3">
{heading}
</h3>
{isStringHeading ? (
<h3 className="text-fg-primary xl:text-xl font-semibold mb-2 xl:mb-3">
{heading}
</h3>
) : (
heading
)}
{content}
</div>
</div>
68 changes: 37 additions & 31 deletions examples/ui-demo/src/components/small-cards/MFACard.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { useEffect, useState, useRef } from "react";

Check warning on line 1 in examples/ui-demo/src/components/small-cards/MFACard.tsx

GitHub Actions / Lint

'useRef' is defined but never used
import { ThreeStarsIcon } from "../icons/three-stars";
import { MFAModal } from "../modals/MFA/MFAModal";
import { useMFA } from "@account-kit/react";
import { Card } from "./Card";

export function MFACard() {
const [isMfaActive, setIsMfaActive] = useState(false);
@@ -21,39 +22,44 @@
}, [isReady]);

return (
<div className="bg-bg-surface-default rounded-lg p-4 xl:p-6 w-full xl:w-[326px] xl:h-[500px] flex flex-col justify-between shadow-smallCard min-h-[220px]">
<div className="flex xl:flex-col gap-4">
<div className="flex-shrink-0 bg-[#DCE9FF] rounded-xl sm:mb-3 xl:mb-0 flex justify-center items-center relative h-[67px] w-[60px] sm:h-[154px] sm:w-[140px] xl:h-[222px] xl:w-full">
<Card
imageSlot={
<div className="w-full h-full bg-[#DCE9FF] flex justify-center items-center">
<ThreeStarsIcon className="h-9 w-9 sm:h-[74px] sm:w-[74px] xl:h-[94px] xl:w-[94px]" />
<p className="absolute top-[-6px] left-[-6px] sm:top-1 sm:left-1 xl:left-auto xl:right-4 xl:top-4 px-2 py-1 font-semibold rounded-md text-xs text-[#7c3AED] bg-[#F3F3FF]">
New!
</p>
</div>
<div className="w-full mb-3">
<div className="flex items-center justify-between sm:gap-2 mb-1 flex-col sm:flex-row">
<h3 className="text-fg-primary xl:text-xl font-semibold self-start">
Multi-factor <br />
Authentication
</h3>
{isMfaActive && (
<span className="text-sm font-medium self-start sm:px-2 sm:py-0.5 rounded-full flex items-center gap-1 font-inter leading-[21px] tracking-normal">
<div className="h-3 w-3 rounded-full bg-green-500"></div>
Active
</span>
)}
</div>
<p className="text-fg-primary text-sm">
Lock down your account with MFA. This requires downloading an auth
app like Google Authenticator.
</p>
}
badgeSlot={
<p className="px-2 py-1 font-semibold rounded-md text-xs text-[#7c3AED] bg-[#F3F3FF]">
New!
</p>
}
heading={
<div className="flex items-center justify-between flex-col sm:flex-row">
<h3 className="text-fg-primary xl:text-xl font-semibold mb-2 xl:mb-3 self-start">
Multi-factor <br />
Authentication
</h3>
{isMfaActive && (
<span className="text-sm font-medium self-start sm:px-2 sm:py-0.5 rounded-full flex items-center gap-1 font-inter leading-[21px] tracking-normal">
<div className="h-3 w-3 rounded-full bg-green-500"></div>
Active
</span>
)}
</div>
</div>
<MFAModal
isMfaActive={isMfaActive}
onMfaEnabled={() => setIsMfaActive(true)}
onMfaRemoved={() => setIsMfaActive(false)}
isLoadingClient={!isReady || getMFAFactors.isPending}
/>
</div>
}
content={
<p className="text-fg-primary text-sm">
Lock down your account with MFA. This requires downloading an auth app
like Google Authenticator.
</p>
}
buttons={
<MFAModal
isMfaActive={isMfaActive}
onMfaEnabled={() => setIsMfaActive(true)}
onMfaRemoved={() => setIsMfaActive(false)}
/>
}
/>
);
}
2 changes: 1 addition & 1 deletion examples/ui-demo/src/components/small-cards/MintCard.tsx
Original file line number Diff line number Diff line change
@@ -91,7 +91,7 @@ export const MintCard = ({ accountMode }: { accountMode: AccountMode }) => {
}
buttons={
<Button
className="w-full mt-auto"
className="mt-auto"
onClick={handleCollectNFT}
disabled={isLoading}
>
Original file line number Diff line number Diff line change
@@ -98,7 +98,7 @@ export const SolanaCard = () => {
});

const imageSlot = (
<div className="flex-shrink-0 bg-[#DCFCE7] rounded-xl flex justify-center items-center relative h-[67px] w-[60px] sm:h-[154px] sm:w-[140px] xl:h-[222px] xl:w-full">
<div className="w-full h-full bg-[#DCFCE7] flex justify-center items-center relative">
<Image
className="h-9 w-9 sm:h-[74px] sm:w-[74px] xl:h-[94px] xl:w-[94px]"
src="https://static.alchemyapi.io/images/emblems/solana-mainnet.svg"
Original file line number Diff line number Diff line change
@@ -63,15 +63,15 @@ export const TransactionsCard = ({
<Card
badgeSlot={<Badge text="New!" className="text-[#7c3AED] bg-[#F3F3FF]" />}
imageSlot={
<div className="flex-shrink-0 bg-[#EAEBFE] rounded-xl flex justify-center items-center relative h-[67px] w-[60px] sm:h-[154px] sm:w-[140px] xl:h-[222px] xl:w-full">
<div className="w-full h-full bg-[#EAEBFE] flex justify-center items-center">
<Key className="h-9 w-9 sm:h-[74px] sm:w-[74px] xl:h-[94px] xl:w-[94px]" />
</div>
}
heading="Recurring transactions"
content={content}
buttons={
<Button
className="mt-auto w-full"
className="mt-auto"
onClick={handleTransactions}
disabled={
isLoadingClient || cardStatus === "setup" || cardStatus === "active"
2 changes: 1 addition & 1 deletion examples/ui-demo/src/components/small-cards/Wrapper.tsx
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ import { MFACard } from "./MFACard";
export const SmallCardsWrapper = () => {
const { accountMode } = useConfigStore();
return (
<div className="flex flex-col xl:flex-row gap-6 lg:mt-6 items-center w-full justify-center max-w-screen-sm xl:max-w-none">
<div className="grid grid-cols-1 xl:grid-cols-3 gap-6 mt-3 lg:mt-0 items-center w-full">
<MintCard accountMode={accountMode} key={`mint-card-${accountMode}`} />
<TransactionsCard
accountMode={accountMode}

Unchanged files with check annotations Beta

if (status === AlchemySignerStatus.AWAITING_EMAIL_AUTH) {
setAuthStep({ type: "email_verify", email: form.state.values.email });
}
}, [status]);

Check warning on line 103 in account-kit/react/src/components/auth/sections/EmailAuth.tsx

GitHub Actions / Lint

React Hook useEffect has missing dependencies: 'form.state.values.email' and 'setAuthStep'. Either include them or remove the dependency array
return (
<form
/* eslint-disable @next/next/no-img-element */
import Image from "next/image";

Check warning on line 2 in examples/ui-demo/src/components/ui/Spinner.tsx

GitHub Actions / Lint

'Image' is defined but never used
// This spinner icon has to be in png format because svg does not support angular gradients
const SpinnerLightModeBase64 =