diff --git a/lib/features/login/data/datasource/authentication_oidc_datasource.dart b/lib/features/login/data/datasource/authentication_oidc_datasource.dart index 1a01630bf..1711b3015 100644 --- a/lib/features/login/data/datasource/authentication_oidc_datasource.dart +++ b/lib/features/login/data/datasource/authentication_oidc_datasource.dart @@ -32,4 +32,6 @@ abstract class AuthenticationOIDCDataSource { String redirectUrl, String discoveryUrl, List scopes); + + Future getAuthenticationInfo(); } \ No newline at end of file diff --git a/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart b/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart index 9086092a9..3347cc0d2 100644 --- a/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart +++ b/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart @@ -96,4 +96,9 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { discoveryUrl, scopes); } + + @override + Future getAuthenticationInfo() { + return _authenticationClient.getAuthenticationInfo(); + } } \ No newline at end of file diff --git a/lib/features/login/data/network/authentication_client/authentication_client_base.dart b/lib/features/login/data/network/authentication_client/authentication_client_base.dart index 6281b19df..97ab33043 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_base.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_base.dart @@ -12,6 +12,8 @@ abstract class AuthenticationClientBase { String discoveryUrl, List scopes); + Future getAuthenticationInfo(); + Future getTokenOIDC( String clientId, String redirectUrl, diff --git a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart index c39f3e9bc..36bc728d2 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart @@ -81,6 +81,11 @@ class AuthenticationClientMobile implements AuthenticationClientBase { String discoveryUrl, List scopes) { return Future.value(null); } + + @override + Future getAuthenticationInfo() { + return Future.value(null); + } } AuthenticationClientBase getAuthenticationClientImplementation() => diff --git a/lib/features/login/data/network/authentication_client/authentication_client_web.dart b/lib/features/login/data/network/authentication_client/authentication_client_web.dart index eabfeb9fd..4ef1b3606 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_web.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_web.dart @@ -1,5 +1,8 @@ +import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart'; +import 'package:universal_html/html.dart' as html; import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:flutter_appauth_platform_interface/flutter_appauth_platform_interface.dart'; import 'package:model/oidc/oidc_configuration.dart'; @@ -41,6 +44,13 @@ class AuthenticationClientWeb implements AuthenticationClientBase { discoveryUrl: discoveryUrl, scopes: scopes)); } + + @override + Future getAuthenticationInfo() async { + final authUrl = html.window.sessionStorage[OIDCConstant.authResponseKey]; + log('AuthenticationClientWeb::getAuthenticationInfo(): authUrl: $authUrl'); + return authUrl; + } } AuthenticationClientBase getAuthenticationClientImplementation() => diff --git a/lib/features/login/data/network/config/oidc_constant.dart b/lib/features/login/data/network/config/oidc_constant.dart index f1d8c0925..8212338ed 100644 --- a/lib/features/login/data/network/config/oidc_constant.dart +++ b/lib/features/login/data/network/config/oidc_constant.dart @@ -5,6 +5,7 @@ class OIDCConstant { static String get webOidcClientId => 'teammail-web'; static List get oidcScope => ['openid', 'offline_access']; static const keyAuthorityOidc = 'KEY_AUTHORITY_OIDC'; + static const authResponseKey = "auth_info"; static String get clientId => BuildUtils.isWeb ? webOidcClientId : mobileOidcClientId; } \ No newline at end of file diff --git a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart index 6f80172eb..f7eefc32a 100644 --- a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart +++ b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart @@ -77,4 +77,9 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository { String redirectUrl, String discoveryUrl, List scopes) { return _oidcDataSource.authenticateOidcOnBrowser(clientId, redirectUrl, discoveryUrl, scopes); } + + @override + Future getAuthenticationInfo() { + return _oidcDataSource.getAuthenticationInfo(); + } } \ No newline at end of file diff --git a/lib/features/login/domain/repository/authentication_oidc_repository.dart b/lib/features/login/domain/repository/authentication_oidc_repository.dart index 6d9be7eba..10b4d7d57 100644 --- a/lib/features/login/domain/repository/authentication_oidc_repository.dart +++ b/lib/features/login/domain/repository/authentication_oidc_repository.dart @@ -32,4 +32,6 @@ abstract class AuthenticationOIDCRepository { String redirectUrl, String discoveryUrl, List scopes); + + Future getAuthenticationInfo(); } \ No newline at end of file diff --git a/lib/features/login/domain/state/get_authentication_info_state.dart b/lib/features/login/domain/state/get_authentication_info_state.dart new file mode 100644 index 000000000..55769fcb1 --- /dev/null +++ b/lib/features/login/domain/state/get_authentication_info_state.dart @@ -0,0 +1,20 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class GetAuthenticationInfoSuccess extends UIState { + + GetAuthenticationInfoSuccess(); + + @override + List get props => []; +} + +class GetAuthenticationInfoFailure extends FeatureFailure { + final dynamic exception; + + GetAuthenticationInfoFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/login/domain/usecases/get_authentication_info_interactor.dart b/lib/features/login/domain/usecases/get_authentication_info_interactor.dart new file mode 100644 index 000000000..5e165b1e8 --- /dev/null +++ b/lib/features/login/domain/usecases/get_authentication_info_interactor.dart @@ -0,0 +1,27 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_authentication_info_state.dart'; + +class GetAuthenticationInfoInteractor { + final AuthenticationOIDCRepository _oidcRepository; + + GetAuthenticationInfoInteractor(this._oidcRepository); + + Future> execute() async { + try { + final result = await _oidcRepository.getAuthenticationInfo(); + log('GetAuthenticationInfoInteractor::execute(): result: $result'); + if (result?.isNotEmpty == true) { + return Right(GetAuthenticationInfoSuccess()); + } else { + return Left(GetAuthenticationInfoFailure(null)); + } + } catch (e) { + log('GetAuthenticationInfoInteractor::execute(): ERROR: $e'); + return Left(GetAuthenticationInfoFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/login/presentation/login_bindings.dart b/lib/features/login/presentation/login_bindings.dart index 415f5521a..893c23646 100644 --- a/lib/features/login/presentation/login_bindings.dart +++ b/lib/features/login/presentation/login_bindings.dart @@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/login/domain/repository/credential_reposi import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; @@ -41,6 +42,7 @@ class LoginBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), )); } @@ -86,6 +88,9 @@ class LoginBindings extends BaseBindings { Get.lazyPut(() => AuthenticateOidcOnBrowserInteractor( Get.find(), )); + Get.lazyPut(() => GetAuthenticationInfoInteractor( + Get.find(), + )); } @override diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index afceaa7e3..0fb54f064 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -8,11 +8,13 @@ import 'package:tmail_ui_user/features/login/data/network/config/authorization_i import 'package:tmail_ui_user/features/login/domain/state/authenticate_oidc_on_browser_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_authentication_info_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; @@ -30,6 +32,7 @@ class LoginController extends GetxController { final GetOIDCConfigurationInteractor _getOIDCConfigurationInteractor; final GetTokenOIDCInteractor _getTokenOIDCInteractor; final AuthenticateOidcOnBrowserInteractor _authenticateOidcOnBrowserInteractor; + final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor; final TextEditingController urlInputController = TextEditingController(); @@ -41,6 +44,7 @@ class LoginController extends GetxController { this._getOIDCConfigurationInteractor, this._getTokenOIDCInteractor, this._authenticateOidcOnBrowserInteractor, + this._getAuthenticationInfoInteractor, ); var loginState = LoginState(Right(LoginInitAction())).obs; @@ -69,6 +73,24 @@ class LoginController extends GetxController { ? Password(password.trim()) : null; + @override + void onReady() { + super.onReady(); + if(BuildUtils.isWeb) { + _getAuthenticationInfo(); + } + } + + void _getAuthenticationInfo() async { + await _getAuthenticationInfoInteractor.execute() + .then((result) => result.fold( + (failure) => null, + (success) { + if (success is GetAuthenticationInfoSuccess) { + } + })); + } + void handleNextInUrlInputFormPress() { _checkOIDCIsAvailable(); }