PhxAuthPlus

Complete email + password authentication generator for Phoenix 1.8+.

Phoenix 1.8 replaced mix phx.gen.auth with a magic-link-only generator. PhxAuthPlus restores the full email + password experience — registration, login, password reset, account confirmation, "remember me", and settings — while using modern Igniter-based code generation.

Installation

Add to your mix.exs:

def deps do
[
{:phx_auth_plus, "~> 0.1", only: [:dev], runtime: false}
]
end

Quick start

mix deps.get
mix phx_auth_plus.gen.auth Accounts User users

Then:

mix ecto.migrate
mix phx.server

Visit http://localhost:4000/users/register.

Generated features

FeatureDescription
RegistrationEmail + password signup with validation
Login / LogoutSession-based with "remember me" cookie
Password resetForgot password flow with email token
Account confirmationEmail verification with token
SettingsChange password and email (with confirmation)
Session trackingAll sessions stored in DB, invalidated on password change

Usage

# Default: LiveView UI, bcrypt on Unix / pbkdf2 on Windows
mix phx_auth_plus.gen.auth Accounts User users
# Controller-only UI (no LiveView)
mix phx_auth_plus.gen.auth Accounts User users --no-live
# Use argon2 hashing
mix phx_auth_plus.gen.auth Accounts User users --hashing-lib argon2
# Use binary UUID keys
mix phx_auth_plus.gen.auth Accounts User users --binary-id
# Custom table name
mix phx_auth_plus.gen.auth Accounts User users --table app_users
# Custom web module
mix phx_auth_plus.gen.auth Accounts User users --web MyAppWeb

Options

OptionDefaultDescription
--hashing-libbcrypt (Unix) / pbkdf2 (Windows)Password hashing library
--livetrueGenerate LiveView auth pages
--no-liveGenerate controller-based auth pages
--binary-idfalseUse binary UUID primary keys
--webMyAppWebWeb module name
--context-appapp nameContext app (umbrella projects)
--tableplural argDatabase table name

Generated files

lib/my_app/accounts/
├── user.ex # User schema with changesets
├── user_token.ex # Token schema (session, reset, confirm, change email)
└── user_notifier.ex # Email notification delivery
lib/my_app_web/
├── user_auth.ex # Auth plug + LiveView hooks
# With --live (default):
└── user_auth/
├── login_live.ex
├── registration_live.ex
├── settings_live.ex
├── forgot_password_live.ex
├── reset_password_live.ex
└── confirmation_live.ex
# With --no-live:
└── controllers/
├── user_session_controller.ex
├── user_registration_controller.ex
├── user_settings_controller.ex
├── user_reset_password_controller.ex
└── user_confirmation_controller.ex
priv/repo/migrations/
└── *_create_users_auth_tables.exs

Routes

PathMethodDescription
/users/registerGET/POSTRegistration
/users/log_inGET/POSTLogin
/users/log_outDELETELogout
/users/reset_passwordGET/POSTRequest password reset
/users/reset_password/:tokenGET/PUTReset password with token
/users/confirmGET/POSTResend confirmation
/users/confirm/:tokenGETConfirm account
/users/settingsGET/PUTSettings (auth required)
/users/settings/confirm_email/:tokenGETConfirm email change

Token validity

Token typeContextValidity
Sessionsession60 days
Reset passwordreset_password1 day
Confirm accountconfirm7 days
Change emailchange:{old_email}7 days

Email delivery

The generated UserNotifier logs emails to the console by default. To send real emails, configure a Swoosh mailer and replace the deliver/2 function body in user_notifier.ex.

License

MIT