소셜 로그인 인증 경로 · 세션 전이 · Apple 로그인 콜백 · 인증 테스트
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user