Flutter를 이용하여 토이프로젝트를 진행할 때 회원가입에 대한 처리를 하기 위해 supabase를 이용하였으며 해당 내용을 글로 정리하기 위함.
supabase에서는 여러가지의 회원가입 방법을 제공해주지만 필자는 이메일을 이용하여 회원가입에 대한 처리를 하였다.
supabase를 이용하여 회원가입을 하는 Process는 아래와 같다.
유저의 정보 입력 ==> 이메일 중복 가입 Validation ==> 회원가입 완료, 사용자의 이메일 검증
유저에가 input으로 받을 정보는 아래와 같다. 회원가입에 필요한 정보들은 이메일, 비밀번호 이 2가지를 필수로 받는다.
추가적으로 사용자의 이름을 입력받아 supabase의 auth.users
테이블에 raw_user_meta_data
에 넣을 것이다. (raw_user_meta_data
에는 추 후 oauth를 이용할 때 유저의 정보들이 이 column
으로 들어온다.)
먼저 구현 된 UI는 아래와 같다.
총 3개의 input을 입력 받도록 하고 form
위젯을 이용하여 validation을 진행한다.
이메일을 이용하여 회원가입을 할 때 사용자의 이메일 검증이 정상적으로 완료되지 않으면 동일한 이메일로 계속해서 회원가입이 진행된다. (비밀번호를 다르게 입력하여도 초반에 입력한 비밀번호는 초기화 되지 않는다.)
즉 같은 이메일로 supabase에서 제공하는 auth.signUp
를 호출해도 별도의 exception
이 존재하지 않는다는 것이다.
// 이 부분을 계속해서 통과한다. signUp이 별도의 exception을 발생시키지 않음.
final response = await onSubmit() async {
final response = await supabase.auth.signUp(
email: email,
password: password,
data: {'full_name': name},
);
// ...
}
github-issue를 보면 이슈가 닫혔다 열렸다를 계속 반복하고 있지만 해당 이슈의 댓글 중 선택한 해결방법은 아래와 같다. (해결방법-댓글)
final isNotExist = response.user?.identities != null;
final isEmptyList = response.user!.identities!.isNotEmpty;
if (isNotExist && isEmptyList) {
// already email exists
}
auth.signUp
을 호출하여 response
를 얻을 수 있으며 response
의 타입은 supabase
에서 제공하는 AuthResponse
타입이다.
response
에는 user
라는 property
가 있고 user
안에 identities
라는 property
가 있다.
결론은 identities
를 이용하여 validation 처리를 할 수 있다.
identities
의 배열이 비어있다. -> 이미 회원가입이 되어있는 User다.identities
의 배열이 비어있지 않다. -> 회원가입이 가능하다.위와 같이 회원가입을 하게 되면 데이터베이스(pg)의 auth.users
테이블에 한 개의 row
가 생성되게 된다.
이 때 생성된 raw_user_meta_data
의 column
을 확인해보면 jsonb
형식으로 데이터가 들어가 있는데 json
데이터 중 key
가 email_verified
인 프로퍼티가 있을 것이다. (이 column
에 회원가입 시 입력받은 이름이 포함되어있다.)
또한 그 값이 false
로 되어 있을텐데 아직 사용자 이메일의 유효성 검증이 통과하지 않았다는 것이다.
해당 값을 true
로 변경하기 위해서는 유저가 회원가입 시 입력한 이메일의 메일함에서 컨펌 이메일의 링크를 클릭하면 된다.
추가로 이메일이 검증되어 있지 않은 상태로 로그인을 시도하면 Email not confirmed
에러 메세지를 확인할 수 있다.
컨펌이메일은 아래와 같으며 auth.signUp
이 호출되면 발송된다.
회원가입시 컨펌 이메일을 발송하는데 별도의 SMTP 서버를 supabase에 정의하지 않으면 발송제한이 있다.
때문에 추가로 SMTP 서버를 제공하여 사용하는 것을 추천한다. 이 내용에 관련되서는 이전 글에 작성해두었다.
SMTP를 설정하면 컨펌 메일을 발송하는 것에 대해 편안함을 느낄 수 있을 것이다.