Skip to content

Commit c79920f

Browse files
Machine Learning Managed Identity now correctly uses MSI's 2017 API instead of the 2019 API (#7631)
Fixes #7597 Fixes #7627
1 parent b7536a1 commit c79920f

File tree

8 files changed

+101
-12
lines changed

8 files changed

+101
-12
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Machine Learning Managed Identity now correctly uses MSI's 2017 API instead of the 2019 API #7631",
4+
"packageName": "@azure/msal-node",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

lib/msal-node/src/client/ManagedIdentitySources/BaseManagedIdentitySource.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ import { HttpClientWithRetries } from "../../network/HttpClientWithRetries.js";
3838
* Managed Identity User Assigned Id Query Parameter Names
3939
*/
4040
export const ManagedIdentityUserAssignedIdQueryParameterNames = {
41-
MANAGED_IDENTITY_CLIENT_ID: "client_id",
41+
MANAGED_IDENTITY_CLIENT_ID_2017: "clientid", // 2017-09-01 API version
42+
MANAGED_IDENTITY_CLIENT_ID: "client_id", // 2019+ API versions
4243
MANAGED_IDENTITY_OBJECT_ID: "object_id",
4344
MANAGED_IDENTITY_RESOURCE_ID_IMDS: "msi_res_id",
4445
MANAGED_IDENTITY_RESOURCE_ID_NON_IMDS: "mi_res_id",
@@ -227,20 +228,26 @@ export abstract class BaseManagedIdentitySource {
227228

228229
public getManagedIdentityUserAssignedIdQueryParameterKey(
229230
managedIdentityIdType: ManagedIdentityIdType,
230-
imds?: boolean
231+
isImds?: boolean,
232+
usesApi2017?: boolean
231233
): string {
232234
switch (managedIdentityIdType) {
233235
case ManagedIdentityIdType.USER_ASSIGNED_CLIENT_ID:
234236
this.logger.info(
235-
"[Managed Identity] Adding user assigned client id to the request."
237+
`[Managed Identity] [API version ${
238+
usesApi2017 ? "2017+" : "2019+"
239+
}] Adding user assigned client id to the request.`
236240
);
237-
return ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID;
241+
// The Machine Learning source uses the 2017-09-01 API version, which uses "clientid" instead of "client_id"
242+
return usesApi2017
243+
? ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID_2017
244+
: ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID;
238245

239246
case ManagedIdentityIdType.USER_ASSIGNED_RESOURCE_ID:
240247
this.logger.info(
241248
"[Managed Identity] Adding user assigned resource id to the request."
242249
);
243-
return imds
250+
return isImds
244251
? ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_RESOURCE_ID_IMDS
245252
: ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_RESOURCE_ID_NON_IMDS;
246253

lib/msal-node/src/client/ManagedIdentitySources/MachineLearning.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ export class MachineLearning extends BaseManagedIdentitySource {
120120
) {
121121
request.queryParameters[
122122
this.getManagedIdentityUserAssignedIdQueryParameterKey(
123-
managedIdentityId.idType
123+
managedIdentityId.idType,
124+
false, // isIMDS
125+
true // uses2017API
124126
)
125127
] = managedIdentityId.id;
126128
}

lib/msal-node/test/client/ManagedIdentitySources/AppService.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ describe("Acquires a token successfully via an App Service Managed Identity", ()
5858

5959
describe("User Assigned", () => {
6060
test("acquires a User Assigned Client Id token", async () => {
61+
const sendGetRequestAsyncSpy: jest.SpyInstance = jest.spyOn(
62+
networkClient,
63+
<any>"sendGetRequestAsync"
64+
);
65+
6166
const managedIdentityApplication: ManagedIdentityApplication =
6267
new ManagedIdentityApplication(userAssignedClientIdConfig);
6368
expect(managedIdentityApplication.getManagedIdentitySource()).toBe(
@@ -68,10 +73,23 @@ describe("Acquires a token successfully via an App Service Managed Identity", ()
6873
await managedIdentityApplication.acquireToken(
6974
managedIdentityRequestParams
7075
);
71-
7276
expect(networkManagedIdentityResult.accessToken).toEqual(
7377
DEFAULT_USER_SYSTEM_ASSIGNED_MANAGED_IDENTITY_AUTHENTICATION_RESULT.accessToken
7478
);
79+
80+
const url: URLSearchParams = new URLSearchParams(
81+
sendGetRequestAsyncSpy.mock.lastCall[0]
82+
);
83+
expect(
84+
url.has(
85+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID
86+
)
87+
).toBe(true);
88+
expect(
89+
url.has(
90+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID_2017
91+
)
92+
).toBe(false);
7593
});
7694

7795
test("acquires a User Assigned Resource Id token", async () => {

lib/msal-node/test/client/ManagedIdentitySources/Imds.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => {
9090

9191
describe("User Assigned", () => {
9292
test("acquires a User Assigned Client Id token", async () => {
93+
const sendGetRequestAsyncSpy: jest.SpyInstance = jest.spyOn(
94+
networkClient,
95+
<any>"sendGetRequestAsync"
96+
);
97+
9398
const managedIdentityApplication: ManagedIdentityApplication =
9499
new ManagedIdentityApplication(userAssignedClientIdConfig);
95100
expect(managedIdentityApplication.getManagedIdentitySource()).toBe(
@@ -100,10 +105,23 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => {
100105
await managedIdentityApplication.acquireToken(
101106
managedIdentityRequestParams
102107
);
103-
104108
expect(networkManagedIdentityResult.accessToken).toEqual(
105109
DEFAULT_USER_SYSTEM_ASSIGNED_MANAGED_IDENTITY_AUTHENTICATION_RESULT.accessToken
106110
);
111+
112+
const url: URLSearchParams = new URLSearchParams(
113+
sendGetRequestAsyncSpy.mock.lastCall[0]
114+
);
115+
expect(
116+
url.has(
117+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID
118+
)
119+
).toBe(true);
120+
expect(
121+
url.has(
122+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID_2017
123+
)
124+
).toBe(false);
107125
});
108126

109127
test("acquires a User Assigned Object Id token", async () => {

lib/msal-node/test/client/ManagedIdentitySources/MachineLearning.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ describe("Acquires a token successfully via an Machine Learning Managed Identity
5757

5858
describe("User Assigned", () => {
5959
test("acquires a User Assigned Client Id token", async () => {
60+
const sendGetRequestAsyncSpy: jest.SpyInstance = jest.spyOn(
61+
networkClient,
62+
<any>"sendGetRequestAsync"
63+
);
64+
6065
const managedIdentityApplication: ManagedIdentityApplication =
6166
new ManagedIdentityApplication(userAssignedClientIdConfig);
6267
expect(managedIdentityApplication.getManagedIdentitySource()).toBe(
@@ -71,6 +76,20 @@ describe("Acquires a token successfully via an Machine Learning Managed Identity
7176
expect(networkManagedIdentityResult.accessToken).toEqual(
7277
DEFAULT_USER_SYSTEM_ASSIGNED_MANAGED_IDENTITY_AUTHENTICATION_RESULT.accessToken
7378
);
79+
80+
const url: URLSearchParams = new URLSearchParams(
81+
sendGetRequestAsyncSpy.mock.lastCall[0]
82+
);
83+
expect(
84+
url.has(
85+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID_2017
86+
)
87+
).toBe(true);
88+
expect(
89+
url.has(
90+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID
91+
)
92+
).toBe(false);
7493
});
7594

7695
test("acquires a User Assigned Resource Id token", async () => {

lib/msal-node/test/client/ManagedIdentitySources/ServiceFabric.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ describe("Acquires a token successfully via an App Service Managed Identity", ()
6464

6565
describe("User Assigned", () => {
6666
test("acquires a User Assigned Client Id token", async () => {
67+
const sendGetRequestAsyncSpy: jest.SpyInstance = jest.spyOn(
68+
networkClient,
69+
<any>"sendGetRequestAsync"
70+
);
71+
6772
const managedIdentityApplication: ManagedIdentityApplication =
6873
new ManagedIdentityApplication(userAssignedClientIdConfig);
6974
expect(managedIdentityApplication.getManagedIdentitySource()).toBe(
@@ -74,10 +79,23 @@ describe("Acquires a token successfully via an App Service Managed Identity", ()
7479
await managedIdentityApplication.acquireToken(
7580
managedIdentityRequestParams
7681
);
77-
7882
expect(networkManagedIdentityResult.accessToken).toEqual(
7983
DEFAULT_USER_SYSTEM_ASSIGNED_MANAGED_IDENTITY_AUTHENTICATION_RESULT.accessToken
8084
);
85+
86+
const url: URLSearchParams = new URLSearchParams(
87+
sendGetRequestAsyncSpy.mock.lastCall[0]
88+
);
89+
expect(
90+
url.has(
91+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID
92+
)
93+
).toBe(true);
94+
expect(
95+
url.has(
96+
ManagedIdentityUserAssignedIdQueryParameterNames.MANAGED_IDENTITY_CLIENT_ID_2017
97+
)
98+
).toBe(false);
8199
});
82100
test("acquires a User Assigned Resource Id token", async () => {
83101
const sendGetRequestAsyncSpy: jest.SpyInstance = jest.spyOn(

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)