{"id":61890,"date":"2020-08-26T15:36:45","date_gmt":"2020-08-26T15:36:45","guid":{"rendered":"https:\/\/www.baeldung.com\/?p=86233"},"modified":"2020-08-26T15:36:45","modified_gmt":"2020-08-26T15:36:45","slug":"customizing-the-login-page-for-keycloak","status":"publish","type":"post","link":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/2020\/08\/26\/customizing-the-login-page-for-keycloak\/","title":{"rendered":"Customizing the Login Page for Keycloak"},"content":{"rendered":"<p class=\"syndicated-attribution\"><meta name= \\\"keywords \\\" content= \\\"\u96fb\u5b50\u8a08\u7b97\u6a5f, \u6559\u80b2, IT \u96fb\u8166\u73ed,\u96fb\u8166\u88dc\u7fd2\uff0c \u96fb\u8166\u73ed\uff0c \u5bb6\u6559\uff0c \u79c1\u4eba\u8001\u5e2b\uff0c \u8cc7\u8a0a\u6280\u8853\uff0c \u7a0b\u5e8f\u8a2d\u8a08\uff0c \u96fb\u5b50\u8a08\u7b97\u6a5f\uff0c \u904a\u6232\uff0c \u860b\u679c\uff0c \u96fb\u5f71\uff0c \u8a08\u7b97\u6a5f\uff0c\u7de8\u78bc\uff0c Java\uff0c C\/C++\uff0c JavaScript\uff0c PHP\uff0c HTML\uff0c CSS\uff0c MySQL\uff0c mobile\uff0c Android\uff0c \u52d5\u6f2b\uff0c Python\uff0c teacher\uff0c \u88dc\u7fd2\uff0c \u96fb\u8166\u88dc\u7fd2 \u8cc7\u8a0a, \u7535\u5b50\u8ba1\u7b97\u673a, IT ,Game, apple, movie, Computer,student,Java,\u6559\u80b2, ,\u5b66\u751f, \u5b66\u4e60, learn, \u6559\u5b66,  Android, apple,anime, animation, \u4fe1\u606f\u6280\u672f, \u7a0b\u5e8f\u8bbe\u8ba1, \u79fb\u52a8\u7535\u8bdd, \u8cc7\u8a0a\u79d1\u6280,Game, Jeu, Juego,Call Of Duty ,\u4f7f\u547d\u53ec\u559a , \u6e38\u620f, \u7535\u5b50\u6e38\u620f,, \u591a\u4eba\u7535\u5b50\u6e38\u620f, \u7f51\u7edc\u6e38\u620f\uff0conline\uff0conline game, \u624b\u673a\u6e38\u620f, mobile \\\"><\/p>\n<h2  data-id=\"overview\">1. Overview<\/h2>\n<div class=\"bd-anchor\" id=\"overview\"><\/div>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.keycloak.org\/\">Keycloak<\/a> is a third-party authorization server used to manage our web or mobile applications&#8217; authentication and authorization requirements. It uses a default login page to sign-in users on our app&#8217;s behalf.<\/p>\n<p>In this tutorial, we&#8217;ll focus on <strong>how we can customize the login page for our Keycloak server<\/strong> so that we can have a different look and feel for it. We&#8217;ll see this for both standalone as well as embedded servers.<\/p>\n<p>We&#8217;ll build on top of <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-keycloak-custom-themes\">customizing themes for the Keycloak tutorial<\/a> to do that.<\/p>\n<h2  data-id=\"standalone\">2. Customizing a Standalone Keycloak Server<\/h2>\n<div class=\"bd-anchor\" id=\"standalone\"><\/div>\n<p>Continuing with our example of the\u00a0<a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-keycloak-custom-themes#default-themes\"><em>custom<\/em><\/a>\u00a0theme, let&#8217;s see the standalone server first.<\/p>\n<h3  data-id=\"admin-console\">2.1. Admin Console Settings<\/h3>\n<div class=\"bd-anchor\" id=\"admin-console\"><\/div>\n<p>To start the server, let&#8217;s navigate to the directory where our Keycloak distribution is kept, and run this command from its <em>bin<\/em> folder:<\/p>\n<pre><code class=\"language-bash\">.\/standalone.sh -Djboss.socket.binding.port-offset=100<\/code><\/pre>\n<p>Once the server is started, we only need to refresh the page to see our changes reflected, thanks to the modifications we previously made to the\u00a0<a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-keycloak-custom-themes#customization-example\"><em>standalone.xml<\/em><\/a>.<\/p>\n<p>Now let&#8217;s create a new folder, named\u00a0<em>login<\/em>, inside the <em>themes\/custom<\/em> directory. To keep things simple, we&#8217;ll first copy all the contents of the\u00a0<em>themes\/keycloak\/login<\/em> directory here. This is the default login page theme.<\/p>\n<p>Then, we&#8217;ll go to the <a href=\"http:\/\/localhost:8180\/auth\/admin\">admin console<\/a>, key-in the\u00a0<em>initial1<\/em>\/<em>zaq1!QAZ <\/em>credentials and go to the\u00a0<em>Themes<\/em>\u00a0tab for our realm:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86238 size-large\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1-1024x472.png\" alt=\"\" width=\"580\" height=\"267\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1-1024x472.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1-300x138.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1-768x354.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1-100x46.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/admin_console-1536x708-1.png 1536w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>We&#8217;ll select <em>custom<\/em> for the <em>Login Theme<\/em> and save our changes.<\/p>\n<p>With that set, we can now try some customizations. But before that, let&#8217;s have a look at the default <a href=\"http:\/\/localhost:8180\/auth\/realms\/SpringBootKeycloak\/protocol\/openid-connect\/auth?response_type=code&#038;client_id=login-app&#038;scope=openid&#038;redirect_uri=http:\/\/localhost:8081\/\">login page<\/a>:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86237 size-large\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1-1024x776.png\" alt=\"\" width=\"580\" height=\"440\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1-1024x776.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1-300x227.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1-768x582.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1-100x76.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/default_loginpage-1.png 1512w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3  data-id=\"customization\">2.2. Adding Customizations<\/h3>\n<div class=\"bd-anchor\" id=\"customization\"><\/div>\n<p>Now let&#8217;s say we need to change the background. For that, we&#8217;ll open <em>login\/resources\/css\/login.css<\/em> and change the class definition:<\/p>\n<pre><code class=\"language-css\">.login-pf body {\r\n    background: #39a5dc;\r\n    background-size: cover;\r\n    height: 100%;\r\n}<\/code><\/pre>\n<p>To see the effect, let&#8217;s refresh the page:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86236 size-large\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1-1024x844.png\" alt=\"\" width=\"580\" height=\"478\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1-1024x844.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1-300x247.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1-768x633.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1-100x82.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_bgchange-1.png 1342w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Next, let&#8217;s try to change the labels for the username and password.<\/p>\n<p>To achieve that, we need to create a new file, <em>messages_en.properties<\/em> in the\u00a0<em>theme\/login\/messages <\/em>folder. This file overrides the default message bundle being used for the given properties:<\/p>\n<pre><code class=\"language-javascript\">usernameOrEmail=Enter Username:\r\npassword=Enter Password:<\/code><\/pre>\n<p>To test, again refresh the page:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86235 size-large\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange-1024x878.png\" alt=\"\" width=\"580\" height=\"497\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange-1024x878.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange-300x257.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange-768x658.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange-100x86.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_labelchange.png 1318w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Suppose we want to change the entire HTML or a part of it, we&#8217;ll need to override the freemarker templates that Keycloak uses by default. The default templates for the login page are kept in the <em>base\/login<\/em> directory.<\/p>\n<p>Let&#8217;s say we want <em>WELCOME TO BAELDUNG<\/em> to be displayed in place of <em>SPRINGBOOTKEYCLOAK<\/em>.<\/p>\n<p>For that, we&#8217;ll need to copy <em>base\/login\/template.ftl<\/em> to our <em>custom\/login<\/em> folder.<\/p>\n<p>In the copied file, change the line:<\/p>\n<pre><code class=\"language-html\">&lt;div id=\"kc-header-wrapper\" class=\"${properties.kcHeaderWrapperClass!}\"&gt;\r\n    ${kcSanitize(msg(\"loginTitleHtml\",(realm.displayNameHtml!'')))?no_esc}\r\n&lt;\/div&gt;<\/code><\/pre>\n<p>To:<\/p>\n<pre><code class=\"language-html\">&lt;div id=\"kc-header-wrapper\" class=\"${properties.kcHeaderWrapperClass!}\"&gt;\r\n    WELCOME TO BAELDUNG\r\n&lt;\/div&gt;<\/code><\/pre>\n<p>The login page would now display our custom message instead of the realm name.<\/p>\n<h2  data-id=\"embedded\">3. Customizing an Embedded Keycloak Server<\/h2>\n<div class=\"bd-anchor\" id=\"embedded\"><\/div>\n<p>The first step here is to add all the artifacts we changed for the standalone server to the source code of our embedded authorization server.<\/p>\n<p>So, let&#8217;s create a new folder <em>login<\/em> inside <em>src\/main\/resources\/themes\/custom<\/em> with these contents:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/folder_Structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86239 \" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/folder_Structure.png\" alt=\"\" width=\"398\" height=\"465\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/folder_Structure.png 560w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/folder_Structure-257x300.png 257w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/folder_Structure-100x117.png 100w\" sizes=\"(max-width: 398px) 100vw, 398px\" \/><\/a><\/p>\n<p>Now all we need to do is to add instruction in our realm definition file, <em>baeldung-realm.json<\/em> so that <em>custom<\/em> is used for our login theme type:<\/p>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-json\">\"loginTheme\": \"custom\",<\/code><\/pre>\n<p>We&#8217;ve already <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-keycloak-custom-themes#redirection\">redirected to the <em>custom<\/em> theme directory<\/a> so that our server knows from where to pick up the theme files for the login page.<\/p>\n<p>For testing, let&#8217;s hit the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~8084\/\">login page<\/a>:<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-86234 size-large\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded-1024x872.png\" alt=\"\" width=\"580\" height=\"494\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded-1024x872.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded-300x256.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded-768x654.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded-100x85.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/loginpage_embedded.png 1526w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>As we can see, all the customizations done earlier for the standalone server, such as the background, label names, and page title, are appearing here.<\/p>\n<h2  data-id=\"bypass-keycloak\">4. Bypassing Keycloak Login Page<\/h2>\n<div class=\"bd-anchor\" id=\"bypass-keycloak\"><\/div>\n<p>Technically, we can completely bypass the Keycloak login page by using the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/oauth.net\/2\/grant-types\/password\/\">password or direct access grant<\/a> flow. However, <strong>it&#8217;s strongly recommended that this grant type shouldn&#8217;t be used at all.<\/strong><\/p>\n<p>In this case, there is no intermediary step of getting an authorization code, and then receiving the access token in exchange. Instead, we can directly send the user credentials via a REST API call and get the access token in response.<\/p>\n<p>This effectively means that we can use our login page to collect the user&#8217;s id and password, and along with the client id and secret, send it to Keycloak in a POST to its <em>token<\/em> endpoint.<\/p>\n<p>But again, since Keycloak provides a rich feature set of login options &#8211; such as remember me, password reset, and MFA &#8211; to name a few, there is little reason to bypass it.<\/p>\n<h2  data-id=\"conclusion\">5. Conclusion<\/h2>\n<div class=\"bd-anchor\" id=\"conclusion\"><\/div>\n<p>In this tutorial, <strong>we learned how to change the default login page for Keycloak and add our customizations<\/strong>.<\/p>\n<p>We saw this for both a standalone and an embedded instance.<\/p>\n<p>Lastly, we briefly went over how to bypass Keycloak&#8217;s login page entirely and why not to do that.<\/p>\n<p>As always, the source code is available <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/Baeldung\/spring-security-oauth\/tree\/master\/oauth-jwt\">over on GitHub<\/a>.<\/p>\n<p><Img align=\"left\" border=\"0\" height=\"1\" width=\"1\" alt=\"\" style=\"border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;\" hspace=\"0\" src=\"https:\/\/feeds.feedblitz.com\/~\/i\/634510558\/0\/baeldung\"><\/p>\n<div style=\"clear:both;padding-top:0.2em;\"><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634510558\/baeldung,https%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2020%2F08%2Fadmin_console-1536x708-1-1024x472.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/keycloak-custom-login-page#respond\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&#160;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/keycloak-custom-login-page\/feed\/\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&#160;<\/div>\n\n<p class=\"syndicated-attribution\"><figure class= \\\"wp-block-image alignnone \\\"><img src= \\\"http:\/\/itteacheritfreelance.hk\/test\/wordpress\/wp-content\/uploads\/2016\/05\/logo2-2.png\\\" alt=\\\"IT\u96fb\u8166\u88dc\u7fd2 java\u88dc\u7fd2 \u70ba\u5927\u5bb6\u914d\u5c0d\u96fb\u8166\u88dc\u7fd2,IT freelance, \u79c1\u4eba\u8001\u5e2b, PHP\u88dc\u7fd2,CSS\u88dc\u7fd2,XML,Java\u88dc\u7fd2,MySQL\u88dc\u7fd2,graphic design\u88dc\u7fd2,\u4e2d\u5c0f\u5b78ICT\u88dc\u7fd2,\u4e00\u5c0d\u4e00\u79c1\u4eba\u88dc\u7fd2\u548cFreelance\u81ea\u7531\u5de5\u4f5c\u914d\u5c0d\u3002\\\"\/><figcaption>\u7acb\u523b\u8a3b\u518a\u53ca\u5831\u540d\u96fb\u8166\u88dc\u7fd2\u8ab2\u7a0b\u5427!<\/figcaption><\/figure>\r\n<\/br>Find A Teacher Form:\r\n<\/br>https:\/\/docs.google.com\/forms\/d\/1vREBnX5n262umf4wU5U2pyTwvk9O-JrAgblA-wH9GFQ\/viewform?edit_requested=true#responses\r\n<\/br><\/br>Email:\r\n<\/br>public1989two@gmail.com<br><br><br><br><br><br><br>\r\n<a href=www.itsec.hk style=color:#FFFFFF;>www.itsec.hk<\/a><br>\r\n<a href=\\\"www.itsec.vip\\\" style=color:#FFFFFF;>www.itsec.vip<\/a><br>\r\n<a href=\\\"www.itseceu.uk\\\" style=color:#FFFFFF;>www.itseceu.uk<\/a><br><\/p>","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Learn how to change the default login page for Keycloak and add our customizations.<\/p>\n<div><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\"><\/a>&nbsp;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\"><\/a>&nbsp;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634510558\/baeldung,https%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2020%2F08%2Fadmin_console-1536x708-1-1024x472.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\"><\/a>&nbsp;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\"><\/a>&nbsp;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\"><\/a>&nbsp;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634510558\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\"><\/a>&nbsp;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/keycloak-custom-login-page#respond\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&nbsp;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/keycloak-custom-login-page\/feed\/\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&nbsp;<\/div>\n<\/div>","protected":false},"author":770,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"Customizing the Login Page for Keycloak - ITTeacherITFreelance.hk","description":"Learn how to change the default login page for Keycloak and add our customizations. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"},"footnotes":""},"categories":[6],"tags":[4855],"_links":{"self":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/61890"}],"collection":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/770"}],"replies":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=61890"}],"version-history":[{"count":8,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/61890\/revisions"}],"predecessor-version":[{"id":65417,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/61890\/revisions\/65417"}],"wp:attachment":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=61890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=61890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=61890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}