Приложение Flet для управления учетной записью Supabase: невозможно сбросить пароль для уже зарегистрированного адреса эPython

Программы на Python
Anonymous
Приложение Flet для управления учетной записью Supabase: невозможно сбросить пароль для уже зарегистрированного адреса э

Сообщение Anonymous »

Я разработал простой пользовательский интерфейс аутентификации (вход в систему, регистрацию и сброс пароля) для приложения Flet, используя Supabase в качестве серверной части для управления пользователями. Точка входа приложения — это основная функция, которая настраивает клиент Supabase, создает экземпляры страниц/представлений и настраивает маршрутизацию.

Код: Выделить всё

def main(page: ft.Page):
theme = ft.Theme()
theme.page_transitions.macos = ft.PageTransitionTheme.NONE
page.theme = theme
page.bgcolor="#202020"

supabase: Client = get_supabase_object()
create: ft.View = CreatePage(page, supabase)
login: ft.View = LogInPage(page, supabase)
reset_password: ft.View = ResetPasswordPage(page, supabase)
update_password: ft.View = UpdatePasswordPage(page, supabase)
main_view: MainPage = MainPage(page, supabase)

# router method
def route_change (route)-> None:
page.views.clear()

if page.route == create.route:
page.views.append(create)
if page.route == login.route:
page.views.append(login)
if page.route == reset_password.route:
page.views.append(reset_password)
if page.route == update_password.route:
page.views.append(update_password)
if page.route == main_view.route:
page.views.append(main_view)

page.update()

page.on_route_change = route_change
page.go(create.route)
Приложение запускается на странице регистрации. Пользователи могут зарегистрироваться или войти в систему. Если регистрация действительна, пользователи перенаправляются на страницу входа. После входа в систему пользователи видят главную страницу и могут выйти из системы. На странице входа пользователи также могут сбросить пароль своей учетной записи: класс реализует простой пользовательский интерфейс с TextField для вставки электронного письма и кнопкой для перенаправления на страницу обновления пароля. Обратите внимание на аргумент перенаправления в методе reset_password_for_email(). Я должен указать, что я добавил этот URL-адрес перенаправления в авторизованные URL-адреса перенаправления моей учетной записи Supabase.

Код: Выделить всё

class ResetPasswordPage(ft.View):
def __init__(self, page: ft.Page, supabase: Client) -> None:
super().__init__(
route="/reset_password",
vertical_alignment="center",
horizontal_alignment="center",
)
self.page = page
self.supabase = supabase
self.body = Body(
title="Supabase - Reset Password",
btn_name = "Reset password",
function = self.reset_password,
contains_password=False,
)
self.controls = [self.body]

def reset_password(self, event=None) -> None:
email = self.body.email.value

if email:
try:
self.supabase.auth.reset_password_for_email(email, {"redirect_to": "http://localhost:3000/update_password"},)
show_snackbar(self.page, "Password reset email sent! Please check your inbox.", color="#55a271")
except Exception as e:
show_snackbar(self.page, f"Failed to send reset email: {str(e)}", color="#e57373")
else:
show_snackbar(self.page, "Please insert your email", color="#e57373")
Наконец, класс UpdatePasswordPage имеет простой пользовательский интерфейс, который отображает текстовое сообщение независимо от того, успешно распознан токен или нет.

Код: Выделить всё

class UpdatePasswordPage(ft.View):
def __init__(self, page: ft.Page, supabase: Client) -> None:
super().__init__(
route="/update_password",
vertical_alignment="center",
horizontal_alignment="center",
)
self.page = page
self.supabase = supabase

# Estrai il token dalla query string
self.token = self.page.route.split("?token=")[1] if "?token=" in self.page.route else None

if self.token:
print(self.token)
self.controls = [ft.Text("Valid token.")]
else:
self.controls = [ft.Text("Invalid or expired token.")]

########################################
########################################
# AT THIS TIME, IMPLEMENTED BUT NOT USED
########################################
########################################
def update_password(self, event=None) -> None:
new_password = self.controls[1].value
if self.token:
try:
# Usa Supabase per aggiornare la password con il token
self.supabase.auth.update_user(self.token, password=new_password)
show_snackbar(self.page, "Password updated successfully!")

self.page.route = "/login"
except Exception as e:
show_snackbar(self.page, f"Error: {e}")
else:
show_snackbar(self.page, "Invalid token!")
Даже если я установил порт с помощью

Код: Выделить всё

ft.app(target=main, port=3000, view=ft.AppView.WEB_BROWSER)
Мне нужно запустить приложение с помощью этой команды:

Код: Выделить всё

flet run -w --port 3000 projectName
что гарантирует запуск его как веб-страницы с правильным предопределенным портом.
Проблема связана с этапом перенаправления. Как только пользователь на странице входа в систему нажимает на кнопку сброса пароля, страница обновления пароля появляется менее чем на секунду (на самом деле я видел только изменение URL-адреса), и я сразу же перенаправляюсь на первую страницу (страницу регистрации) без каких-либо ошибок или исключений. Кажется, у меня нет прав доступа к странице обновления. Более того, я проверяю, что токен, отправленный по электронной почте, правильно извлечен из URL-адреса (распечатайте его в консоли). Чего мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/797 ... -already-r

Вернуться в «Python»