Aha! Builder authentication methods (Password, Aha!, Google, GitHub, Microsoft, Okta/SAML) can only be toggled at the application level — there is no per-user control over which sign-in method a given user is allowed to use.
The current-user API (currentUser() / getCurrentUser(), client and server) exposes no signal for how the current session authenticated — there is no authMethod, identityProvider, ssoProvider, or equivalent field, and no session-level metadata anywhere in the framework's auth API. So an app can't even detect, let alone enforce, which method a user signed in with.
The built-in Password method supports no MFA/2FA (no TOTP, no MFA parameters on user creation or password update).
Regulated / enterprise deployments can't reconcile two required goals: SSO-only + MFA for all normal users, and a password-based break-glass account for continued admin access during an SSO/IdP (e.g., Okta) outage. Enabling Password opens it to everyone (weakening the security posture); disabling it removes the break-glass path — there's no middle ground.
Because app code can't read the session's auth method, teams cannot build the missing control themselves in-app; the platform gives them nothing to enforce on.
The lack of native MFA on the Password method fails common compliance requirements outright, pushing teams to non-standard workarounds (e.g., external, non-federated accounts) or blocking production go-live entirely.
Add per-user authentication-method control in Builder — a per-user setting (in the app's user admin / Builder Users) for allowed sign-in methods, at minimum a simple "allow password sign-in" on/off flag, so admins can keep everyone SSO-only while permitting password for a controlled few (e.g., a break-glass account).
And/or expose the current session's authentication method / identity provider on the current-user object (e.g., getCurrentUser().authMethod / .identityProvider with values like password | saml | aha | google | microsoft), so application code can enforce its own auth policy and audit sign-ins.
Add native MFA/2FA (TOTP) support for the Password method, so a password-permitted account can still meet MFA requirements.
Any one of these three unblocks a compliant "SSO-only with a hardened break-glass" model; together they give app owners full control over authentication posture.
Thanks for submitting this idea! We have implemented the second option described – adding authMethod, currentIdentityProviderId, and identities properties to the user object.
The type definitions are:
type RecordId = `${number}`; // Big integer, it's a string to avoid precision loss in JavaScript
type ProviderType = 'aha' | 'aha_oauth' | 'google' | 'microsoft' | 'github' | 'saml';
type AuthMethod = 'password' | ProviderType;
interface User {
authMethod?: AuthMethod | null; // existing sessions will be null
currentIdentityProviderId?: RecordId | null;
identities?: UserIdentity[];
}
interface UserIdentity {
providerType: ProviderType;
identityProviderId: RecordId | null;
identityProviderName: string | null;
lastUsedAt: string | null;
}We'll keep this idea open to collect votes on the other two suggested approaches included here too!