fix(authentication): make sur access token is available on every steps

This commit is contained in:
Hugo Pointcheval 2023-02-08 16:09:26 +01:00
parent b83275aaf6
commit eb4ae834c1
Signed by: hugo
GPG Key ID: 3AAC487E131E00BC
3 changed files with 26 additions and 34 deletions

View File

@ -27,7 +27,7 @@ class ExampleSignInCubit extends SignInCubit<int> {
@override
FutureOrResult<int?> onSignInWithEmailAndPassword(
Result<Account, AppException> result, WyattForm form) {
print('onSignInWithEmailAndPassword');
print('onSignInWithEmailAndPassword: ${result.ok?.accessToken}');
return const Ok(1);
}

View File

@ -72,11 +72,15 @@ class AuthenticationFirebaseDataSourceImpl<Data>
return;
}
Account _addToStream(
Future<Account> _addToCredentialStream(
UserCredential userCredential,
AuthenticationChangeEvent Function(Account account) eventBuilder,
) {
final account = AccountModel.fromFirebaseUserCredential(userCredential);
) async {
final currentUser = _firebaseAuth.currentUser;
final jwt = await currentUser?.getIdToken(true);
final account = AccountModel.fromFirebaseUserCredential(
userCredential,
accessToken: jwt,
);
_latestCredentials.add(userCredential);
@ -114,12 +118,7 @@ class AuthenticationFirebaseDataSourceImpl<Data>
password: password,
);
return _addToStream(
userCredential,
(account) => SignedUpEvent(
account: account,
),
);
return _addToCredentialStream(userCredential);
} on FirebaseAuthException catch (e) {
throw SignUpWithEmailAndPasswordFailureFirebase.fromCode(e.code);
} catch (_) {
@ -139,12 +138,7 @@ class AuthenticationFirebaseDataSourceImpl<Data>
password: password,
);
return _addToStream(
userCredential,
(account) => SignedInEvent(
account: account,
),
);
return _addToCredentialStream(userCredential);
} on FirebaseAuthException catch (e) {
throw SignInWithEmailAndPasswordFailureFirebase.fromCode(e.code);
} catch (_) {
@ -158,12 +152,7 @@ class AuthenticationFirebaseDataSourceImpl<Data>
try {
final userCredential = await _firebaseAuth.signInAnonymously();
return _addToStream(
userCredential,
(account) => SignedInEvent(
account: account,
),
);
return _addToCredentialStream(userCredential);
} on FirebaseAuthException catch (e) {
throw SignInAnonymouslyFailureFirebase.fromCode(e.code);
} catch (_) {
@ -191,12 +180,7 @@ class AuthenticationFirebaseDataSourceImpl<Data>
final userCredential =
await _firebaseAuth.signInWithCredential(credential);
return _addToStream(
userCredential,
(account) => SignedInEvent(
account: account,
),
);
return _addToCredentialStream(userCredential);
} on FirebaseAuthException catch (e) {
throw SignInWithGoogleFailureFirebase.fromCode(e.code);
} catch (_) {
@ -248,7 +232,11 @@ class AuthenticationFirebaseDataSourceImpl<Data>
throw Exception(); // Get caught just after.
}
final account = AccountModel.fromFirebaseUser(_firebaseAuth.currentUser);
final jwt = await _firebaseAuth.currentUser?.getIdToken(true);
final account = AccountModel.fromFirebaseUser(
_firebaseAuth.currentUser,
accessToken: jwt,
);
return account;
} on FirebaseAuthException catch (e) {

View File

@ -21,8 +21,9 @@ import 'package:wyatt_authentication_bloc/src/domain/entities/account.dart';
/// Account Model to parse Firebase User data
class AccountModel extends Account {
factory AccountModel.fromFirebaseUserCredential(
UserCredential? userCredential,
) {
UserCredential? userCredential, {
required String? accessToken,
}) {
final user = userCredential?.user;
if (user != null) {
final providerId =
@ -39,14 +40,17 @@ class AccountModel extends Account {
email: user.email,
phoneNumber: user.phoneNumber,
photoURL: user.photoURL,
accessToken: userCredential?.credential?.accessToken,
accessToken: accessToken,
);
} else {
throw ModelParsingFailureFirebase('null-user', 'User cannot be null');
}
}
factory AccountModel.fromFirebaseUser(User? user, {String? accessToken}) {
factory AccountModel.fromFirebaseUser(
User? user, {
required String? accessToken,
}) {
if (user != null) {
final providerId =
(user.providerData.isEmpty) ? '' : user.providerData.first.providerId;