user.delete() 또는 signOut()만 해도 실제 구글 계정에서는 앱 연결이 유지됨.구글 로그인할 때 GoogleSignInAccount로부터 accessToken을 획득,
이후 아래 API로 연동 해제 요청
GET https://accounts.google.com/o/oauth2/revoke?token={access_token}
성공 시, 앱과 계정의 연결이 실제로 끊김
실제로 연결이 끊겼는지 확인 필요
FirebaseAuth.instance.currentUser?.delete()
Future<void> deleteGoogleAccount() async {
// 1. Firestore 데이터 삭제 (이미 구현됨)
// 2. accessToken으로 revoke
final googleAccessToken = await getGoogleAccessToken();
if (googleAccessToken != null) {
await revokeGoogleToken(googleAccessToken); // 성공/실패 무관 진행
}
// 3. Firebase 계정 삭제
final user = FirebaseAuth.instance.currentUser;
if (user != null) {
try {
await user.delete();
} on FirebaseAuthException catch (e) {
// recent-login error 처리 필요 (reauthenticate)
if (e.code == 'requires-recent-login') {
// 재로그인 안내 or 자동 signOut
}
}
}
// 4. SharedPreferences/Provider 초기화
await signOut();
}
unlink API 호출kakao_flutter_sdk_user의UserApi.instance.unlink() 메서드 사용Future<void> deleteKakaoAccount() async {
// 1. Firestore 데이터 삭제 (이미 구현됨)
// 2. 카카오 연동 해제
try {
await UserApi.instance.unlink();
} catch (e) {
// 이미 해제된 상태이거나, 에러 무시
}
// 3. (필요 시) Firebase 계정 삭제
final user = FirebaseAuth.instance.currentUser;
if (user != null) {
try {
await user.delete();
} on FirebaseAuthException catch (e) {
if (e.code == 'requires-recent-login') {
// 재로그인 안내 or 자동 signOut
}
}
}
// 4. SharedPreferences/Provider 초기화
await signOut();
}
| 순서 | 공통 단계 | Kakao | |
|---|---|---|---|
| 1 | Firestore 데이터 삭제 | O | O |
| 2 | 계정 연동 해제 | access_token으로 revoke API 호출 | UserApi.instance.unlink() 호출 |
| 3 | Firebase Auth 삭제 | currentUser.delete() | currentUser.delete() (연동 시만) |
| 4 | 앱 내 세션/캐시 삭제 | signOut(), SharedPreferences.clear() 등 | signOut(), SharedPreferences.clear() 등 |
애플 계정 탈퇴 같은 경우는 제대로 구현하지 못함. 추후 작성
Google:
revoke 요청이 400 에러(토큰 만료)여도, 어차피 Firebase 계정 삭제는 별도이므로 무시 가능currentUser.delete()에서 requires-recent-login 발생 시 반드시 재로그인 요구Kakao:
UserApi.instance.unlink()가 실패해도, 이미 해제된 계정이면 무시공통:
최초 “Apple로 로그인” 시
이미 연동된 앱에 재로그인
즉, “동의 항목”은 최초 1회만 물어봅니다. 연동 해제 후 재로그인에서도, Apple 계정 입장에서는 ‘이전에 이 앱에 권한을 부여했었는지’만 체크해서 이미 부여했다면 추가 동의를 요구하지 않습니다.
Apple로 로그인 연동 해제 → 다시 로그인
Apple은 동의항목을 “최초 1회”만 묻고, 그 이후에는 재로그인 시 따로 안 묻는 것이 정상 동작
Future<void> deleteUserAccount(String provider) async {
// 1. Firestore 데이터 삭제 (공통)
await deleteAllUserDataFromFirestore();
// 2. 각 SNS 별 연동 해제
if (provider == 'google') {
final googleAccessToken = await getGoogleAccessToken();
if (googleAccessToken != null) {
await revokeGoogleToken(googleAccessToken);
}
} else if (provider == 'kakao') {
try {
await UserApi.instance.unlink();
} catch (_) {}
}
// 3. Firebase Auth 삭제
final user = FirebaseAuth.instance.currentUser;
if (user != null) {
try {
await user.delete();
} on FirebaseAuthException catch (e) {
if (e.code == 'requires-recent-login') {
// 재로그인 필요
}
}
}
// 4. 앱 세션 초기화
await signOut();
}