From 61bea0b667f020a8cbf9a8622ad640280198896b Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 7 Jun 2022 18:57:28 +0700 Subject: [PATCH] TF-624 Use AuthenticationClient to Get/Refresh token and logout oidc --- .../email/presentation/email_bindings.dart | 2 + .../home/presentation/home_bindings.dart | 2 + .../authentication_oidc_datasource_impl.dart | 9 ++- .../config/authorization_interceptors.dart | 8 +-- .../login/data/network/oidc_http_client.dart | 64 +------------------ .../login/presentation/login_bindings.dart | 2 + .../mailbox_dashboard_bindings.dart | 2 + .../manage_account_dashboard_bindings.dart | 2 + .../bindings/network/network_bindings.dart | 8 ++- 9 files changed, 27 insertions(+), 72 deletions(-) diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index 590bdc8f7..98b660306 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_d import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; @@ -69,6 +70,7 @@ class EmailBindings extends BaseBindings { )); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), + Get.find(), Get.find(), Get.find() )); diff --git a/lib/features/home/presentation/home_bindings.dart b/lib/features/home/presentation/home_bindings.dart index dfc879d91..97a11769b 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_d import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; @@ -61,6 +62,7 @@ class HomeBindings extends BaseBindings { )); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), + Get.find(), Get.find(), Get.find() )); 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 365513084..b23b38332 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 @@ -2,16 +2,19 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { final OIDCHttpClient _oidcHttpClient; + final AuthenticationClientBase _authenticationClient; final TokenOidcCacheManager _tokenOidcCacheManager; final OidcConfigurationCacheManager _oidcConfigurationCacheManager; AuthenticationOIDCDataSourceImpl( this._oidcHttpClient, + this._authenticationClient, this._tokenOidcCacheManager, this._oidcConfigurationCacheManager); @@ -37,7 +40,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { @override Future getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List scopes) { return Future.sync(() async { - return await _oidcHttpClient.getTokenOIDC(clientId, redirectUrl, discoveryUrl, scopes); + return await _authenticationClient.getTokenOIDC(clientId, redirectUrl, discoveryUrl, scopes); }).catchError((error) { throw error; }); @@ -66,14 +69,14 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { @override Future refreshingTokensOIDC(String clientId, String redirectUrl, String discoveryUrl, List scopes, String refreshToken) { - return _oidcHttpClient.refreshingTokensOIDC( + return _authenticationClient.refreshingTokensOIDC( clientId, redirectUrl, discoveryUrl, scopes, refreshToken); } @override Future logout(TokenId tokenId, OIDCConfiguration config) { return Future.sync(() async { - return await _oidcHttpClient.logoutOidc(tokenId, config); + return await _authenticationClient.logoutOidc(tokenId, config); }).catchError((error) { throw error; }); diff --git a/lib/features/login/data/network/config/authorization_interceptors.dart b/lib/features/login/data/network/config/authorization_interceptors.dart index f688b2258..ada55271a 100644 --- a/lib/features/login/data/network/config/authorization_interceptors.dart +++ b/lib/features/login/data/network/config/authorization_interceptors.dart @@ -10,12 +10,12 @@ import 'package:model/oidc/token.dart'; import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; -import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; class AuthorizationInterceptors extends InterceptorsWrapper { final Dio _dio; - final OIDCHttpClient _oidcHttpClient; + final AuthenticationClientBase _authenticationClient; final TokenOidcCacheManager _tokenOidcCacheManager; final AccountCacheManager _accountCacheManager; @@ -26,7 +26,7 @@ class AuthorizationInterceptors extends InterceptorsWrapper { AuthorizationInterceptors( this._dio, - this._oidcHttpClient, + this._authenticationClient, this._tokenOidcCacheManager, this._accountCacheManager ); @@ -79,7 +79,7 @@ class AuthorizationInterceptors extends InterceptorsWrapper { if ((_isTokenExpired() || err.response?.statusCode == 401) && _isAuthenticationOidcValid()) { try { - final newToken = await _oidcHttpClient.refreshingTokensOIDC( + final newToken = await _authenticationClient.refreshingTokensOIDC( _configOIDC!.clientId, _configOIDC!.redirectUrl, _configOIDC!.discoveryUrl, diff --git a/lib/features/login/data/network/oidc_http_client.dart b/lib/features/login/data/network/oidc_http_client.dart index 4a0d8ccae..b6f503fcb 100644 --- a/lib/features/login/data/network/oidc_http_client.dart +++ b/lib/features/login/data/network/oidc_http_client.dart @@ -4,26 +4,19 @@ import 'dart:convert'; import 'package:core/data/model/query/query_parameter.dart'; import 'package:core/data/network/dio_client.dart'; import 'package:core/utils/app_logger.dart'; -import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:model/oidc/oidc_configuration.dart'; import 'package:model/oidc/request/oidc_request.dart'; import 'package:model/oidc/response/oidc_response.dart'; -import 'package:model/oidc/token_id.dart'; -import 'package:model/oidc/token_oidc.dart'; -import 'package:tmail_ui_user/features/login/data/extensions/authentication_token_extension.dart'; import 'package:tmail_ui_user/features/login/data/extensions/service_path_extension.dart'; -import 'package:tmail_ui_user/features/login/data/extensions/token_response_extension.dart'; import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart'; import 'package:tmail_ui_user/features/login/data/network/endpoint.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; -import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; class OIDCHttpClient { final DioClient _dioClient; - final FlutterAppAuth _appAuth; - OIDCHttpClient(this._dioClient, this._appAuth); + OIDCHttpClient(this._dioClient); Future checkOIDCIsAvailable(OIDCRequest oidcRequest) async { final result = await _dioClient.get( @@ -54,59 +47,4 @@ class OIDCHttpClient { scopes: OIDCConstant.oidcScope ); } - - Future getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List scopes) async { - final authorizationTokenResponse = await _appAuth.authorizeAndExchangeCode(AuthorizationTokenRequest( - clientId, - redirectUrl, - discoveryUrl: discoveryUrl, - scopes: scopes, - preferEphemeralSession: true)); - - log('OIDCHttpClient::getTokenOIDC(): token: ${authorizationTokenResponse?.accessToken}'); - - if (authorizationTokenResponse != null) { - final tokenOIDC = authorizationTokenResponse.toTokenOIDC(); - if (tokenOIDC.isTokenValid()) { - return tokenOIDC; - } else { - throw AccessTokenInvalidException(); - } - } else { - throw NotFoundAccessTokenException(); - } - } - - Future refreshingTokensOIDC(String clientId, String redirectUrl, - String discoveryUrl, List scopes, String refreshToken) async { - final tokenResponse = await _appAuth.token(TokenRequest( - clientId, - redirectUrl, - discoveryUrl: discoveryUrl, - refreshToken: refreshToken, - scopes: scopes)); - - log('OIDCHttpClient::refreshingTokensOIDC(): refreshToken: ${tokenResponse?.accessToken}'); - - if (tokenResponse != null) { - final tokenOIDC = tokenResponse.toTokenOIDC(); - if (tokenOIDC.isTokenValid()) { - return tokenOIDC; - } else { - throw AccessTokenInvalidException(); - } - } else { - throw NotFoundAccessTokenException(); - } - } - - Future logoutOidc(TokenId tokenId, OIDCConfiguration config) async { - final endSession = await _appAuth.endSession(EndSessionRequest( - idTokenHint: tokenId.uuid, - postLogoutRedirectUrl: config.redirectUrl, - discoveryUrl: config.discoveryUrl - )); - log('OIDCHttpClient::logoutOidc(): ${endSession?.state}'); - return endSession?.state?.isNotEmpty == true; - } } \ 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 896db8907..72280faa0 100644 --- a/lib/features/login/presentation/login_bindings.dart +++ b/lib/features/login/presentation/login_bindings.dart @@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_d import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; @@ -53,6 +54,7 @@ class LoginBindings extends BaseBindings { Get.lazyPut(() => AuthenticationDataSourceImpl()); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), + Get.find(), Get.find(), Get.find() )); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index 674966323..61c121377 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_d import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; @@ -111,6 +112,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => HiveAccountDatasourceImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), + Get.find(), Get.find(), Get.find() )); diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart index 5bfb6069a..cbc65dbcd 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -7,6 +7,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_d import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; @@ -48,6 +49,7 @@ class ManageAccountDashBoardBindings extends BaseBindings { Get.lazyPut(() => HiveAccountDatasourceImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), + Get.find(), Get.find(), Get.find() )); diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 53de83565..1725cabe1 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -11,8 +11,10 @@ import 'package:tmail_ui_user/features/composer/data/network/composer_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; @@ -39,7 +41,9 @@ class NetworkBindings extends Bindings { Get.put(Dio(Get.find())); Get.put(DioClient(Get.find())); Get.put(const FlutterAppAuth()); - Get.put(OIDCHttpClient(Get.find(), Get.find())); + Get.put(AppAuthWebPlugin()); + Get.put(OIDCHttpClient(Get.find())); + Get.put(AuthenticationClientBase()); _bindingInterceptors(); } @@ -47,7 +51,7 @@ class NetworkBindings extends Bindings { Get.put(DynamicUrlInterceptors()); Get.put(AuthorizationInterceptors( Get.find(), - Get.find(), + Get.find(), Get.find(), Get.find() ));