Authenticate Neon Postgres application users with Auth0
Learn how to add authentication to a Neon Postgres database application using Auth0
User authentication is an essential part of most web applications. Modern apps often require features like social login, multi-factor authentication, and secure user data management that complies with privacy regulations.
Auth0 is an authentication and authorization platform that provides these features out of the box. It offers SDKs for popular web frameworks, making it straightforward to integrate with your application backed by a Neon Postgres database.
In this guide, we'll walk through setting up a simple Next.js application using Neon Postgres as the database, and add user authentication using Auth0. We will cover how to:
- Set up a Next.js project with Auth0 for authentication
- Create a Neon Postgres database and connect it to your application
- Define a database schema using Drizzle ORM and generate migrations
- Store and retrieve user data associated with Auth0 user IDs
Prerequisites
To follow along with this guide, you will need:
- A Neon account. If you do not have one, sign up at Neon. Your Neon project comes with a ready-to-use Postgres database named
neondb
. We'll use this database in the following examples. - An Auth0 account for user authentication. Auth0 provides a free plan to get started.
- Node.js and npm installed on your local machine. We'll use Node.js to build and test the application locally.
Initialize your Next.js project
We will create a simple web app that lets you add a favorite quote to the home page, and edit it afterward. Run the following command in your terminal to create a new Next.js
project:
Now, navigate to the project directory and install the required dependencies:
We use the @neondatabase/serverless
package as the Postgres client, and drizzle-orm
, a lightweight typescript ORM, to interact with the database. @auth0/nextjs-auth0
is the Auth0 SDK for Next.js applications. We also use dotenv
to manage environment variables and the drizzle-kit
CLI tool for generating database migrations.
Also, add a .env.local
file to the root of your project, which we'll use to store Neon/Auth0 connection parameters:
note
At the time of this post, the @auth0/nextjs-auth0
package caused import errors related to one of its dependencies (oauth4webapi
). To stop Next.js from raising the error, add the following to your nextjs.config.mjs
file:
Now, we can start building the application.
Setting up your Neon database
Initialize a new project
- Log in to the Neon console and navigate to the Projects section.
- Select an existing project or click the New Project button to create a new one.
- Choose the desired region and Postgres version for your project, then click Create Project.
Retrieve your Neon database connection string
Navigate to the Connection Details section to find your database connection string. It should look similar to this:
Add this connection string to the .env.local
file in your Next.js project.
Configuring Auth0 for authentication
Create an Auth0 application
- Log in to your Auth0 account and navigate to the Dashboard. From the left sidebar, select
Applications > Create Application
to create a new app. - In the dialog that appears, provide a name for your application, select
Regular Web Applications
as the application type, and clickCreate
.
Configure Auth0 application settings
- In the
Settings
tab of your Auth0 application, scroll down to theApplication URIs
section. - Set the
Allowed Callback URLs
tohttp://localhost:3000/api/auth/callback
for local development. - Set the
Allowed Logout URLs
tohttp://localhost:3000
. - Click
Save Changes
at the bottom of the page.
Retrieve your Auth0 domain and client ID
From the Settings
tab of your Auth0 application, copy the Domain
and Client ID
values. Add these to the .env.local
file in your Next.js project:
Replace YOUR_AUTH0_DOMAIN
, YOUR_AUTH0_CLIENT_ID
and YOUR_AUTH0_CLIENT_SECRET
with the actual values from your Auth0 application settings.
Run the following command in your terminal to generate a random 32-byte value for the AUTH0_SECRET
variable:
Implementing the application
Define your database connection and schema
Create a db
folder inside the app/
directory. This is where we'll define the database schema and connection code.
Now, add the file app/db/index.ts
with the following content:
This exports a db
instance that we can use to execute queries against the Neon database.
Next, create a schema.ts
file inside the app/db
directory to define the database schema:
This schema defines a table user_messages
to store a message for each user, with the user_id
provided by Auth0 as the primary key.
Generate and run migrations
We'll use the drizzle-kit
CLI tool to generate migrations for the schema we defined. To configure how it connects to the database, add a drizzle.config.ts
file at the project root.
Now, generate the migration files by running the following command:
This will create a drizzle
folder at the project root with the migration files. To apply the migration to the database, run:
The user_messages
table will now be visible in the Neon console.
Configure Auth0 authentication
We create a dynamic route
to handle the Auth0 authentication flow. Create a new file app/api/auth/[auth0]/route.ts
with the following content:
This sets up the necesssary Auth0 authentication routes for the application at the /api/auth/auth0/*
endpoints - login
, logout
, callback
(to redirect to after a successful login), and me
(to fetch the user profile).
Next, we will wrap the application with the UserProvider
component from @auth0/nextjs-auth0
, so all pages have access to the current user context. Replace the contents of the app/layout.tsx
file with the following:
Add interactivity to the application
Our application has a single page that lets the logged-in user store their favorite quote and displays it. We implement Next.js
server actions to handle the form submission and database interaction.
Create a new file at app/actions.ts
with the following content:
The createUserMessage
function inserts a new message into the user_messages
table, while deleteUserMessage
removes the message associated with the current user.
Next, we implement a minimal UI to interact with these functions. Replace the contents of the app/page.tsx
file with the following:
This implements a form with a single text field that lets the user input a quote, and submit it, whereby it gets stored in the database, associated with their Auth0
user ID. If a quote is already stored, it displays the quote and provides a button to delete it.
The getSession
function from @auth0/nextjs-auth0/edge
provides the current user's session information, which we use to interact with the database on their behalf. If the user is not authenticated, the page displays a login button instead.
Running the application
To start the application, run the following command:
This will start the Next.js development server. Open your browser and navigate to http://localhost:3000
to see the application in action. When running for the first time, you'll be prompted to log in with Auth0. By default, Auth0 provides email and Google account as login options.
Once authenticated, you'll be able to visit the home page, add a quote, and see it displayed.
Conclusion
In this guide, we walked through setting up a simple Next.js application with user authentication using Auth0 and a Neon Postgres database. We defined a database schema using Drizzle ORM, generated migrations, and interacted with the database to store and retrieve user data.
Next, we can add more routes and features to the application. The UserProvider
component from @auth0/nextjs-auth0
provides the user context to each page, allowing you to conditionally render content based on the user's authentication state.
To view and manage the users who authenticated with your application, you can navigate to the Auth0 Dashboard and click on User Management > Users in the sidebar. Here, you can see the list of users who have logged in and perform any necessary actions for those users.
Source code
You can find the source code for the application described in this guide on GitHub.
Resources
For more information on the tools used in this guide, refer to the following documentation:
Need help?
Join our Discord Server to ask questions or see what others are doing with Neon. Users on paid plans can open a support ticket from the console. For more detail, see Getting Support.