DEV Community

Cover image for Password Reset Page with Supabase and Next.js
Vince Lwt for Lunary

Posted on • Edited on

Password Reset Page with Supabase and Next.js

In this tutorial, we will create a password reset page using Supabase and Next.js.

We will create two pages: one for requesting a password reset and another for updating the password.

Step 1: Setting up the Request Password Reset Page

First, let's create a page where users can request a password reset. We'll call this page request-reset.tsx.

import { useState } from "react" import { useSessionContext } from "@supabase/auth-helpers-react" export default function PasswordReset() { const [loading, setLoading] = useState(false) const [email, setEmail] = useState("") const { supabaseClient } = useSessionContext() async function handlePasswordReset(e) { e.preventDefault() setLoading(true) const { error } = await supabaseClient.auth.resetPasswordForEmail(email, { redirectTo: `${window.location.origin}/update-password`, }) if (error) { alert("Error: ", error.message) } else { alert("Password reset email sent.") } setLoading(false) } return ( <div> <h1>Forgot password</h1>  <form onSubmit={handlePasswordReset}> <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Your email" /> <button type="submit" disabled={loading}> Submit </button>  </form>  </div>  ) } 
Enter fullscreen mode Exit fullscreen mode

By using supabaseClient.auth.resetPasswordForEmail, we instruct Supabase to send a password reset email with a link to our second page.

Step 2: Setting up the Update Password Page

Next, let's create a page where users can update their password after they have received the password reset email. We'll call this page update-password.tsx.

import { useState } from "react" import { useSessionContext, useUser } from "@supabase/auth-helpers-react" import Router from "next/router" export default function UpdatePassword() { const [loading, setLoading] = useState(false) const [password, setPassword] = useState("") const { supabaseClient } = useSessionContext() const handlePasswordReset = async (e) => { e.preventDefault() setLoading(true) const { error } = await supabaseClient.auth.updateUser({ password }) if (error) { alert("Error: ", error.message) } else { alert("Password updated successfully") // Redirect your user to the app Router.push("/") } setLoading(false) } return ( <div> <h1>Reset password</h1>  <form onSubmit={handlePasswordReset}> <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} placeholder="New password" /> <button type="submit" disabled={loading}> Submit </button>  </form>  </div>  ) } 
Enter fullscreen mode Exit fullscreen mode

And that's it! You've got a basic password reset logic using Supabase and Next.js.

You can now add the link to /request-reset on your login page:

<Link href="/request-reset"> Forgot password? </Link> 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)