{"id":11653,"date":"2024-05-07T14:30:21","date_gmt":"2024-05-07T14:30:21","guid":{"rendered":"https:\/\/predictly.se\/keycloak-part-1-installation-and-configuration\/"},"modified":"2024-05-08T11:46:41","modified_gmt":"2024-05-08T11:46:41","slug":"keycloak-part-1-installation-and-configuration","status":"publish","type":"post","link":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/","title":{"rendered":"Keycloak part 1 &#8211; Installation and configuration"},"content":{"rendered":"<p>Keycloak is an open-source Identity and Access Management application. We use Keycloak on several of our customers and love it. In this article series we will discover Keycloak, its capabilities, and explore how to use it. The examples will be in Java (Spring Boot), but the concepts are independent from language and platform.<br \/>\nIn this first chapter we will discuss the concept of IAM (Identity and Access Management) and walk through the installation of prerequisites and Keycloak.<\/p>\n<h4>Identity and Access Management (IAM)<\/h4>\n<p>IAM helps us by handling all the tiresome authentication (WHO?) and authorization (WHAT?) stuff in one single place. This burden can then be lifted from all other applications which, if they have a user they don&#8217;t know, just send it right over to old uncle IAM who will sort it out for the application. One IAM service can be shared between several (typically most, if not all) applications and services, and at a larger scale, companies like Google, Facebook and GitHub offer IAM services for applications and systems everywhere. This is called federated authentication and basically means that your application trusts another entity (company) to authenticate a user for you.<\/p>\n<p>It really works kind of like this:<\/p>\n<ul>\n<li>User tries to access resource.<\/li>\n<li>Resource demands authentication.<\/li>\n<\/ul>\n<ul>\n<li>If user have a valid token. It&#8217;s verified by IAM. Go directly to SUCCESS:<\/li>\n<li>If not, continue.<\/li>\n<li>Resource sends user request to IAM.<\/li>\n<li>IAM tries to authenticate the user.\n<ul>\n<li>If successful user gets a token to prove identity.<\/li>\n<li>If not, user gets a login screen to provide username and password (or other means of authentication).<\/li>\n<\/ul>\n<\/li>\n<li>When authenticated user is sent back to resource with a fresh token from which access can be decided.<\/li>\n<li>SUCCESS: User can access resource!<\/li>\n<\/ul>\n<p>On top of the simple use-case above there are several more use-cases with varying complexity. Understanding all of these is not in scope for this article series but to name a few:<\/p>\n<ul>\n<li>Single sign on.The use case described above. A single point of contact for all authenticating needs.<\/li>\n<li>Identity brokering.IAM acts as a single point for authentication but delegates the actual authentication to one or more external identity providers. IAM acts as a facade for these identity providers.<\/li>\n<li>Identity provisioning.IAM contains the user store used to acquire information of the logged in user (such as authorization information), as well as performing authentication.<\/li>\n<li>User Management.IAM contains means for managing users, roles and general user information as well as user provisioning to\/from the other connected user-stores and identity-providers.<\/li>\n<\/ul>\n<h4>Installing KeyCloak<\/h4>\n<p>Throughout this document I&#8217;m going to assume that you are using an Ubuntu or Debian Linux distribution, however the guide works on most other operating systems as long as the prerequisites are met.<br \/>\nAt the end we will have installed KeyCloak with a PostgreSQL database as Docker containers but first we need some housekeeping and some prerequisites.<\/p>\n<h5>Prerequisites<\/h5>\n<p>You&#8217;ll need <a href=\"https:\/\/www.oracle.com\/java\/technologies\/\" target=\"_blank\" rel=\"noopener\">Java<\/a>, <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener\">Docker<\/a>, <a href=\"https:\/\/git-scm.com\" target=\"_blank\" rel=\"noopener\">Git<\/a> and <a href=\"https:\/\/maven.apache.org\" target=\"_blank\" rel=\"noopener\">Maven<\/a>. Docker will run the container in which KeyCloak resides, Java will compile and execute our code, Maven will build and package, Git will do versioning. Pretty basic.<\/p>\n<h6>Install Java JDK version &gt;= 17<\/h6>\n<p>My favorite is to use <a href=\"https:\/\/sdkman.io\" target=\"_blank\" rel=\"noopener\">SDKMAN<\/a> for keeping track of different SDK\/JDK installations and which installation is active. If you want to install the JDK in some other fashion, that&#8217;s ok and up to you.<\/p>\n<p>Install SDKMAN at the command line, in your home directory.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ curl -s \"https:\/\/get.sdkman.io\" | bash\n<\/pre>\n<p>Follow the on-screen instructions to complete the installation.<\/p>\n<p>In a new terminal do<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsource \"$HOME\/.sdkman\/bin\/sdkman-init.sh\"\n<\/pre>\n<p>Check version of SdkMan to verify<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsdk version\n\n==== BROADCAST =================================================================\n* 2022-10-19: quarkus 2.13.3.Final available on SDKMAN! https:\/\/github.com\/quarkusio\/quarkus\/releases\/tag\/2.13.3.Final\n* 2022-10-18: micronaut 3.7.2 available on SDKMAN!\n* 2022-10-17: gradle 6.9.3 available on SDKMAN!\n================================================================================\n\nSDKMAN 5.16.0\n<\/pre>\n<p>With SdkMan installed we can use it to install Java.<\/p>\n<p>First list all java versions, this will show all java versions available for installation. At command line do<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sdk list java\n\n================================================================================\nAvailable Java Versions for Linux ARM 64bit\n================================================================================\n  Vendor | Use | Version | Dist | Status | Identifier\n--------------------------------------------------------------------------------\n  AdoptOpenJDK | | 8.0.275+1.hs | adpt | | 8.0.275+1.hs-adpt\n  | | 8.0.252.hs | adpt | | 8.0.252.hs-adpt\n  Corretto | | 19 | amzn | | 19-amzn\n  | | 17.0.4 | amzn | | 17.0.4-amzn\n  | | 11.0.16 | amzn | | 11.0.16-amzn\n  | | 8.0.342 | amzn | | 8.0.342-amzn\n  Dragonwell | | 17.0.4 | albba | | 17.0.4-albba\n  | | 11.0.16 | albba | | 11.0.16-albba\n  | | 8.0.345 | albba | | 8.0.345-albba\n  GraalVM | | 22.2.r17 | grl | | 22.2.r17-grl\n  | | 22.2.r11 | grl | | 22.2.r11-grl\n  | | 22.1.0.r17 | grl | | 22.1.0.r17-grl\n  | | 22.1.0.r11 | grl | | 22.1.0.r11-grl\n  | | 22.0.0.2.r17 | grl | | 22.0.0.2.r17-grl\n  | | 22.0.0.2.r11 | grl | | 22.0.0.2.r11-grl\n  | | 21.3.3.r17 | grl | | 21.3.3.r17-grl\n  | | 21.3.3.r11 | grl | | 21.3.3.r11-grl\n  | | 21.3.3.1.r17 | grl | | 21.3.3.1.r17-grl\n  | | 21.3.3.1.r11 | grl | | 21.3.3.1.r11-grl\n<\/pre>\n<p>Find the version you want to install and take a note of the Identifier for that version. Also remember, we want a JDK with version 17 or higher.<\/p>\n<p>Install the java version, I&#8217;m using Oracle version 19. You pick your choice.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sdk install java 19-oracle\n<\/pre>\n<p>The java version is downloaded, installed and configured, ready for using.<\/p>\n<p>There is a lot more to SDKMAN, it really is a magnificent tool. Check out the <a href=\"https:\/\/sdkman.io\" target=\"_blank\" rel=\"noopener\">website<\/a> for more info.<\/p>\n<h6>Install Docker<\/h6>\n<p>Docker is docker. The container manager where we run stuff in containers. This is the plain Jane CLI version. Use the desktop version if you like, it works just as well.<\/p>\n<p>Update the package manager<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\n<\/pre>\n<p>Install dependencies<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get install ca-certificates curl gnupg lsb-release\n<\/pre>\n<p>Add the docker GPG-key.<br \/>\nFirst make the directory to hold apt keys if it&#8217;s not already there.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/etc\/apt\/keyrings\n<\/pre>\n<p>And then add the official key. If you are running some other linux dist (f ex Debian) replace ubuntu in the command below with that dist-name.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\n<\/pre>\n<p>And set up the repository. Same thing here, replace ubuntu with the dist you are running.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ echo \"deb &#x5B;arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null\n<\/pre>\n<p>The repository is all set and it&#8217;s just to install docker<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose\n<\/pre>\n<p>Verify installation by running the hello-world image<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo docker run hello-world\n<\/pre>\n<h6>Install Git<\/h6>\n<p>Git is used for versioning documents on GitHub.<\/p>\n<p>Install the tools at the command line<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\nsudo apt-get install git-all\n<\/pre>\n<p>Verify by<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ git --version\n<\/pre>\n<h6>Install Maven<\/h6>\n<p>Maven will build your code and also download and keep track of all the necessary dependencies.<\/p>\n<p>Install maven at the command line<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\nsudo apt-get install maven\n<\/pre>\n<p>Verify by<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ mvn --version\n<\/pre>\n<h5>Installing KeyCloak<\/h5>\n<p>Open a terminal window and navigate to wherever you want a directory called keycloak-containers. Since this is just a test-installation, maybe your home directory is fine?<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmkdir ~\/keycloak\ncd ~\/keycloak\n<\/pre>\n<p>Clone the keycloak git repository with all the containers<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ git clone https:\/\/github.com\/keycloak\/keycloak-containers\n<\/pre>\n<p>Change directory to keycloak-containers<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ncd ~\/keycloak\/keycloak-containers\n<\/pre>\n<p>Build a docker container tagged as mykeycloak (or anything, really) from the .\/server directory<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sudo docker build -t mykeycloak ~\/keycloak\/keycloak-containers\/server\n<\/pre>\n<p>Create a file called docker-compose.yml in the keycloak-containers directory with the following content:<\/p>\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nversion: '3'\n\nvolumes:\n  postgres_data:\n  driver: local\n\nservices:\n  postgres:\n  image: postgres\n  volumes:\n  - postgres_data:\/var\/lib\/postgresql\/data\n  environment:\n  POSTGRES_DB: keycloak\n  POSTGRES_USER: keycloak\n  POSTGRES_PASSWORD: password\n  ports:\n  - 5432:5432\n  keycloak:\n  image: mykeycloak\n  environment:\n  DB_VENDOR: POSTGRES\n  DB_ADDR: postgres\n  DB_DATABASE: keycloak\n  DB_USER: keycloak\n  DB_SCHEMA: public\n  DB_PASSWORD: password\n  KEYCLOAK_USER: admin\n  KEYCLOAK_PASSWORD: admin\n  ports:\n  - 8091:8080\n  depends_on:\n  - postgres\n<\/pre>\n<p>Start the docker container and the postgresql database. The keycloak container will run at port 8091.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ncd ~\/keycloak\/keycloak-containers\n$ sudo docker-compose up -d\n<\/pre>\n<p>Verify that the containers are running<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sudo docker stats\n<\/pre>\n<p>There, all done. Let&#8217;s get cooking!<br \/>\nOpen a browser to <em>http:\/\/localhost:8091\/auth<\/em><br \/>\nLogin with admin\/admin<\/p>\n<p>And that concludes our first article in this series. In the next article we&#8217;ll use KeyCloak to secure a REST-endpoint.<\/p>\n<p>All the code and examples can be found over at GitHub.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Keycloak is an open-source identity and access management server. This is the first part of our series where we discover Keycloak. The examples are in Java with Spring Boot, but the concepts are general.<\/p>\n","protected":false},"author":1,"featured_media":11454,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"cybocfi_hide_featured_image":"","footnotes":""},"categories":[119,121,122,118],"tags":[],"class_list":["post-11653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-en","category-keycloak-en","category-safety-and-security","category-spring-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Keycloak part 1 - Installation and configuration &#8211; Predictly<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Keycloak part 1 - Installation and configuration &#8211; Predictly\" \/>\n<meta property=\"og:description\" content=\"Keycloak is an open-source identity and access management server. This is the first part of our series where we discover Keycloak. The examples are in Java with Spring Boot, but the concepts are general.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\" \/>\n<meta property=\"og:site_name\" content=\"Predictly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/predictly.se\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-07T14:30:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-08T11:46:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1429\" \/>\n\t<meta property=\"og:image:height\" content=\"888\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Johan Sundqvist\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@predictly_se\" \/>\n<meta name=\"twitter:site\" content=\"@predictly_se\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Johan Sundqvist\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\"},\"author\":{\"name\":\"Johan Sundqvist\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/7234c44549994558df91b40ce4b758cf\"},\"headline\":\"Keycloak part 1 &#8211; Installation and configuration\",\"datePublished\":\"2024-05-07T14:30:21+00:00\",\"dateModified\":\"2024-05-08T11:46:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\"},\"wordCount\":1365,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/predictly.se\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg\",\"articleSection\":[\"Java\",\"Keycloak\",\"Safety and security\",\"Spring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\",\"url\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\",\"name\":\"Keycloak part 1 - Installation and configuration &#8211; Predictly\",\"isPartOf\":{\"@id\":\"https:\/\/predictly.se\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg\",\"datePublished\":\"2024-05-07T14:30:21+00:00\",\"dateModified\":\"2024-05-08T11:46:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage\",\"url\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg\",\"contentUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg\",\"width\":1429,\"height\":888},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/predictly.se\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Okategoriserad\",\"item\":\"https:\/\/predictly.se\/en\/insikter\/okategoriserad\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Keycloak part 1 &#8211; Installation and configuration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/predictly.se\/en\/#website\",\"url\":\"https:\/\/predictly.se\/en\/\",\"name\":\"Predictly\",\"description\":\"Professional IT services\",\"publisher\":{\"@id\":\"https:\/\/predictly.se\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/predictly.se\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/predictly.se\/en\/#organization\",\"name\":\"Predictly\",\"url\":\"https:\/\/predictly.se\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg\",\"contentUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg\",\"width\":532,\"height\":96,\"caption\":\"Predictly\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/predictly.se\",\"https:\/\/x.com\/predictly_se\",\"https:\/\/www.linkedin.com\/company\/predictly\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/7234c44549994558df91b40ce4b758cf\",\"name\":\"Johan Sundqvist\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f5ed2d612d6d45ccca038a8d5e80c0208a54baf0b9b1780ce0b522b2a09c9032?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f5ed2d612d6d45ccca038a8d5e80c0208a54baf0b9b1780ce0b522b2a09c9032?s=96&d=mm&r=g\",\"caption\":\"Johan Sundqvist\"},\"description\":\"Johan Sundqvist.\",\"sameAs\":[\"http:\/\/staging.predictly.se\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Keycloak part 1 - Installation and configuration &#8211; Predictly","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/","og_locale":"en_US","og_type":"article","og_title":"Keycloak part 1 - Installation and configuration &#8211; Predictly","og_description":"Keycloak is an open-source identity and access management server. This is the first part of our series where we discover Keycloak. The examples are in Java with Spring Boot, but the concepts are general.","og_url":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/","og_site_name":"Predictly","article_publisher":"https:\/\/www.facebook.com\/predictly.se","article_published_time":"2024-05-07T14:30:21+00:00","article_modified_time":"2024-05-08T11:46:41+00:00","og_image":[{"width":1429,"height":888,"url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg","type":"image\/jpeg"}],"author":"Johan Sundqvist","twitter_card":"summary_large_image","twitter_creator":"@predictly_se","twitter_site":"@predictly_se","twitter_misc":{"Written by":"Johan Sundqvist","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#article","isPartOf":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/"},"author":{"name":"Johan Sundqvist","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/7234c44549994558df91b40ce4b758cf"},"headline":"Keycloak part 1 &#8211; Installation and configuration","datePublished":"2024-05-07T14:30:21+00:00","dateModified":"2024-05-08T11:46:41+00:00","mainEntityOfPage":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/"},"wordCount":1365,"commentCount":0,"publisher":{"@id":"https:\/\/predictly.se\/en\/#organization"},"image":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage"},"thumbnailUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg","articleSection":["Java","Keycloak","Safety and security","Spring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/","url":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/","name":"Keycloak part 1 - Installation and configuration &#8211; Predictly","isPartOf":{"@id":"https:\/\/predictly.se\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage"},"image":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage"},"thumbnailUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg","datePublished":"2024-05-07T14:30:21+00:00","dateModified":"2024-05-08T11:46:41+00:00","breadcrumb":{"@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#primaryimage","url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg","contentUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/data-2.jpg","width":1429,"height":888},{"@type":"BreadcrumbList","@id":"https:\/\/predictly.se\/en\/keycloak-part-1-installation-and-configuration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/predictly.se\/en\/"},{"@type":"ListItem","position":2,"name":"Okategoriserad","item":"https:\/\/predictly.se\/en\/insikter\/okategoriserad\/"},{"@type":"ListItem","position":3,"name":"Keycloak part 1 &#8211; Installation and configuration"}]},{"@type":"WebSite","@id":"https:\/\/predictly.se\/en\/#website","url":"https:\/\/predictly.se\/en\/","name":"Predictly","description":"Professional IT services","publisher":{"@id":"https:\/\/predictly.se\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/predictly.se\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/predictly.se\/en\/#organization","name":"Predictly","url":"https:\/\/predictly.se\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/","url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg","contentUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg","width":532,"height":96,"caption":"Predictly"},"image":{"@id":"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/predictly.se","https:\/\/x.com\/predictly_se","https:\/\/www.linkedin.com\/company\/predictly\/"]},{"@type":"Person","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/7234c44549994558df91b40ce4b758cf","name":"Johan Sundqvist","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f5ed2d612d6d45ccca038a8d5e80c0208a54baf0b9b1780ce0b522b2a09c9032?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f5ed2d612d6d45ccca038a8d5e80c0208a54baf0b9b1780ce0b522b2a09c9032?s=96&d=mm&r=g","caption":"Johan Sundqvist"},"description":"Johan Sundqvist.","sameAs":["http:\/\/staging.predictly.se"]}]}},"_links":{"self":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/comments?post=11653"}],"version-history":[{"count":1,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11653\/revisions"}],"predecessor-version":[{"id":11664,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11653\/revisions\/11664"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/media\/11454"}],"wp:attachment":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/media?parent=11653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/categories?post=11653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/tags?post=11653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}