From 5eac189246f48a7a89e40081241982b52d9fb86f Mon Sep 17 00:00:00 2001 From: Bart Wesselink Date: Fri, 15 Sep 2023 09:58:18 +0200 Subject: [PATCH 1/2] Add logout implementation for all accounts --- ios/Plugin/Plugin.m | 1 + ios/Plugin/Plugin.swift | 45 +++++++++++++++++++++++++++++++++++++++++ src/definitions.ts | 1 + src/web.ts | 4 ++++ 4 files changed, 51 insertions(+) diff --git a/ios/Plugin/Plugin.m b/ios/Plugin/Plugin.m index b725498..2547c9b 100644 --- a/ios/Plugin/Plugin.m +++ b/ios/Plugin/Plugin.m @@ -6,4 +6,5 @@ CAP_PLUGIN(MsAuthPlugin, "MsAuthPlugin", CAP_PLUGIN_METHOD(login, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(logout, CAPPluginReturnPromise); + CAP_PLUGIN_METHOD(logoutAll, CAPPluginReturnPromise); ) diff --git a/ios/Plugin/Plugin.swift b/ios/Plugin/Plugin.swift index ad0db86..bf7dccf 100644 --- a/ios/Plugin/Plugin.swift +++ b/ios/Plugin/Plugin.swift @@ -75,6 +75,51 @@ public class MsAuthPlugin: CAPPlugin { } } } + + @objc func logoutAll(_ call: CAPPluginCall) { + guard let context = createContextFromPluginCall(call) else { + call.reject("Unable to create context, check logs") + return + } + + guard let bridgeViewController = bridge?.viewController else { + call.reject("Unable to get Capacitor bridge.viewController") + return + } + + do { + let accounts = try context.allAccounts() + var completed = 0 + + accounts.forEach { + let wvParameters = MSALWebviewParameters(authPresentationViewController: bridgeViewController) + let signoutParameters = MSALSignoutParameters(webviewParameters: wvParameters) + signoutParameters.signoutFromBrowser = false // set this to true if you also want to signout from browser or webview + + context.signout(with: $0, signoutParameters: signoutParameters, completionBlock: {(_, error) in + completed += 1 + + if let error = error { + print("Unable to logout: \(error)") + + call.reject("Unable to logout") + + return + } + + if completed == accounts.count { + call.resolve() + } + }) + } + } catch { + print("Unable to logout: \(error)") + + call.reject("Unable to logout") + + return + } + } private func createContextFromPluginCall(_ call: CAPPluginCall) -> MSALPublicClientApplication? { guard let clientId = call.getString("clientId") else { diff --git a/src/definitions.ts b/src/definitions.ts index 8fee025..5c65a6f 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -17,4 +17,5 @@ export type LogoutOptions = BaseOptions; export interface MsAuthPlugin { login(options: LoginOptions): Promise<{ accessToken: string; idToken: string; scopes: string[] }>; logout(options: LogoutOptions): Promise; + logoutAll(options: LogoutOptions): Promise; } diff --git a/src/web.ts b/src/web.ts index a247e79..96636ae 100644 --- a/src/web.ts +++ b/src/web.ts @@ -44,6 +44,10 @@ export class MsAuth extends WebPlugin implements MsAuthPlugin { } } + logoutAll(options: WebLogoutOptions): Promise { + return this.logout(options); + } + private createContext(options: WebBaseOptions) { const config = { auth: { From ee5d0d694421173320964013b5d30e05fae84119 Mon Sep 17 00:00:00 2001 From: Willem Slaghekke Date: Fri, 15 Sep 2023 10:13:42 +0200 Subject: [PATCH 2/2] Add android logoutAll method --- .../main/java/nl/recognize/msauthplugin/MsAuthPlugin.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/src/main/java/nl/recognize/msauthplugin/MsAuthPlugin.java b/android/src/main/java/nl/recognize/msauthplugin/MsAuthPlugin.java index e4bcb44..b607f61 100644 --- a/android/src/main/java/nl/recognize/msauthplugin/MsAuthPlugin.java +++ b/android/src/main/java/nl/recognize/msauthplugin/MsAuthPlugin.java @@ -110,6 +110,11 @@ public void onError(@NonNull MsalException ex) { } } + @PluginMethod + public void logoutAll(final PluginCall call) { + logout(call); + } + protected String getAuthorityUrl(ISingleAccountPublicClientApplication context) { return context.getConfiguration().getDefaultAuthority().getAuthorityURL().toString(); }