8000 Assign fragment after replace history with the full saved URL by rmartinc · Pull Request #206 · keycloak/keycloak-js · GitHub
[go: up one dir, main page]

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions lib/keycloak.js
Original file line number Diff line number Diff line change
Expand Up @@ -802,13 +802,19 @@ export default class Keycloak {
async #processInit (initOptions) {
const callback = this.#parseCallback(window.location.href)

if (callback?.redirectUri) {
window.history.replaceState(window.history.state, '', callback.redirectUri)
}

if (callback && callback.valid) {
await this.#setupCheckLoginIframe()
await this.#processCallback(callback)

if (callback.redirectUri) {
if (new URL(callback.redirectUri).hash) {
window.history.replaceState(window.history.state, '', stripHash(callback.redirectUri))
window.location.assign(callback.redirectUri)
} else {
window.history.replaceState(window.history.state, '', callback.redirectUri)
}
}

return
}

Expand Down
83 changes: 83 additions & 0 deletions test/app/public/fragment.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Keycloak JS Tests</title>
<meta name="viewport" content="width=device-width">
<meta name="color-scheme" content="light dark">
<script type="importmap">
{
"imports": {
"keycloak-js": "./keycloak.js"
}
}
</script>
<link rel="modulepreload" href="./keycloak.js">
</head>
<body>
<script type="module">
// Expose Keycloak constructor globally so that the tests can access it.
import Keycloak from 'keycloak-js'
globalThis.Keycloak = Keycloak
</script>

<h2>Index</h2>
<ol>
<li><a href="#fragment1">fragment 1</a></li>
<li><a href="#fragment2">fragment 2</a></li>
<li><a href="#fragment3">fragment 3</a></li>
<li><a href="#fragment4">fragment 4</a></li>
<li><a href="#fragment5">fragment 5</a></li>
<li><a href="#fragment6">fragment 6</a></li>
<li><a href="#fragment7">fragment 7</a></li>
<li><a href="#fragment8">fragment 8</a></li>
<li><a href="#fragment9">fragment 9</a></li>
</ol>

<h2 id="fragment1">Fragment 1</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment2">Fragment 2</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment3">Fragment 3</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro 8000 explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment4">Fragment 4</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment5">Fragment 5</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment6">Fragment 6</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment7">Fragment 7</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment8">Fragment 8</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

<h2 id="fragment9">Fragment 9</h2>
<p>Lorem ipsum dolor sit amet. Cum quaerat soluta id officiis quasi vel fugiat impedit est laborum quia. Id porro explicabo et unde cumque et provident accusamus ea vero placeat vel explicabo expedita 33 facilis cupiditate et odio blanditiis.</p>
<p>Et blanditiis nostrum qui quia facilis ut cumque animi. Ut voluptate placeat sit omnis rerum aut impedit consequatur sed obcaecati consequatur. Sit porro consequatur quo dolorem galisum qui recusandae praesentium non iste eveniet sed dolor obcaecati cum commodi obcaecati.</p>
<p>Vel voluptas explicabo aut minima atque ut excepturi minima qui debitis omnis. Sed nostrum inventore qui repudiandae doloremque sit officiis tempore ut alias fugiat est incidunt voluptate et natus labore a sint deserunt.</p>

</body>
</html>
23 changes: 23 additions & 0 deletions test/tests/login.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,26 @@ test("logs in and out with onLoad set to 'check-sso'", async ({ page, appUrl, au
await executor.reload()
expect(await executor.initializeAdapter(initOptions, true)).toBe(true)
})

test('logs in and out with fragment', async ({ page, appUrl, authServerUrl }) => {
const { executor } = await createTestBed(page, {
appUrl: new URL(appUrl.toString() + 'fragment.html#fragment9'),
authServerUrl
})
const initOptions = executor.defaultInitOptions()
// Initially, no user should be authenticated.
expect(await executor.initializeAdapter(initOptions)).toBe(false)
expect(await executor.isAuthenticated()).toBe(false)
await executor.login()
await executor.submitLoginForm()
// After triggering a login, the user should be authenticated.
expect(await executor.initializeAdapter(initOptions)).toBe(true)
expect(await executor.isAuthenticated()).toBe(true)
// The fragment should be clicked and page scrolled to bottom
const scrollY = await page.evaluate(() => window.scrollY)
expect(scrollY).toBeGreaterThan(0)
await executor.logout()
// After logging out, the user should no longer be authenticated.
expect(await executor.initializeAdapter(initOptions)).toBe(false)
expect(await executor.isAuthenticated()).toBe(false)
})
0