diff --git a/lib/aad_oauth.dart b/lib/aad_oauth.dart index 290802e..4cd9ead 100644 --- a/lib/aad_oauth.dart +++ b/lib/aad_oauth.dart @@ -37,8 +37,8 @@ class AadOAuth { Future getIdToken() async => _coreOAuth.getIdToken(); /// Perform Azure AD logout. - Future logout({bool showWebPopup = true}) async => - _coreOAuth.logout(showPopup: showWebPopup); + Future logout({bool showWebPopup = true, bool clearCookies = true}) async => + _coreOAuth.logout(showPopup: showWebPopup, clearCookies: clearCookies); /// Checks if MSAL has cached information Future get hasCachedAccountInformation async => diff --git a/lib/helper/core_oauth.dart b/lib/helper/core_oauth.dart index 32bcf6d..7b1ff69 100644 --- a/lib/helper/core_oauth.dart +++ b/lib/helper/core_oauth.dart @@ -21,7 +21,7 @@ class CoreOAuth { errorType: ErrorType.unsupported, message: 'Unsupported silentlyLogin'); - Future logout({bool showPopup = true}) async => + Future logout({bool showPopup = true, bool clearCookies = true}) async => throw UnsupportedFailure( errorType: ErrorType.unsupported, message: 'Unsupported logout'); @@ -48,7 +48,7 @@ class MockCoreOAuth extends CoreOAuth { Right(Token(accessToken: mockAccessToken)); @override - Future logout({bool showPopup = true}) async {} + Future logout({bool showPopup = true, bool clearCookies = true}) async {} @override Future get hasCachedAccountInformation async => true; diff --git a/lib/helper/mobile_oauth.dart b/lib/helper/mobile_oauth.dart index c262484..01a6f0f 100644 --- a/lib/helper/mobile_oauth.dart +++ b/lib/helper/mobile_oauth.dart @@ -102,9 +102,11 @@ class MobileOAuth extends CoreOAuth { /// Perform Azure AD logout. @override - Future logout({bool showPopup = true}) async { + Future logout({bool showPopup = true, bool clearCookies = true}) async { await _authStorage.clear(); - await _requestCode.clearCookies(); + if (clearCookies) { + await _requestCode.clearCookies(); + } } @override diff --git a/lib/helper/web_oauth.dart b/lib/helper/web_oauth.dart index 81bf223..917f244 100644 --- a/lib/helper/web_oauth.dart +++ b/lib/helper/web_oauth.dart @@ -132,7 +132,7 @@ class WebOAuth extends CoreOAuth { } @override - Future logout({bool showPopup = true}) async { + Future logout({bool showPopup = true, bool clearCookies = true}) async { final completer = Completer(); jsLogout( diff --git a/lib/model/config.dart b/lib/model/config.dart index 49babad..6c38767 100644 --- a/lib/model/config.dart +++ b/lib/model/config.dart @@ -57,7 +57,9 @@ class Config { final String? state; /// Indicates the type of user interaction that is required. - /// The only valid values at this time are *login*, *none*, and *consent*. + /// The only valid values at this time are *login*, *none*, *consent*, and *select_account*. + /// If *select_account* is wanting to be used, the user must have at least signed in once and + /// when logging out, the *clearCookies* value must be false. final String? prompt; /// Used to secure authorization code grants via Proof Key for Code Exchange (PKCE). diff --git a/lib/request_code.dart b/lib/request_code.dart index da0244e..17559ca 100644 --- a/lib/request_code.dart +++ b/lib/request_code.dart @@ -11,6 +11,7 @@ class RequestCode { final AuthorizationRequest _authorizationRequest; final String _redirectUriHost; late NavigationDelegate _navigationDelegate; + late WebViewCookieManager _cookieManager; String? _code; RequestCode(Config config) @@ -20,6 +21,7 @@ class RequestCode { _navigationDelegate = NavigationDelegate( onNavigationRequest: _onNavigationRequest, ); + _cookieManager = WebViewCookieManager(); } Future requestCode() async { @@ -100,7 +102,7 @@ class RequestCode { } Future clearCookies() async { - await WebViewCookieManager().clearCookies(); + await _cookieManager.clearCookies(); } String _constructUrlParams() => _mapToQueryParams(