TF-4145 Implement get oidc user_info from endpoint of oidc configuration
This commit is contained in:
@@ -46,4 +46,6 @@ abstract class AuthenticationOIDCDataSource {
|
||||
Future<String> getAuthenticationInfo();
|
||||
|
||||
Future<void> removeAuthDestinationUrl();
|
||||
|
||||
Future<OidcUserInfo> fetchUserInfo(String userInfoEndpoint);
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:model/oidc/oidc_configuration.dart';
|
||||
import 'package:model/oidc/request/oidc_request.dart';
|
||||
import 'package:model/oidc/response/oidc_discovery_response.dart';
|
||||
import 'package:model/oidc/response/oidc_response.dart';
|
||||
import 'package:model/oidc/response/oidc_user_info.dart';
|
||||
import 'package:model/oidc/token_id.dart';
|
||||
import 'package:model/oidc/token_oidc.dart';
|
||||
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
|
||||
@@ -174,4 +175,14 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
|
||||
);
|
||||
}).catchError(_cacheExceptionThrower.throwException);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<OidcUserInfo> fetchUserInfo(String userInfoEndpoint) {
|
||||
return Future.sync(() async {
|
||||
return await _oidcHttpClient.fetchUserInfo(userInfoEndpoint);
|
||||
}).catchError((error, stackTrace) async {
|
||||
await _exceptionThrower.throwException(error, stackTrace);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -4,4 +4,6 @@ class CanNotFoundOIDCLinks implements Exception {}
|
||||
|
||||
class CanNotFindToken implements Exception {}
|
||||
|
||||
class CanRetryOIDCException implements Exception {}
|
||||
class CanRetryOIDCException implements Exception {}
|
||||
|
||||
class NotFoundUserInfoEndpointException implements Exception {}
|
||||
@@ -10,6 +10,7 @@ import 'package:model/oidc/oidc_configuration.dart';
|
||||
import 'package:model/oidc/request/oidc_request.dart';
|
||||
import 'package:model/oidc/response/oidc_discovery_response.dart';
|
||||
import 'package:model/oidc/response/oidc_response.dart';
|
||||
import 'package:model/oidc/response/oidc_user_info.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/extensions/service_path_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';
|
||||
@@ -84,4 +85,14 @@ class OIDCHttpClient {
|
||||
return OIDCDiscoveryResponse.fromJson(jsonDecode(result));
|
||||
}
|
||||
}
|
||||
|
||||
Future<OidcUserInfo> fetchUserInfo(String userInfoEndpoint) async {
|
||||
final result = await _dioClient.get(userInfoEndpoint);
|
||||
|
||||
if (result is Map<String, dynamic>) {
|
||||
return OidcUserInfo.fromJson(result);
|
||||
} else {
|
||||
return OidcUserInfo.fromJson(jsonDecode(result));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:model/oidc/oidc_configuration.dart';
|
||||
import 'package:model/oidc/request/oidc_request.dart';
|
||||
import 'package:model/oidc/response/oidc_discovery_response.dart';
|
||||
import 'package:model/oidc/response/oidc_response.dart';
|
||||
import 'package:model/oidc/response/oidc_user_info.dart';
|
||||
import 'package:model/oidc/token_id.dart';
|
||||
import 'package:model/oidc/token_oidc.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
|
||||
@@ -110,4 +111,9 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
|
||||
Future<void> removeAuthDestinationUrl() {
|
||||
return _oidcDataSource.removeAuthDestinationUrl();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<OidcUserInfo> fetchUserInfo(String userInfoEndpoint) {
|
||||
return _oidcDataSource.fetchUserInfo(userInfoEndpoint);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user