Supabase Удалить пользователя из аутентификации, если не удалось создать пользователя в базе данных во время регистрации

Я использую аутентификацию supabase для регистрации, и когда пользователь успешно регистрируется, я вставляю в таблицу «профили» строку, содержащую другие данные пользователя.

Я хочу обработать случай, когда пользователь успешно регистрируется с использованием аутентификации supabase, но не может быть вставлен в таблицу profiles. Если это произойдет, я хочу удалить учетную запись, созданную в auth. Как мне это сделать? Есть ли лучший подход для этого?

"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { createClient } from "@/utils/supabase/server";

export async function register(data: {
  name: string;
  email: string;
  password: string;
}) {
  const supabase = createClient();

  // Auth Sign Up
  const { data: authData, error: authError } = await supabase.auth.signUp({
    email: data.email,
    password: data.password,
    options: {
      data: { displayName: data.name },
    },
  });

  if (authError) return { error: authError.message };

  // Create new User Profile
  const { error } = await supabase.from("profiles").insert({
    id: authData.user?.id,
    email: data.email,
    username: data.name,
    display_name: data.name,
  });

  if (error) {
    // Remove user created in auth
    // How do I do this?

    return { error: error.message };
  }

  revalidatePath("/", "layout");
  redirect("/messages");
}
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
397
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы удалить пользователя, вам необходимо создать экземпляр Supabase с ключом роли службы. С анон ключом не получится. Не раскрывайте свой ключ на стороне клиента.

https://supabase.com/docs/reference/javascript/auth-admin-deleteuser

Вы сказали, что мне не следует раскрывать свой ключ на стороне клиента. Включает ли это действия сервера next.js? Есть ли лучший подход к тому, что я пытаюсь сделать?

Inaara Kalani 10.04.2024 19:12

Да. Ты прав. Когда вы выполняете действия на сервере, методы, которые вы используете из Supabase General, имеют имя Client. Это напоминание нам о том, что оно все еще разоблачено. Лучший подход — использовать краевые функции. Ссылка с примером: blog.mansueli.com/…

blimatech 10.04.2024 21:20

Вы можете использовать свои ключи в действиях сервера в nextjs, поскольку они не будут доступны публично, это совершенно безопасно.

Devon Ray 11.04.2024 13:07

Я думал, что использовать ключ роли службы на стороне сервера небезопасно. Можете ли вы указать мне ссылку на документы? Я читал эту ссылку supabase.com/docs/guides/api/API-keys и там написано «частный сервер».

blimatech 11.04.2024 21:04

Я думаю, что триггер «Create_profile», который запускается после добавления записи в auth.users, связан с созданием пользователя, поэтому, если этот триггер завершится неудачей, весь процесс завершится неудачно. Вы получите сообщение об ошибке во время auth.signup().

Пожалуйста, не удаляйте пользователей из клиента... Это очень плохая идея. Если вам нужно удалить профиль, просто создайте функцию postrgres и выполните ее с сервера.

Я не понял первую часть вашего ответа. Что вы подразумеваете под «Я думаю, что триггер «Create_profile», который запускается после добавления записи в auth.users, связан с созданием пользователя»?

Inaara Kalani 10.04.2024 19:08

Похоже, вы нашли решение, которое я предложил: «Во-вторых, если я все еще хочу иметь таблицу профилей, я могу использовать триггеры supabase, которые автоматически вставят строку в таблицу профилей при создании пользователя через аутентификацию». Триггер и создание пользователя связаны так что, если один из них потерпит неудачу, все они потерпят неудачу.

Supabase Enjoyer 11.04.2024 15:43
Ответ принят как подходящий

Итак, я нашел два решения.

Во-первых, возможно, мне не понадобится создавать таблицу profiles, поскольку я могу хранить все метаданные пользователя в аутентификации: https://supabase.com/docs/guides/auth/managing-user-data#accessing-user-metadata

Во-вторых, если я все еще хочу иметь таблицу profiles, я могу использовать триггеры supabase, которые автоматически вставят строку в таблицу профилей при создании пользователя через аутентификацию. Ссылка: https://supabase.com/docs/guides/auth/managing-user-data#using-triggers

Если я использую триггеры, мне также не нужно писать этот код вручную. В моем супабазовом проекте я перехожу к SQL Editor > Quickstarts > User Management Starters. Это напишет для меня запрос с созданием профиля, политиками и триггерами. Мне просто нужно запустить запрос, и все готово!

Другие вопросы по теме