TF-624 Implement get token oidc on browser
This commit is contained in:
@@ -16,7 +16,7 @@ class OidcConfigurationCacheManager {
|
|||||||
} else {
|
} else {
|
||||||
return OIDCConfiguration(
|
return OIDCConfiguration(
|
||||||
authority: authority,
|
authority: authority,
|
||||||
clientId: OIDCConstant.mobileOidcClientId,
|
clientId: OIDCConstant.clientId,
|
||||||
scopes: OIDCConstant.oidcScope);
|
scopes: OIDCConstant.oidcScope);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-1
@@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/data/extensions/authentication_token_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
|
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
|
||||||
import 'package:universal_html/html.dart' as html;
|
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: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:flutter_appauth_platform_interface/flutter_appauth_platform_interface.dart';
|
||||||
@@ -20,7 +22,25 @@ class AuthenticationClientWeb implements AuthenticationClientBase {
|
|||||||
@override
|
@override
|
||||||
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl,
|
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl,
|
||||||
String discoveryUrl, List<String> scopes) async {
|
String discoveryUrl, List<String> scopes) async {
|
||||||
throw UnimplementedError();
|
final authorizationTokenResponse = await _appAuthWeb.authorizeAndExchangeCode(AuthorizationTokenRequest(
|
||||||
|
clientId,
|
||||||
|
redirectUrl,
|
||||||
|
discoveryUrl: discoveryUrl,
|
||||||
|
scopes: scopes,
|
||||||
|
preferEphemeralSession: true));
|
||||||
|
|
||||||
|
log('AuthClientMobile::getTokenOIDC(): token: ${authorizationTokenResponse?.accessToken}');
|
||||||
|
|
||||||
|
if (authorizationTokenResponse != null) {
|
||||||
|
final tokenOIDC = authorizationTokenResponse.toTokenOIDC();
|
||||||
|
if (tokenOIDC.isTokenValid()) {
|
||||||
|
return tokenOIDC;
|
||||||
|
} else {
|
||||||
|
throw AccessTokenInvalidException();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw NotFoundAccessTokenException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:model/oidc/oidc_configuration.dart';
|
||||||
|
|
||||||
|
class GetStoredOidcConfigurationSuccess extends UIState {
|
||||||
|
final OIDCConfiguration oidcConfiguration;
|
||||||
|
|
||||||
|
GetStoredOidcConfigurationSuccess(this.oidcConfiguration);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [oidcConfiguration];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetStoredOidcConfigurationFailure extends FeatureFailure {
|
||||||
|
final dynamic exception;
|
||||||
|
|
||||||
|
GetStoredOidcConfigurationFailure(this.exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [exception];
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ class GetOIDCConfigurationInteractor {
|
|||||||
try {
|
try {
|
||||||
final oidcConfiguration = await _oidcRepository.getOIDCConfiguration(oidcResponse);
|
final oidcConfiguration = await _oidcRepository.getOIDCConfiguration(oidcResponse);
|
||||||
log('GetOIDCConfigurationInteractor::execute(): oidcConfiguration: $oidcConfiguration');
|
log('GetOIDCConfigurationInteractor::execute(): oidcConfiguration: $oidcConfiguration');
|
||||||
|
await _oidcRepository.persistAuthorityOidc(oidcConfiguration.authority);
|
||||||
return Right<Failure, Success>(GetOIDCConfigurationSuccess(oidcConfiguration));
|
return Right<Failure, Success>(GetOIDCConfigurationSuccess(oidcConfiguration));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('GetOIDCConfigurationInteractor::execute(): ERROR: $e');
|
log('GetOIDCConfigurationInteractor::execute(): ERROR: $e');
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
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_stored_oidc_configuration_state.dart';
|
||||||
|
|
||||||
|
class GetStoredOidcConfigurationInteractor {
|
||||||
|
final AuthenticationOIDCRepository _authenticationOIDCRepository;
|
||||||
|
|
||||||
|
GetStoredOidcConfigurationInteractor(this._authenticationOIDCRepository);
|
||||||
|
|
||||||
|
Future<Either<Failure, Success>> execute() async {
|
||||||
|
try {
|
||||||
|
final config = await _authenticationOIDCRepository.getStoredOidcConfiguration();
|
||||||
|
log('GetStoredOidcConfigurationInteractor::execute(): oidcConfiguration: $config');
|
||||||
|
return Right(GetStoredOidcConfigurationSuccess(config));
|
||||||
|
} catch (e) {
|
||||||
|
log('GetStoredOidcConfigurationInteractor::execute(): $e');
|
||||||
|
return Left(GetStoredOidcConfigurationFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user
|
|||||||
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_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_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_oidc_configuration_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_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/domain/usecases/get_token_oidc_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
|
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ class LoginBindings extends BaseBindings {
|
|||||||
Get.find<GetTokenOIDCInteractor>(),
|
Get.find<GetTokenOIDCInteractor>(),
|
||||||
Get.find<AuthenticateOidcOnBrowserInteractor>(),
|
Get.find<AuthenticateOidcOnBrowserInteractor>(),
|
||||||
Get.find<GetAuthenticationInfoInteractor>(),
|
Get.find<GetAuthenticationInfoInteractor>(),
|
||||||
|
Get.find<GetStoredOidcConfigurationInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +93,9 @@ class LoginBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => GetAuthenticationInfoInteractor(
|
Get.lazyPut(() => GetAuthenticationInfoInteractor(
|
||||||
Get.find<AuthenticationOIDCRepository>(),
|
Get.find<AuthenticationOIDCRepository>(),
|
||||||
));
|
));
|
||||||
|
Get.lazyPut(() => GetStoredOidcConfigurationInteractor(
|
||||||
|
Get.find<AuthenticationOIDCRepository>(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -10,12 +10,14 @@ import 'package:tmail_ui_user/features/login/domain/state/authentication_user_st
|
|||||||
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_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_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_oidc_configuration_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/state/get_stored_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/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/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/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/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_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_oidc_configuration_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_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/domain/usecases/get_token_oidc_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
|
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
|
||||||
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
||||||
@@ -33,6 +35,7 @@ class LoginController extends GetxController {
|
|||||||
final GetTokenOIDCInteractor _getTokenOIDCInteractor;
|
final GetTokenOIDCInteractor _getTokenOIDCInteractor;
|
||||||
final AuthenticateOidcOnBrowserInteractor _authenticateOidcOnBrowserInteractor;
|
final AuthenticateOidcOnBrowserInteractor _authenticateOidcOnBrowserInteractor;
|
||||||
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
|
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
|
||||||
|
final GetStoredOidcConfigurationInteractor _getStoredOidcConfigurationInteractor;
|
||||||
|
|
||||||
final TextEditingController urlInputController = TextEditingController();
|
final TextEditingController urlInputController = TextEditingController();
|
||||||
|
|
||||||
@@ -45,6 +48,7 @@ class LoginController extends GetxController {
|
|||||||
this._getTokenOIDCInteractor,
|
this._getTokenOIDCInteractor,
|
||||||
this._authenticateOidcOnBrowserInteractor,
|
this._authenticateOidcOnBrowserInteractor,
|
||||||
this._getAuthenticationInfoInteractor,
|
this._getAuthenticationInfoInteractor,
|
||||||
|
this._getStoredOidcConfigurationInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
var loginState = LoginState(Right(LoginInitAction())).obs;
|
var loginState = LoginState(Right(LoginInitAction())).obs;
|
||||||
@@ -74,11 +78,11 @@ class LoginController extends GetxController {
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onInit() {
|
||||||
super.onReady();
|
if (BuildUtils.isWeb) {
|
||||||
if(BuildUtils.isWeb) {
|
|
||||||
_getAuthenticationInfo();
|
_getAuthenticationInfo();
|
||||||
}
|
}
|
||||||
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAuthenticationInfo() async {
|
void _getAuthenticationInfo() async {
|
||||||
@@ -87,10 +91,22 @@ class LoginController extends GetxController {
|
|||||||
(failure) => null,
|
(failure) => null,
|
||||||
(success) {
|
(success) {
|
||||||
if (success is GetAuthenticationInfoSuccess) {
|
if (success is GetAuthenticationInfoSuccess) {
|
||||||
|
_getStoredOidcConfiguration();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _getStoredOidcConfiguration() async {
|
||||||
|
await _getStoredOidcConfigurationInteractor.execute()
|
||||||
|
.then((result) => result.fold(
|
||||||
|
(failure) => null,
|
||||||
|
(success) {
|
||||||
|
if (success is GetStoredOidcConfigurationSuccess) {
|
||||||
|
_getTokenOIDCAction(success.oidcConfiguration);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
void handleNextInUrlInputFormPress() {
|
void handleNextInUrlInputFormPress() {
|
||||||
_checkOIDCIsAvailable();
|
_checkOIDCIsAvailable();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user