TF-606 Implement store/get authority oidc
This commit is contained in:
@@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc
|
|||||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
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/local/token_oidc_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.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/network/oidc_http_client.dart';
|
||||||
@@ -60,7 +61,8 @@ class HomeBindings extends BaseBindings {
|
|||||||
));
|
));
|
||||||
Get.lazyPut(() => AuthenticationOIDCDataSourceImpl(
|
Get.lazyPut(() => AuthenticationOIDCDataSourceImpl(
|
||||||
Get.find<OIDCHttpClient>(),
|
Get.find<OIDCHttpClient>(),
|
||||||
Get.find<TokenOidcCacheManager>()
|
Get.find<TokenOidcCacheManager>(),
|
||||||
|
Get.find<OidcConfigurationCacheManager>()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,4 +11,8 @@ abstract class AuthenticationOIDCDataSource {
|
|||||||
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
|
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
|
||||||
|
|
||||||
Future<TokenOIDC> getStoredTokenOIDC(String tokenIdHash);
|
Future<TokenOIDC> getStoredTokenOIDC(String tokenIdHash);
|
||||||
|
|
||||||
|
Future<void> persistAuthorityOidc(String authority);
|
||||||
|
|
||||||
|
Future<OIDCConfiguration> getStoredOidcConfiguration();
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:model/model.dart';
|
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/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/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/oidc_http_client.dart';
|
||||||
|
|
||||||
@@ -7,8 +8,12 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
|
|||||||
|
|
||||||
final OIDCHttpClient _oidcHttpClient;
|
final OIDCHttpClient _oidcHttpClient;
|
||||||
final TokenOidcCacheManager _tokenOidcCacheManager;
|
final TokenOidcCacheManager _tokenOidcCacheManager;
|
||||||
|
final OidcConfigurationCacheManager _oidcConfigurationCacheManager;
|
||||||
|
|
||||||
AuthenticationOIDCDataSourceImpl(this._oidcHttpClient, this._tokenOidcCacheManager);
|
AuthenticationOIDCDataSourceImpl(
|
||||||
|
this._oidcHttpClient,
|
||||||
|
this._tokenOidcCacheManager,
|
||||||
|
this._oidcConfigurationCacheManager);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<OIDCResponse> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
|
Future<OIDCResponse> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
|
||||||
@@ -47,4 +52,14 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
|
|||||||
Future<void> persistTokenOIDC(TokenOIDC tokenOidc) async {
|
Future<void> persistTokenOIDC(TokenOIDC tokenOidc) async {
|
||||||
return _tokenOidcCacheManager.persistOneTokenOidc(tokenOidc);
|
return _tokenOidcCacheManager.persistOneTokenOidc(tokenOidc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<OIDCConfiguration> getStoredOidcConfiguration() {
|
||||||
|
return _oidcConfigurationCacheManager.getOidcConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> persistAuthorityOidc(String authority) {
|
||||||
|
return _oidcConfigurationCacheManager.persistAuthorityOidc(authority);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
|
import 'package:model/oidc/oidc_configuration.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
|
||||||
|
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
|
||||||
|
|
||||||
|
class OidcConfigurationCacheManager {
|
||||||
|
final SharedPreferences _sharedPreferences;
|
||||||
|
|
||||||
|
OidcConfigurationCacheManager(this._sharedPreferences);
|
||||||
|
|
||||||
|
Future<OIDCConfiguration> getOidcConfiguration() async {
|
||||||
|
final authority = _sharedPreferences.getString(OIDCConstant.keyAuthorityOidc);
|
||||||
|
if (authority == null || authority.isEmpty) {
|
||||||
|
throw CanNotFoundOIDCAuthority();
|
||||||
|
} else {
|
||||||
|
return OIDCConfiguration(
|
||||||
|
authority: authority,
|
||||||
|
clientId: OIDCConstant.mobileOidcClientId,
|
||||||
|
scopes: OIDCConstant.oidcScope);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> persistAuthorityOidc(String authority) async {
|
||||||
|
log('OidcConfigurationCacheManager::persistAuthorityOidc(): $authority');
|
||||||
|
await _sharedPreferences.setString(OIDCConstant.keyAuthorityOidc, authority);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
class OIDCConstant {
|
class OIDCConstant {
|
||||||
static String get mobileOidcClientId => 'teammail-mobile';
|
static String get mobileOidcClientId => 'teammail-mobile';
|
||||||
static List<String> get oidcScope => ['openid', 'offline_access'];
|
static List<String> get oidcScope => ['openid', 'offline_access'];
|
||||||
|
static const keyAuthorityOidc = 'KEY_AUTHORITY_OIDC';
|
||||||
}
|
}
|
||||||
@@ -34,4 +34,14 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
|
|||||||
Future<void> persistTokenOIDC(TokenOIDC tokenOidc) {
|
Future<void> persistTokenOIDC(TokenOIDC tokenOidc) {
|
||||||
return _oidcDataSource.persistTokenOIDC(tokenOidc);
|
return _oidcDataSource.persistTokenOIDC(tokenOidc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<OIDCConfiguration> getStoredOidcConfiguration() {
|
||||||
|
return _oidcDataSource.getStoredOidcConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> persistAuthorityOidc(String authority) {
|
||||||
|
return _oidcDataSource.persistAuthorityOidc(authority);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,4 +11,8 @@ abstract class AuthenticationOIDCRepository {
|
|||||||
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
|
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
|
||||||
|
|
||||||
Future<TokenOIDC> getStoredTokenOIDC(String tokenIdHash);
|
Future<TokenOIDC> getStoredTokenOIDC(String tokenIdHash);
|
||||||
|
|
||||||
|
Future<void> persistAuthorityOidc(String authority);
|
||||||
|
|
||||||
|
Future<OIDCConfiguration> getStoredOidcConfiguration();
|
||||||
}
|
}
|
||||||
@@ -1,19 +1,21 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:model/oidc/oidc_configuration.dart';
|
||||||
import 'package:model/oidc/token_oidc.dart';
|
import 'package:model/oidc/token_oidc.dart';
|
||||||
|
|
||||||
class GetStoredTokenOidcSuccess extends UIState {
|
class GetStoredTokenOidcSuccess extends UIState {
|
||||||
final Uri baseUrl;
|
final Uri baseUrl;
|
||||||
final TokenOIDC tokenOidc;
|
final TokenOIDC tokenOidc;
|
||||||
|
final OIDCConfiguration oidcConfiguration;
|
||||||
|
|
||||||
GetStoredTokenOidcSuccess(this.baseUrl, this.tokenOidc);
|
GetStoredTokenOidcSuccess(this.baseUrl, this.tokenOidc, this.oidcConfiguration);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [baseUrl, tokenOidc];
|
List<Object?> get props => [baseUrl, tokenOidc, oidcConfiguration];
|
||||||
}
|
}
|
||||||
|
|
||||||
class GetStoredTokenOidcFailure extends FeatureFailure {
|
class GetStoredTokenOidcFailure extends FeatureFailure {
|
||||||
final exception;
|
final dynamic exception;
|
||||||
|
|
||||||
GetStoredTokenOidcFailure(this.exception);
|
GetStoredTokenOidcFailure(this.exception);
|
||||||
|
|
||||||
@@ -22,4 +24,4 @@ class GetStoredTokenOidcFailure extends FeatureFailure {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [exception];
|
List<Object?> get props => [exception];
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ import 'package:core/presentation/state/failure.dart';
|
|||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:model/oidc/oidc_configuration.dart';
|
||||||
import 'package:model/oidc/token_oidc.dart';
|
import 'package:model/oidc/token_oidc.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
|
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/extensions/uri_extension.dart';
|
import 'package:tmail_ui_user/features/login/domain/extensions/uri_extension.dart';
|
||||||
@@ -20,15 +21,18 @@ class GetStoredTokenOidcInteractor {
|
|||||||
yield Right<Failure, Success>(LoadingState());
|
yield Right<Failure, Success>(LoadingState());
|
||||||
final futureValue = await Future.wait([
|
final futureValue = await Future.wait([
|
||||||
_credentialRepository.getBaseUrl(),
|
_credentialRepository.getBaseUrl(),
|
||||||
_authenticationOIDCRepository.getStoredTokenOIDC(tokenIdHash)
|
_authenticationOIDCRepository.getStoredTokenOIDC(tokenIdHash),
|
||||||
|
_authenticationOIDCRepository.getStoredOidcConfiguration(),
|
||||||
], eagerError: true);
|
], eagerError: true);
|
||||||
|
|
||||||
final baseUrl = futureValue.first as Uri;
|
final baseUrl = futureValue[0] as Uri;
|
||||||
final tokenOidc = futureValue.last as TokenOIDC;
|
final tokenOidc = futureValue[1] as TokenOIDC;
|
||||||
|
final oidcConfiguration = futureValue[2] as OIDCConfiguration;
|
||||||
log('GetStoredTokenOidcInteractor::execute(): $tokenOidc');
|
log('GetStoredTokenOidcInteractor::execute(): $tokenOidc');
|
||||||
|
log('GetStoredTokenOidcInteractor::execute(): oidcConfiguration: $oidcConfiguration');
|
||||||
|
|
||||||
if (_isCredentialValid(baseUrl)) {
|
if (_isCredentialValid(baseUrl)) {
|
||||||
yield Right(GetStoredTokenOidcSuccess(baseUrl, tokenOidc));
|
yield Right(GetStoredTokenOidcSuccess(baseUrl, tokenOidc, oidcConfiguration));
|
||||||
} else {
|
} else {
|
||||||
yield Left(GetStoredTokenOidcFailure(const InvalidBaseUrl()));
|
yield Left(GetStoredTokenOidcFailure(const InvalidBaseUrl()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication
|
|||||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
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/local/token_oidc_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.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/network/oidc_http_client.dart';
|
||||||
@@ -52,7 +53,8 @@ class LoginBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => AuthenticationDataSourceImpl());
|
Get.lazyPut(() => AuthenticationDataSourceImpl());
|
||||||
Get.lazyPut(() => AuthenticationOIDCDataSourceImpl(
|
Get.lazyPut(() => AuthenticationOIDCDataSourceImpl(
|
||||||
Get.find<OIDCHttpClient>(),
|
Get.find<OIDCHttpClient>(),
|
||||||
Get.find<TokenOidcCacheManager>()
|
Get.find<TokenOidcCacheManager>(),
|
||||||
|
Get.find<OidcConfigurationCacheManager>()
|
||||||
));
|
));
|
||||||
Get.lazyPut(() => HiveAccountDatasourceImpl(
|
Get.lazyPut(() => HiveAccountDatasourceImpl(
|
||||||
Get.find<AccountCacheManager>()
|
Get.find<AccountCacheManager>()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/account_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/account_cache_client.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/email_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/email_cache_client.dart';
|
||||||
@@ -10,6 +11,7 @@ import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
|
|||||||
import 'package:tmail_ui_user/features/caching/token_oidc_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/token_oidc_cache_client.dart';
|
||||||
import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart';
|
import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
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/local/token_oidc_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart';
|
||||||
@@ -38,6 +40,7 @@ class LocalBindings extends Bindings {
|
|||||||
Get.put(TokenOidcCacheManager(Get.find<TokenOidcCacheClient>()));
|
Get.put(TokenOidcCacheManager(Get.find<TokenOidcCacheClient>()));
|
||||||
Get.put(AccountCacheClient());
|
Get.put(AccountCacheClient());
|
||||||
Get.put(AccountCacheManager(Get.find<AccountCacheClient>()));
|
Get.put(AccountCacheManager(Get.find<AccountCacheClient>()));
|
||||||
|
Get.put(OidcConfigurationCacheManager(Get.find<SharedPreferences>()));
|
||||||
Get.put(CachingManager(
|
Get.put(CachingManager(
|
||||||
Get.find<MailboxCacheClient>(),
|
Get.find<MailboxCacheClient>(),
|
||||||
Get.find<StateCacheClient>(),
|
Get.find<StateCacheClient>(),
|
||||||
|
|||||||
Reference in New Issue
Block a user