Skip to content

Commit 0af610c

Browse files
authored
Add prompt parameter (#51)
* Add support for the Prompt parameter available in MS ios and android libraries while preserving the behaviour defaulting to select_account * Added promptType to acquireTokenInteractively call from acquireTokenSilently on fallback
1 parent 52952ac commit 0af610c

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

android/src/main/java/nl/recognize/msauthplugin/MsAuthPlugin.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,34 @@ public void login(final PluginCall call) {
4848
return;
4949
}
5050

51+
Prompt prompt = Prompt.SELECT_ACCOUNT;
52+
if (call.hasOption("prompt")) {
53+
switch (call.getString("prompt").toLowerCase()) {
54+
case "select_account":
55+
prompt = Prompt.SELECT_ACCOUNT;
56+
break;
57+
case "login":
58+
prompt = Prompt.LOGIN;
59+
break;
60+
case "consent":
61+
prompt = Prompt.CONSENT;
62+
break;
63+
case "none":
64+
prompt = Prompt.WHEN_REQUIRED;
65+
break;
66+
case "create":
67+
prompt = Prompt.CREATE;
68+
break;
69+
default:
70+
Logger.warn("Unrecognized prompt option: " + call.getString("prompt"));
71+
break;
72+
}
73+
}
74+
5175
this.acquireToken(
5276
context,
5377
call.getArray("scopes").toList(),
78+
prompt,
5479
tokenResult -> {
5580
if (tokenResult != null) {
5681
JSObject result = new JSObject();
@@ -114,13 +139,14 @@ protected String getAuthorityUrl(ISingleAccountPublicClientApplication context)
114139
return context.getConfiguration().getDefaultAuthority().getAuthorityURL().toString();
115140
}
116141

117-
private void acquireToken(ISingleAccountPublicClientApplication context, List<String> scopes, final TokenResultCallback callback)
142+
private void acquireToken(ISingleAccountPublicClientApplication context, List<String> scopes, Prompt prompt, final TokenResultCallback callback)
118143
throws MsalException, InterruptedException {
119144
String authority = getAuthorityUrl(context);
120145

121146
ICurrentAccountResult result = context.getCurrentAccount();
122147
if (result.getCurrentAccount() != null) {
123148
try {
149+
124150
Logger.info("Starting silent login flow");
125151
AcquireTokenSilentParameters.Builder builder = new AcquireTokenSilentParameters.Builder()
126152
.withScopes(scopes)
@@ -148,7 +174,7 @@ private void acquireToken(ISingleAccountPublicClientApplication context, List<St
148174
AcquireTokenParameters.Builder params = new AcquireTokenParameters.Builder()
149175
.startAuthorizationFromActivity(this.getActivity())
150176
.withScopes(scopes)
151-
.withPrompt(Prompt.SELECT_ACCOUNT)
177+
.withPrompt(prompt)
152178
.withCallback(
153179
new AuthenticationCallback() {
154180
@Override

ios/Plugin/Plugin.swift

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,24 @@ public class MsAuthPlugin: CAPPlugin {
1616

1717
let scopes = call.getArray("scopes", String.self) ?? []
1818

19+
var promptType: MSALPromptType = .selectAccount
20+
if let prompt = call.getString("prompt")?.lowercased() {
21+
switch prompt {
22+
case "select_account":
23+
promptType = .selectAccount
24+
case "login":
25+
promptType = .login
26+
case "consent":
27+
promptType = .consent
28+
case "none":
29+
promptType = .promptIfNecessary
30+
case "create":
31+
promptType = .create
32+
default:
33+
print("Unrecognized prompt option: \(prompt)")
34+
}
35+
}
36+
1937
let completion: (MSALResult?) -> Void = { msalResult in
2038
guard let result = msalResult else {
2139
call.reject("Unable to obtain access token")
@@ -31,7 +49,7 @@ public class MsAuthPlugin: CAPPlugin {
3149

3250
loadCurrentAccount(applicationContext: context) { (account) in
3351
guard let currentAccount = account else {
34-
self.acquireTokenInteractively(applicationContext: context, scopes: scopes, completion: completion)
52+
self.acquireTokenInteractively(applicationContext: context, scopes: scopes, promptType: promptType, completion: completion)
3553
return
3654
}
3755

@@ -224,7 +242,7 @@ public class MsAuthPlugin: CAPPlugin {
224242

225243
}
226244

227-
func acquireTokenInteractively(applicationContext: MSALPublicClientApplication, scopes: [String], completion: @escaping (MSALResult?) -> Void) {
245+
func acquireTokenInteractively(applicationContext: MSALPublicClientApplication, scopes: [String], promptType: MSALPromptType, completion: @escaping (MSALResult?) -> Void) {
228246
guard let bridgeViewController = bridge?.viewController else {
229247
print("Unable to get Capacitor bridge.viewController")
230248

@@ -235,7 +253,7 @@ public class MsAuthPlugin: CAPPlugin {
235253
let wvParameters = MSALWebviewParameters(authPresentationViewController: bridgeViewController)
236254
let parameters = MSALInteractiveTokenParameters(scopes: scopes, webviewParameters: wvParameters)
237255

238-
parameters.promptType = .selectAccount
256+
parameters.promptType = promptType
239257

240258
applicationContext.acquireToken(with: parameters) { (result, error) in
241259
if let error = error {
@@ -268,7 +286,7 @@ public class MsAuthPlugin: CAPPlugin {
268286

269287
if nsError.code == MSALError.interactionRequired.rawValue {
270288
DispatchQueue.main.async {
271-
self.acquireTokenInteractively(applicationContext: applicationContext, scopes: scopes, completion: completion)
289+
self.acquireTokenInteractively(applicationContext: applicationContext, scopes: scopes, promptType: .selectAccount, completion: completion)
272290
}
273291
return
274292
}

src/definitions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface BaseOptions {
1212
export interface LoginOptions extends BaseOptions {
1313
/** MSAL always sends the scopes 'openid profile offline_access'. Do not include any of these scopes in the scopes parameter. */
1414
scopes?: string[];
15+
prompt?: 'login' | 'none' | 'consent' | 'create' | 'select_account';
1516
}
1617

1718
export type LogoutOptions = BaseOptions;

0 commit comments

Comments
 (0)