Use this file to discover all available pages before exploring further.
Before you start
You need:
An Auth0 development tenant with Universal Login configured.
A custom-domain-configured application.
A development app or a sample app (like the React sample app) running on your localhost
A database connection that uses passwords.
By the end of this guide, you’ll have an identity-first flow with a customized Login screen. To learn more, read the Getting Started guide and visit the SDK reference guide.
In your , set up Universal Login, Identifier First Authentication, and a Database Connection that uses passwords.Run a single-page application to build custom login screens. To understand the context for Advanced Customizations interfaces, clone our boilerplate app: git clone https://github.com/auth0-samples/auth0-acul-samplesInstall the ACUL SDK. After cloning the react boilerplate, change the directory to the auth0-acul-samples folder and install the SDK.
# Clone the ACUL sample application into the root folder of your projectgit clone https://github.com/auth0-samples/auth0-acul-samples.git# Change directory to install the ACUL sample application cd auth0-acul-samples && npm i
This example uses Shadcn components. Run the shadcn init command to set up your project. After answering a few questions to configure components.json, begin adding components to your project. Your completed Build Login with Password flow will use button, label, input, text, link, CardHeader, CardTitle, CardDescription, and CardContent components.
npx shadcn@latest initnpx shadcn@latest add button input label text link card
In the auth0-acul-samples/src folder, create a folder called screens and a file called Login.tsx. Import the SDK and in the React component initialize the SDK for the screen.
import { Login as ScreenProvider } from "@auth0/auth0-acul-js";export default function Login() { // Initialize the SDK for this screen const screenProvider = new ScreenProvider(); ... }
Using the SDK, submit the data captured in the screen to the server. The server process this data and will route the user to the next step in the flow. If there are errors, this screen is reloaded, allowing you to display them to the user. Errors are accessed from the SDK.
const formSubmitHandler = (event: ChangeEvent<HTMLFormElement>) => { event.preventDefault(); // grab the value from the form const identifierInput = event.target.querySelector( "input#identifier" ) as HTMLInputElement; // Call the SDK screenProvider.login({ username: identifierInput?.value }); };