Skip to main content
This tutorial covers how to create full-stack Web3 authentication for the Phantom wallet, using the popular NextJS framework.

Introduction

This tutorial shows you how to create a NextJS application that lets users log in using their Phantom wallet. After Web3 wallet authentication, the next-auth library creates a session cookie with an encrypted JWT (JWE) stored inside. It contains session info (such as an address, signed message, and expiration time) in the user’s browser. It’s a secure way to store users’ info without a database, and it’s impossible to read/modify the JWT without a secret key. Once the user is logged in, they will be able to visit a page that displays all their user data.
You can find the final dapp with implemented style on our GitHub.

Prerequisites

  1. Create a Moralis account.
  2. Install and set up Visual Studio.
  3. Create your NextJS dapp (you can create it using create-next-app or follow the NextJS dapp tutorial).

Install the Required Dependencies

  1. Install @moralisweb3/next (if not installed), next-auth and @web3uikit/core dependencies:
npm2yarn
  1. To process data like the signature of a Solana Web3 wallet (e.g., Phantom), we need the bs58 package to encode and decode data from the wallet. Let’s install the bs58 package:
npm2yarn
  1. Add new environment variables in your .env.local file in the app root:
  • APP_DOMAIN: RFC 4501 DNS authority that is requesting the signing.
  • MORALIS_API_KEY: You can get it here.
  • NEXTAUTH_URL: Your app address. In the development stage, use http://localhost:3000.
  • NEXTAUTH_SECRET: Used for encrypting JWT tokens of users. You can put any value here or generate it on https://generate-secret.now.sh/32. Here’s an .env.local example:
.env.local
Keep your NEXTAUTH_SECRET value in secret to prevent security problems.

Every time you modify the .env.local file, you need to restart your dapp.

Wrapping App with SessionProvider

  1. Create the pages/_app.jsx file. We need to wrap our pages with SessionProvider (docs):
NextJS uses the App component to initialize pages. You can override it and control the page initialization. Check out the NextJS docs.

Configure Next-Auth and MoralisNextAuth

  1. Create a new file, pages/api/auth/[...nextauth].ts, with the following content:
  1. Add an authenticating config to the pages/api/moralis/[...moralis].ts:
[...moralis].ts

Create Wallet Component

  1. Create a new file under app/components/loginBtn/phantomBtn.tsx:
phantomBtn.tsx

Create Page to Sign-In

  1. Create a new page file, pages/index.jsx, with the following content:
  • You can get the app CSS from GitHub to style the app.

Logout and User Profile Component

  1. Create components to perform the logout operation and to show the user data.
logoutBtn.js

Showing the User Profile

  1. Let’s create a user.jsx page to view user data when the user is logged in.

Testing with Phantom Wallet

Visit http://localhost:3000 to test the authentication.
  1. Click on the Select Wallet button to select and connect to wallet
  2. Connect to the Solana wallet extension
  3. Sign the message
  4. After successful authentication, you will be redirected to the /user page
And that completes the authentication process to Solana wallet using Phantom Wallet.