Skip to content

Commit 32307cc

Browse files
authored
Merge pull request #2928 from Azure/shpaster/entra-select-account
External browser auth prompts for account selection
2 parents 917df4f + 4c4639d commit 32307cc

File tree

2 files changed

+42
-28
lines changed

2 files changed

+42
-28
lines changed

desktop/src/client/core/aad/auth-provider.spec.ts

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { instrumentAuthProvider, instrumentForAuth } from "test/utils/mocks/auth";
22
import AuthProvider from "./auth-provider";
33
import { AuthObserver } from "./auth-observer";
4+
import { PublicClientApplication } from "@azure/msal-node";
45

56
const FAKE_GET_TOKEN_ARGS = {
67
resourceURI: "resourceURI1",
@@ -20,6 +21,7 @@ describe("AuthProvider", () => {
2021
};
2122
let mockAuthCode;
2223
let authObserver: jasmine.SpyObj<AuthObserver>;
24+
let clientSpy: jasmine.SpyObj<PublicClientApplication>;
2325

2426
instrumentForAuth(appSpy);
2527
const config: any = {
@@ -44,7 +46,7 @@ describe("AuthProvider", () => {
4446
authObserver.fetchAuthCode.and.returnValue(Promise.resolve(mockAuthCode));
4547

4648
const call = async () => await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
47-
const clientSpy = createClientSpy();
49+
clientSpy = createClientSpy();
4850
instrumentAuthProvider(authProvider);
4951

5052
returnToken(clientSpy.acquireTokenSilent, "silent-token-1");
@@ -79,39 +81,48 @@ describe("AuthProvider", () => {
7981
expect(result2.accessToken).toEqual("tenant2-token");
8082
});
8183

82-
it("should use external browser when externalBrowserAuth is true", async () => {
83-
createClientSpy();
84-
authObserver.selectUserAuthMethod.and.returnValue(
85-
Promise.resolve({ externalBrowserAuth: true })
86-
);
87-
88-
const browserSpy =
89-
spyOn<any>(authProvider, "_createExternalBrowserRequest");
90-
await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
91-
expect(browserSpy).toHaveBeenCalled();
92-
});
93-
94-
it("should use built-in window when externalBrowserAuth is false", async () => {
95-
const clientSpy = createClientSpy();
96-
authObserver.selectUserAuthMethod.and.returnValue(
97-
Promise.resolve({ externalBrowserAuth: false })
98-
);
99-
100-
await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
101-
expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled();
102-
expect(authObserver.fetchAuthCode).toHaveBeenCalled();
103-
expect(clientSpy.acquireTokenByCode).toHaveBeenCalled();
84+
describe("#_externalBrowserAuth", () => {
85+
beforeEach(() => {
86+
clientSpy = createClientSpy();
87+
authObserver.selectUserAuthMethod.and.returnValue(
88+
Promise.resolve({ externalBrowserAuth: true })
89+
);
90+
});
91+
it("is called when externalBrowserAuth is true", async () => {
92+
const browserSpy =
93+
spyOn<any>(authProvider, "_createExternalBrowserRequest");
94+
await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
95+
expect(browserSpy).toHaveBeenCalled();
96+
});
97+
it("handles error thrown by _createExternalBrowserRequest()", async () => {
98+
const err = "fake external browser error";
99+
spyOn<any>(authProvider, "_createExternalBrowserRequest")
100+
.and.returnValue(Promise.reject(err));
101+
await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS))
102+
.toBeRejectedWith(err);
103+
expect(authObserver.onAuthFailure).toHaveBeenCalledWith(err);
104+
});
105+
it("calls acquireTokenInteractive() with select_account prompt", async () => {
106+
await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
107+
expect(clientSpy.acquireTokenInteractive).toHaveBeenCalledWith(
108+
jasmine.objectContaining({ prompt: "select_account" }));
109+
});
104110
});
105111

106112
describe("#_builtInWindowAuth", () => {
107-
let clientSpy;
108113
beforeEach(() => {
109114
clientSpy = createClientSpy();
110115
authObserver.selectUserAuthMethod.and.returnValue(
111116
Promise.resolve({ externalBrowserAuth: false })
112117
);
113118
});
114-
it("should handle error thrown by client.getAuthCodeUrl()", async () => {
119+
it("is called when externalBrowserAuth is false", async () => {
120+
await authProvider.getToken(FAKE_GET_TOKEN_ARGS);
121+
expect(clientSpy.getAuthCodeUrl).toHaveBeenCalled();
122+
expect(authObserver.fetchAuthCode).toHaveBeenCalled();
123+
expect(clientSpy.acquireTokenByCode).toHaveBeenCalled();
124+
});
125+
it("handles error thrown by client.getAuthCodeUrl()", async () => {
115126
const err = "fake getAuthCodeUrl error";
116127
clientSpy.getAuthCodeUrl.and.returnValue(Promise.reject(err));
117128
await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS))
@@ -120,7 +131,7 @@ describe("AuthProvider", () => {
120131
expect(clientSpy.acquireTokenByCode).not.toHaveBeenCalled();
121132
expect(authObserver.fetchAuthCode).not.toHaveBeenCalled();
122133
});
123-
it("should handle error thrown by fetchAuthCode()", async () => {
134+
it("handles error thrown by fetchAuthCode()", async () => {
124135
const err = "fake fetchAuthCode error";
125136
authObserver.fetchAuthCode.and.returnValue(Promise.reject(err));
126137
await expectAsync(authProvider.getToken(FAKE_GET_TOKEN_ARGS))
@@ -153,7 +164,8 @@ const makeClientApplicationSpy = () => jasmine.createSpyObj(
153164
acquireTokenSilent: jasmine.anything,
154165
getAuthCodeUrl: jasmine.anything,
155166
acquireTokenByCode: jasmine.anything,
156-
getTokenCache: makeTokenCacheSpy()
167+
getTokenCache: makeTokenCacheSpy(),
168+
acquireTokenInteractive: jasmine.anything
157169
}
158170
);
159171

desktop/src/client/core/aad/auth-provider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ export default class AuthProvider {
147147
} catch (error) {
148148
log.warn(`[${tenantId}] Failed to authenticate with browser: ${error}`);
149149
this.authObserver.onAuthFailure(error);
150+
throw error;
150151
}
151152
}
152153

@@ -192,7 +193,8 @@ export default class AuthProvider {
192193
const interactiveRequest: InteractiveRequest = {
193194
...authRequest,
194195
openBrowser,
195-
loopbackClient
196+
loopbackClient,
197+
prompt: "select_account"
196198
};
197199
return interactiveRequest;
198200
}

0 commit comments

Comments
 (0)