Skip to content

Commit 65db2f0

Browse files
author
Prithvi Kanherkar
committed
Adding signature validation test for pop tokens
1 parent 8916635 commit 65db2f0

File tree

4 files changed

+44
-12
lines changed

4 files changed

+44
-12
lines changed

samples/msal-browser-samples/VanillaJSTestApp2.0/app/pop/graph.js

+6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ function callMSGraph(endpoint, accessToken, callback) {
2424
.catch(error => console.log(error));
2525
}
2626

27+
let popToken = "";
2728
function callPopResource(endpoint, method, accessToken, callback) {
2829
const headers = new Headers();
2930
const authHeader = `PoP ${accessToken}`;
@@ -49,6 +50,7 @@ async function popRequest() {
4950
const response = await getTokenPopup(loginRequest, currentAcc).catch(error => {
5051
console.log(error);
5152
});
53+
popToken = response.accessToken;
5254
callPopResource(popConfig.endpoint, "POST", response.accessToken, updateUI);
5355
}
5456
}
@@ -59,6 +61,7 @@ async function seeProfile() {
5961
const response = await getTokenPopup(loginRequest, currentAcc).catch(error => {
6062
console.log(error);
6163
});
64+
popToken = response.accessToken;
6265
callMSGraph(graphConfig.graphMeEndpoint, response.accessToken, updateUI);
6366
profileButton.style.display = "none";
6467
}
@@ -70,6 +73,7 @@ async function readMail() {
7073
const response = await getTokenPopup(tokenRequest, currentAcc).catch(error => {
7174
console.log(error);
7275
});
76+
popToken = response.accessToken;
7377
callMSGraph(graphConfig.graphMailEndpoint, response.accessToken, updateUI);
7478
mailButton.style.display = "none";
7579
}
@@ -81,6 +85,7 @@ async function seeProfileRedirect() {
8185
const response = await getTokenRedirect(loginRequest, currentAcc).catch(error => {
8286
console.log(error);
8387
});
88+
popToken = response.accessToken;
8489
callMSGraph(graphConfig.graphMeEndpoint, response.accessToken, updateUI);
8590
profileButton.style.display = "none";
8691
}
@@ -92,6 +97,7 @@ async function readMailRedirect() {
9297
const response = await getTokenRedirect(tokenRequest, currentAcc).catch(error => {
9398
console.log(error);
9499
});
100+
popToken = response.accessToken;
95101
callMSGraph(graphConfig.graphMailEndpoint, response.accessToken, updateUI);
96102
mailButton.style.display = "none";
97103
}

samples/msal-browser-samples/VanillaJSTestApp2.0/app/pop/test/browser.spec.ts

+37
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { BrowserCacheUtils } from "../../../../../e2eTestUtils/BrowserCacheTestU
66
import { LabApiQueryParams } from "../../../../../e2eTestUtils/LabApiQueryParams";
77
import { AzureEnvironments, AppTypes } from "../../../../../e2eTestUtils/Constants";
88
import { LabClient } from "../../../../../e2eTestUtils/LabClient";
9+
import { JWK, JWT } from "jose";
910

1011
const SCREENSHOT_BASE_FOLDER_NAME = `${__dirname}/screenshots`;
1112
const SAMPLE_HOME_URL = "http://localhost:30662/";
@@ -74,4 +75,40 @@ describe("Browser tests", function () {
7475
await context.close();
7576
await browser.close();
7677
});
78+
79+
it("Performs loginRedirect", async () => {
80+
const testName = "redirectBaseCase";
81+
const screenshot = new Screenshot(`${SCREENSHOT_BASE_FOLDER_NAME}/${testName}`);
82+
// Home Page
83+
await screenshot.takeScreenshot(page, "samplePageInit");
84+
// Click Sign In
85+
await page.click("#SignIn");
86+
await screenshot.takeScreenshot(page, "signInClicked");
87+
// Click Sign In With Redirect
88+
await page.click("#loginRedirect");
89+
// Enter credentials
90+
await enterCredentials(page, screenshot);
91+
// Wait for return to page
92+
await page.waitForNavigation({ waitUntil: "networkidle0"});
93+
await screenshot.takeScreenshot(page, "samplePageLoggedIn");
94+
await page.click("#popRequest");
95+
const tokenStore = await BrowserCache.getTokens();
96+
expect(tokenStore.idTokens).to.be.length(1);
97+
expect(tokenStore.accessTokens).to.be.length(1);
98+
expect(tokenStore.refreshTokens).to.be.length(1);
99+
const cachedAccount = await BrowserCache.getAccountFromCache(tokenStore.idTokens[0]);
100+
const defaultCachedToken = await BrowserCache.accessTokenForScopesExists(tokenStore.accessTokens, ["openid", "profile", "user.read"]);
101+
expect(cachedAccount).to.not.be.null;
102+
expect(defaultCachedToken).to.be.true;
103+
// Check pop token
104+
const token: string = await page.evaluate(() => window.eval("popToken"));
105+
const decodedToken: any = JWT.decode(token);
106+
const pubKey = decodedToken.cnf.jwk;
107+
const pubKeyJwk = JWK.asKey(pubKey);
108+
expect(JWT.verify(token, pubKeyJwk)).to.deep.eq(decodedToken);
109+
110+
// Expected 5 since the pop request will fail
111+
const storage = await BrowserCache.getWindowStorage();
112+
expect(Object.keys(storage).length).to.be.eq(5);
113+
});
77114
});

samples/msal-browser-samples/VanillaJSTestApp2.0/app/pop/validatePopToken.js

-10
This file was deleted.

samples/msal-browser-samples/VanillaJSTestApp2.0/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
"start": "node server.js",
99
"build:package": "cd ../../../lib/msal-browser && npm run build:all",
1010
"start:build": "npm run build:package && npm start",
11-
"test:e2e": "ts-node ./testRunner.ts",
12-
"test:pop": "node ./app/pop/validatePopToken.js"
11+
"test:e2e": "ts-node ./testRunner.ts"
1312
},
1413
"dependencies": {
1514
"@azure/identity": "^1.0.2",

0 commit comments

Comments
 (0)