Files
fanuzu/app/lib/features/auth/firebase_auth_session.dart

49 lines
1.5 KiB
Dart

import 'package:firebase_auth/firebase_auth.dart' as fb;
import 'auth.dart';
/// Firebase Auth가 보존한 세션을 앱의 인증 계약으로 변환한다.
///
/// [FirebaseBoot]가 live인 경우에만 생성해야 한다. 설정이 없는 목 모드에서는
/// Firebase 인스턴스에 접근하지 않고 [AuthRepository]에 null 세션을 전달한다.
final class FirebaseAuthSession implements AuthSession {
FirebaseAuthSession({fb.FirebaseAuth? firebaseAuth})
: _firebaseAuth = firebaseAuth ?? fb.FirebaseAuth.instance;
final fb.FirebaseAuth _firebaseAuth;
@override
AuthAccount? get currentAccount => _toAccount(_firebaseAuth.currentUser);
@override
Stream<AuthAccount?> get accountChanges =>
_firebaseAuth.authStateChanges().map(_toAccount);
@override
Future<void> signOut() => _firebaseAuth.signOut();
}
AuthAccount? _toAccount(fb.User? user) {
if (user == null) return null;
return AuthAccount(
uid: user.uid,
provider: _providerOf(user),
displayName: user.displayName,
email: user.email,
);
}
SocialProvider? _providerOf(fb.User user) {
final ids = user.providerData.map((data) => data.providerId).toSet();
if (ids.contains('google.com')) return SocialProvider.google;
if (ids.contains('apple.com')) return SocialProvider.apple;
if (ids.any((id) => id.toLowerCase().contains('kakao'))) {
return SocialProvider.kakao;
}
if (ids.any((id) => id.toLowerCase().contains('line'))) {
return AuthProviderKind.line;
}
if (ids.contains('password')) return AuthProviderKind.email;
return null;
}