I'm trying to reset the password of an already registered user, which is currently not authenticated. I wrote a simple Python script which is based on:
- defining a supabase client object
- sending a reset link to the inserted email
- verifying the token from the received link
- updating the user password
Here is the code:
import os
from supabase import create_client, Client
from dotenv import load_dotenv
load_dotenv()
# method to return the supabase client object from the .env file
# the object will be used to carry out authentication requests
def get_supabase_object() -> Client:
url: str = os.environ["SUPABASE_URL"]
key: str = os.environ["SUPABASE_KEY"]
supabase: Client = create_client(url, key)
return supabase
def send_reset_link(supabase: Client):
try:
email = input("Please insert your email\n")
resp = supabase.auth.reset_password_for_email(
email,
)
print("RESP=")
print(resp)
print("\nIf your email is already registered, you will receive a password reset email! Please check your inbox.\n")
except Exception as e:
print("Failed to send reset email: ", str(e), "\n")
def update_password(supabase: Client):
try:
link = input("Please paste the link you received via email\n")
email = input("Please insert your email\n")
password = input("Please insert your new password\n")
# Extract token from the link
token = link.split("token=")[1].split("&type")[0]
print("TOKEN = ",token)
if not token:
raise ValueError("Invalid link. No token found.")
# Use the token to sign in temporarily (session for recovery)
resp_1 = supabase.auth.verify_otp({
"email": email,
"type": "recovery",
"token": token,
})
print("RESP_1=")
print(resp_1)
print("\n")
# Now update the password
resp_2 = supabase.auth.update_user({
"password": password
})
print("RESP_2=")
print(resp_2)
print("\n")
print("Password updated successfully\n")
except Exception as e:
print("Failed to update password: ", str(e), "\n")
supabase: Client = get_supabase_object()
print(supabase)
print("\n\n")
send_reset_link(supabase)
update_password(supabase)
Once I run the code, I receive a reset link in this format:
"https://ABC.supabase.co/auth/v1/verify?token=XYZ&type=recovery&redirect_to=http://localhost:3000"
Using print() logging, I verified that the token was correctly extracted. However, after having inserted the new password, I get this exception:
Please insert your new password
****** (censored)
TOKEN = ***************************************************** (censored)
Failed to update password: Token has expired or is invalid
What I am missing?