TF-4145 Implement get oidc user_info from endpoint of oidc configuration

This commit is contained in:
dab246
2025-11-12 16:25:51 +07:00
committed by Dat H. Pham
parent 655a1bf81a
commit 43de7edd47
14 changed files with 185 additions and 6 deletions
@@ -46,4 +46,6 @@ abstract class AuthenticationOIDCRepository {
Future<String> getAuthenticationInfo();
Future<void> removeAuthDestinationUrl();
Future<OidcUserInfo> fetchUserInfo(String userInfoEndpoint);
}
@@ -0,0 +1,18 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:model/oidc/response/oidc_user_info.dart';
class GettingOidcUserInfo extends LoadingState {}
class GetOidcUserInfoSuccess extends UIState {
final OidcUserInfo oidcUserInfo;
GetOidcUserInfoSuccess(this.oidcUserInfo);
@override
List<Object> get props => [oidcUserInfo];
}
class GetOidcUserInfoFailure extends FeatureFailure {
GetOidcUserInfoFailure(dynamic exception) : super(exception: exception);
}
@@ -0,0 +1,37 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:model/oidc/oidc_configuration.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_user_info_state.dart';
class GetOidcUserInfoInteractor {
final AuthenticationOIDCRepository _authenticationOIDCRepository;
GetOidcUserInfoInteractor(this._authenticationOIDCRepository);
Stream<Either<Failure, Success>> execute(OIDCConfiguration config) async* {
try {
yield Right<Failure, Success>(GettingOidcUserInfo());
final oidcDiscoveryResponse =
await _authenticationOIDCRepository.discoverOIDC(config);
final userInfoEndpoint = oidcDiscoveryResponse.userInfoEndpoint;
if (userInfoEndpoint != null) {
final oidcUserInfo =
await _authenticationOIDCRepository.fetchUserInfo(userInfoEndpoint);
yield Right<Failure, Success>(GetOidcUserInfoSuccess(oidcUserInfo));
} else {
yield Left<Failure, Success>(
GetOidcUserInfoFailure(NotFoundUserInfoEndpointException()),
);
}
} catch (e) {
yield Left<Failure, Success>(GetOidcUserInfoFailure(e));
}
}
}