Я использую аутентификацию 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");
}
Чтобы удалить пользователя, вам необходимо создать экземпляр Supabase с ключом роли службы. С анон ключом не получится. Не раскрывайте свой ключ на стороне клиента.
https://supabase.com/docs/reference/javascript/auth-admin-deleteuser
Да. Ты прав. Когда вы выполняете действия на сервере, методы, которые вы используете из Supabase General, имеют имя Client. Это напоминание нам о том, что оно все еще разоблачено. Лучший подход — использовать краевые функции. Ссылка с примером: blog.mansueli.com/…
Вы можете использовать свои ключи в действиях сервера в nextjs, поскольку они не будут доступны публично, это совершенно безопасно.
Я думал, что использовать ключ роли службы на стороне сервера небезопасно. Можете ли вы указать мне ссылку на документы? Я читал эту ссылку supabase.com/docs/guides/api/API-keys и там написано «частный сервер».
Я думаю, что триггер «Create_profile», который запускается после добавления записи в auth.users, связан с созданием пользователя, поэтому, если этот триггер завершится неудачей, весь процесс завершится неудачно. Вы получите сообщение об ошибке во время auth.signup().
Пожалуйста, не удаляйте пользователей из клиента... Это очень плохая идея. Если вам нужно удалить профиль, просто создайте функцию postrgres и выполните ее с сервера.
Я не понял первую часть вашего ответа. Что вы подразумеваете под «Я думаю, что триггер «Create_profile», который запускается после добавления записи в auth.users, связан с созданием пользователя»?
Похоже, вы нашли решение, которое я предложил: «Во-вторых, если я все еще хочу иметь таблицу профилей, я могу использовать триггеры supabase, которые автоматически вставят строку в таблицу профилей при создании пользователя через аутентификацию». Триггер и создание пользователя связаны так что, если один из них потерпит неудачу, все они потерпят неудачу.
Итак, я нашел два решения.
Во-первых, возможно, мне не понадобится создавать таблицу 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
. Это напишет для меня запрос с созданием профиля, политиками и триггерами. Мне просто нужно запустить запрос, и все готово!
Вы сказали, что мне не следует раскрывать свой ключ на стороне клиента. Включает ли это действия сервера next.js? Есть ли лучший подход к тому, что я пытаюсь сделать?