48 lines
1.5 KiB
Dart
48 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('naver'))) {
|
|
return SocialProvider.naver;
|
|
}
|
|
return null;
|
|
}
|