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> ) }
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> ) }
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>
Top comments (0)