BuddyWorkflowBuddyWorkflow← Back home

Multi-Factor Authentication

How BuddyWorkflow implements and enforces two-factor authentication for end users and administrators, protecting access to financial data connected through Plaid and payments processed through Stripe.

Version: 1.0Status: Available in productionMethod: TOTP (authenticator app)Owner: Founder & Security Lead

1. Summary

BuddyWorkflow supports multi-factor authentication (MFA) in production for both end users and administrators. MFA uses time-based one-time passwords (TOTP) generated by a standard authenticator app (Google Authenticator, Authy, 1Password, etc.), implemented on top of Supabase Auth's native MFA. Once a user enrolls a second factor, it is required on top of email + password at every sign-in before their session is granted.

This control directly strengthens protection of the two most sensitive integrations: Plaid (bank-account connectivity) and Stripe (payments & billing). For an account with a verified factor, a stolen password alone can no longer establish a session that reaches connected financial accounts or payment settings.

2. Scope & Enforcement

3. Assurance Levels (AAL)

Supabase Auth expresses MFA state as an Authenticator Assurance Level on each session. When an account has a verified factor, BuddyWorkflow steps the session up to aal2 at sign-in before the app is usable.

LevelMeaningWhen it applies
aal1Password only (no verified second factor)Accounts that have not enrolled an authenticator
aal2Password + verified TOTP challenge this sessionAccounts with a verified authenticator — required at every sign-in before the app loads

4. Enrollment Flow

  1. User opens Settings → Security → Two-factor authentication and selects "Add authenticator app."
  2. The app calls supabase.auth.mfa.enroll({ factorType: 'totp' }), returning a QR code and secret. The user scans it into their authenticator app.
  3. The user enters the 6-digit code; it is verified with mfa.challenge() + mfa.verify(). The factor is marked verified only on success.
  4. The session is elevated to aal2 and enrollment is complete. From then on the factor is required at each sign-in.

5. Sign-in & Challenge Flow

6. Recovery & Account Lockout

7. Protection of Plaid & Stripe

Plaid: bank credentials are never seen by BuddyWorkflow — they are entered only inside Plaid Link. Because a verified user reaches the app only from a second-factor-satisfied session, only a strongly-authenticated user can initiate a bank connection or retrieve transactions via a stored Plaid access token.

Stripe: payment and payout configuration is reached only from a signed-in session, and the Stripe Dashboard itself is MFA protected. Webhooks are verified by signature and processed server-side, independent of the user session.

8. Logging & Monitoring

9. Roadmap

This control is referenced in the BuddyWorkflow Information Security Policy (§3, Access Control & Authentication). Questions: bryn@buddyworkflow.com.

More policies
Privacy PolicyInformation SecurityData Retention