-
-
Notifications
You must be signed in to change notification settings - Fork 201
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
40bb831
commit 3cbfaab
Showing
12 changed files
with
184 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#syntax=docker/dockerfile:1.4 | ||
|
||
|
||
|
||
|
||
# Versions | ||
FROM bitnami/keycloak:22-debian-11 AS keycloak_upstream | ||
|
||
|
||
# The different stages of this Dockerfile are meant to be built into separate images | ||
# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage | ||
# https://docs.docker.com/compose/compose-file/#target | ||
|
||
|
||
# Keycloak image | ||
FROM keycloak_upstream AS keycloak | ||
|
||
COPY --link themes/api-platform-demo /opt/bitnami/keycloak/themes/api-platform-demo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
112 changes: 112 additions & 0 deletions
112
helm/api-platform/keycloak/themes/api-platform-demo/login/login.ftl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
<#import "template.ftl" as layout> | ||
<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','password') displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled??; section> | ||
<#if section = "header"> | ||
${msg("loginAccountTitle")} | ||
<#elseif section = "form"> | ||
<div id="kc-form"> | ||
<div id="kc-form-wrapper"> | ||
<#if realm.password> | ||
<form id="kc-form-login" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post"> | ||
<#if !usernameHidden??> | ||
<div class="${properties.kcFormGroupClass!}"> | ||
<p> | ||
Login as user: [email protected] / Pa55w0rd<br /> | ||
Login as admin: [email protected] / Pa55w0rd | ||
</p> | ||
|
||
<label for="username" class="${properties.kcLabelClass!}"><#if !realm.loginWithEmailAllowed>${msg("username")}<#elseif !realm.registrationEmailAsUsername>${msg("usernameOrEmail")}<#else>${msg("email")}</#if></label> | ||
|
||
<input tabindex="1" id="username" class="${properties.kcInputClass!}" name="username" value="${(login.username!'')}" type="text" autofocus autocomplete="off" | ||
aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>" | ||
/> | ||
|
||
<#if messagesPerField.existsError('username','password')> | ||
<span id="input-error" class="${properties.kcInputErrorMessageClass!}" aria-live="polite"> | ||
${kcSanitize(messagesPerField.getFirstError('username','password'))?no_esc} | ||
</span> | ||
</#if> | ||
|
||
</div> | ||
</#if> | ||
|
||
<div class="${properties.kcFormGroupClass!}"> | ||
<label for="password" class="${properties.kcLabelClass!}">${msg("password")}</label> | ||
|
||
<input tabindex="2" id="password" class="${properties.kcInputClass!}" name="password" type="password" autocomplete="off" | ||
aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>" | ||
/> | ||
|
||
<#if usernameHidden?? && messagesPerField.existsError('username','password')> | ||
<span id="input-error" class="${properties.kcInputErrorMessageClass!}" aria-live="polite"> | ||
${kcSanitize(messagesPerField.getFirstError('username','password'))?no_esc} | ||
</span> | ||
</#if> | ||
|
||
</div> | ||
|
||
<div class="${properties.kcFormGroupClass!} ${properties.kcFormSettingClass!}"> | ||
<div id="kc-form-options"> | ||
<#if realm.rememberMe && !usernameHidden??> | ||
<div class="checkbox"> | ||
<label> | ||
<#if login.rememberMe??> | ||
<input tabindex="3" id="rememberMe" name="rememberMe" type="checkbox" checked> ${msg("rememberMe")} | ||
<#else> | ||
<input tabindex="3" id="rememberMe" name="rememberMe" type="checkbox"> ${msg("rememberMe")} | ||
</#if> | ||
</label> | ||
</div> | ||
</#if> | ||
</div> | ||
<div class="${properties.kcFormOptionsWrapperClass!}"> | ||
<#if realm.resetPasswordAllowed> | ||
<span><a tabindex="5" href="${url.loginResetCredentialsUrl}">${msg("doForgotPassword")}</a></span> | ||
</#if> | ||
</div> | ||
|
||
</div> | ||
|
||
<div id="kc-form-buttons" class="${properties.kcFormGroupClass!}"> | ||
<input type="hidden" id="id-hidden-input" name="credentialId" <#if auth.selectedCredential?has_content>value="${auth.selectedCredential}"</#if>/> | ||
<input tabindex="4" class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" name="login" id="kc-login" type="submit" value="${msg("doLogIn")}"/> | ||
</div> | ||
</form> | ||
</#if> | ||
</div> | ||
|
||
</div> | ||
<#elseif section = "info" > | ||
<#if realm.password && realm.registrationAllowed && !registrationDisabled??> | ||
<div id="kc-registration-container"> | ||
<div id="kc-registration"> | ||
<span>${msg("noAccount")} <a tabindex="6" | ||
href="${url.registrationUrl}">${msg("doRegister")}</a></span> | ||
</div> | ||
</div> | ||
</#if> | ||
<#elseif section = "socialProviders" > | ||
<#if realm.password && social.providers??> | ||
<div id="kc-social-providers" class="${properties.kcFormSocialAccountSectionClass!}"> | ||
<hr/> | ||
<h4>${msg("identity-provider-login-label")}</h4> | ||
|
||
<ul class="${properties.kcFormSocialAccountListClass!} <#if social.providers?size gt 3>${properties.kcFormSocialAccountListGridClass!}</#if>"> | ||
<#list social.providers as p> | ||
<li> | ||
<a id="social-${p.alias}" class="${properties.kcFormSocialAccountListButtonClass!} <#if social.providers?size gt 3>${properties.kcFormSocialAccountGridItem!}</#if>" | ||
type="button" href="${p.loginUrl}"> | ||
<#if p.iconClasses?has_content> | ||
<i class="${properties.kcCommonLogoIdP!} ${p.iconClasses!}" aria-hidden="true"></i> | ||
<span class="${properties.kcFormSocialAccountNameClass!} kc-social-icon-text">${p.displayName!}</span> | ||
<#else> | ||
<span class="${properties.kcFormSocialAccountNameClass!}">${p.displayName!}</span> | ||
</#if> | ||
</a> | ||
</li> | ||
</#list> | ||
</ul> | ||
</div> | ||
</#if> | ||
</#if> | ||
|
||
</@layout.registrationLayout> |
2 changes: 2 additions & 0 deletions
2
helm/api-platform/keycloak/themes/api-platform-demo/login/theme.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
parent=keycloak | ||
import=common/keycloak |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,9 @@ test.describe("User authentication", () => { | |
await page.getByText("Log in").waitFor({ state: "hidden" }); | ||
// @ts-ignore assert declared on test.ts | ||
await expect(page).toBeOnLoginPage(); | ||
await expect(page.locator("#kc-header-wrapper")).toContainText("API Platform - Demo"); | ||
await expect(page.locator("#kc-form-login")).toContainText("Login as user: [email protected]"); | ||
await expect(page.locator("#kc-form-login")).toContainText("Login as admin: [email protected]"); | ||
await userPage.login(); | ||
|
||
await expect(page.getByText("Log in")).toHaveCount(0); | ||
|
@@ -26,5 +29,13 @@ test.describe("User authentication", () => { | |
|
||
await expect(page.getByText("Log in")).toBeVisible(); | ||
await expect(page.getByText("Sign out")).toHaveCount(0); | ||
|
||
// I should be logged out from Keycloak also | ||
await page.getByText("Log in").click(); | ||
// @ts-ignore assert declared on test.ts | ||
await expect(page).toBeOnLoginPage(); | ||
await expect(page.locator("#kc-header-wrapper")).toContainText("API Platform - Demo"); | ||
await expect(page.locator("#kc-form-login")).toContainText("Login as user: [email protected]"); | ||
await expect(page.locator("#kc-form-login")).toContainText("Login as admin: [email protected]"); | ||
}); | ||
}); |