<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Amrita Shrestha</title>
    <description>The latest articles on Forem by Amrita Shrestha (@amrita_shrestha_d8cbc9b06).</description>
    <link>https://forem.com/amrita_shrestha_d8cbc9b06</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1872698%2Fc14bd6a4-9ae2-4804-acd7-4c5998633277.png</url>
      <title>Forem: Amrita Shrestha</title>
      <link>https://forem.com/amrita_shrestha_d8cbc9b06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/amrita_shrestha_d8cbc9b06"/>
    <language>en</language>
    <item>
      <title>Integrating oCIS With Keycloak</title>
      <dc:creator>Amrita Shrestha</dc:creator>
      <pubDate>Tue, 20 Aug 2024 08:35:48 +0000</pubDate>
      <link>https://forem.com/jankaritech/integrating-ocis-with-keycloak-5agi</link>
      <guid>https://forem.com/jankaritech/integrating-ocis-with-keycloak-5agi</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/jankaritech/introduction-to-keycloak-5803"&gt;In the previous blog&lt;/a&gt;, we explored the general functionality of Keycloak.&lt;br&gt;
In this blog, I demonstrate how we can integrate &lt;a href="https://owncloud.dev/ocis/" rel="noopener noreferrer"&gt;oCIS&lt;/a&gt;(file-sync and share platform) with Keycloak using the Keycloak WebUI.&lt;br&gt;
This benefits anyone who is interested in getting hands-on experience with Keycloak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Services
&lt;/h2&gt;

&lt;p&gt;Make sure you've installed &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Docker Engine&lt;/a&gt; and &lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before setting up oCIS with Keycloak, it's essential to deploy both oCIS and Keycloak services. I'll describe how to achieve it with &lt;strong&gt;docker compose&lt;/strong&gt;.&lt;br&gt;
oCIS and Keycloak runs behind &lt;strong&gt;Traefik&lt;/strong&gt; as reverse proxy. &lt;strong&gt;Traefik&lt;/strong&gt; generates self-signed certificates for oCIS and Keycloak.&lt;/p&gt;

&lt;p&gt;You have to create a &lt;strong&gt;csp.yaml&lt;/strong&gt; file with the following contents:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;directives&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;child-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;connect-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="c1"&gt;# In contrast to bash and docker the default is given after the | character&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://${KEYCLOAK_DOMAIN|host.docker.internal:8443}'&lt;/span&gt;
  &lt;span class="na"&gt;default-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;none'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;font-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;frame-ancestors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;none'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;frame-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://embed.diagrams.net/'&lt;/span&gt;
  &lt;span class="na"&gt;img-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blob:'&lt;/span&gt;
  &lt;span class="na"&gt;manifest-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;media-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;object-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blob:'&lt;/span&gt;
  &lt;span class="na"&gt;script-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unsafe-inline'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
  &lt;span class="na"&gt;style-src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;self'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unsafe-inline'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can either download the docker code from &lt;a href="https://github.com/amrita-shrestha/keycloak-ocis/blob/master/compose.yaml" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or utilize the code provided below:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: &lt;strong&gt;PROXY_CSP_CONFIG_FILE_LOCATION&lt;/strong&gt; should contain the exact location of a &lt;strong&gt;csp.yaml&lt;/strong&gt; file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  traefik:
    image: traefik:2.11.0
    command:
      [
        "--log.level=ERROR",
        "--api.insecure=true",
        "--api.dashboard=true",
        "--pilot.dashboard=false",
        "--providers.docker=true",
        "--entrypoints.ocis.address=:9200",
        "--entrypoints.keycloak.address=:8443",
        "--providers.docker.exposedbydefault=false",
        "--entrypoints.websecure.http.tls.options=default",
      ]
    ports:
      - 8080:8080
      - 9200:9200
      - 8443:8443
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      traefik.enable: true
      traefik.http.routers.traefik.rule: HostRegexp(`{any:.+}`)
    restart: always

  ocis:
    image: owncloud/ocis:latest # ocis version = v5.0.5
    entrypoint:
      - /bin/sh
    command: ["-c", "ocis init || true; ocis server"]
    environment:
      # Keycloak IDP configuration
      PROXY_AUTOPROVISION_ACCOUNTS: true
      PROXY_ROLE_ASSIGNMENT_DRIVER: oidc
      OCIS_OIDC_ISSUER: https://host.docker.internal:8443/realms/oCIS # ocis is keycloak realm name
      PROXY_OIDC_REWRITE_WELLKNOWN: true
      WEB_OIDC_CLIENT_ID: web
      # general config
      OCIS_URL: https://host.docker.internal:9200
      OCIS_LOG_LEVEL: error
      OCIS_INSECURE: true
      OCIS_ADMIN_USER_ID: ""
      OCIS_EXCLUDE_RUN_SERVICES: idp
      GRAPH_ASSIGN_DEFAULT_USER_ROLE: false
      GRAPH_USERNAME_MATCH: none
      # PROXY
      PROXY_TLS: false
      PROXY_USER_OIDC_CLAIM: preferred_username
      PROXY_USER_CS3_CLAIM: username
      PROXY_CSP_CONFIG_FILE_LOCATION: /etc/ocis/csp.yaml
      KEYCLOAK_DOMAIN: ${KEYCLOAK_DOMAIN:-host.docker.internal:8443}
    volumes:
      - ./csp.yaml:/etc/ocis/csp.yaml
    extra_hosts:
      - host.docker.internal:host-gateway
    labels:
      traefik.enable: true
      traefik.http.routers.ocis.tls: true
      traefik.http.routers.ocis.rule: PathPrefix(`/`)
      traefik.http.routers.ocis.entrypoints: ocis
      traefik.http.services.ocis.loadbalancer.server.port: 9200

  postgres:
    image: postgres:alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: keycloak

  keycloak:
    image: quay.io/keycloak/keycloak:24.0.1
    command: ["start-dev", "--proxy=edge"]
    environment:
      KC_DB: postgres
      KC_DB_URL: "jdbc:postgresql://postgres:5432/keycloak"
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: keycloak
      KC_FEATURES: impersonation
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    extra_hosts:
      - host.docker.internal:host-gateway
    labels:
      traefik.enable: true
      traefik.http.routers.keycloak.tls: true
      traefik.http.routers.keycloak.rule: PathPrefix(`/`)
      traefik.http.routers.keycloak.entrypoints: keycloak
      traefik.http.services.keycloak.loadbalancer.server.port: 8080
    depends_on:
      - postgres

volumes:
  postgres_data:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Save the above code in &lt;strong&gt;compose.yaml&lt;/strong&gt; file locally and run docker command &lt;strong&gt;docker compose up&lt;/strong&gt; in a terminal.&lt;/p&gt;

&lt;p&gt;Docker compose serves three services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;oCIS on &lt;code&gt;https://host.docker.internal:9200&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keycloak on &lt;code&gt;https://host.docker.internal:8443&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Traefik dashboard on &lt;code&gt;http://host.docker.internal:8080/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manual Steps For Setting Up oCIS With Keycloak
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to oCIS url: &lt;code&gt;https://host.docker.internal:9200/&lt;/code&gt;
&amp;gt; Note: The oCIS WebUI will not be accessible until Keycloak and oCIS are fully integrated.
The discovery endpoint is unavailable, which is why the web interface is inaccessible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2FoCIS-Keycloak-UI-setup-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2FoCIS-Keycloak-UI-setup-1.png" alt="oCIS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Keycloak url: &lt;code&gt;https://host.docker.internal:8443/&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2FoCIS-Keycloak-UI-setup-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2FoCIS-Keycloak-UI-setup-2.png" alt="Keycloak"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create new realm:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-realm-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-realm-1.png" alt="create realm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realm name: &lt;code&gt;oCIS&lt;/code&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-realm-2.png" alt="create realm with name `oCIS`"&gt;
&amp;gt; Note: the realm name should be the name provided in the oCIS environment variable: &lt;code&gt;OCIS_OIDC_ISSUER: https://host.docker.internal:8443/realms/oCIS&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Add a new client:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-1.png" alt="client registration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client ID: &lt;code&gt;web&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-2.png" alt="add client"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root URL: &lt;code&gt;https://host.docker.internal:9200&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fclient-registration-3.png" alt="add root url"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add realm roles:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Role name: &lt;code&gt;ocisAdmin&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-realm-role.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-realm-role.png" alt="add realm role"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: oCIS has defined role names that have been documented under &lt;a href="https://owncloud.dev/services/proxy/#automatic-role-assignments" rel="noopener noreferrer"&gt;Automatic Quota Assignments&lt;/a&gt;. So, we can't create the role with a random name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Create a new user:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;With &lt;code&gt;username: admin&lt;/code&gt; and other information:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-1.png" alt="create user"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-2.png" alt="add user information"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-3.png" alt="create password"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fcreate-user-4.png" alt="setup password for user"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role Mapping: Assign &lt;code&gt;ocisAdmin&lt;/code&gt; role&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fassign-role-to-user-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fassign-role-to-user-1.png" alt="assign role"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fasign-role-to-user-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fasign-role-to-user-2.png" alt="assign role to user"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update &lt;code&gt;roles&lt;/code&gt; Client scope: &lt;code&gt;Client Scopes&lt;/code&gt; -&amp;gt; &lt;code&gt;roles&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Mappers&lt;/code&gt; -&amp;gt; &lt;code&gt;realm roles&lt;/code&gt; -&amp;gt; &lt;code&gt;Token Claim Name=roles&lt;/code&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2Fupdate-roles.png" alt="update-roles"&gt;
&amp;gt; Note: oCIS default role_claim is 'roles'&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Go to url &lt;code&gt;https://host.docker.internal:9200/&lt;/code&gt;, reload if already opened
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jankaritech.com%2Fsrc%2Fassets%2FKeycloak%2Fimages%2FoCIS-Keycloak%2FoCIS-Keycloak-login.png" alt="login to oCIS with Keycloak"&gt;
Enter &lt;code&gt;username: admin&lt;/code&gt; and &lt;code&gt;password: admin&lt;/code&gt; to log into oCIS&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setting Up oCIS With Keycloak Using JSON Files
&lt;/h3&gt;

&lt;p&gt;Keycloak provides an &lt;a href="https://www.keycloak.org/server/importExport" rel="noopener noreferrer"&gt;Importing and Exporting Realms&lt;/a&gt; feature. If we have JSON configuration files, then we can avoid manually setting services in Keycloak.&lt;br&gt;
oCIS provides documentation to set up &lt;a href="https://owncloud.dev/ocis/deployment/ocis_keycloak/" rel="noopener noreferrer"&gt;oCIS with Keycloak&lt;/a&gt; which uses JSON configuration.&lt;br&gt;
If you want to automate Keycloak integration with oCIS services, then you can use json files.&lt;/p&gt;

&lt;p&gt;In this blog post, we've talked about putting Keycloak and oCIS together. We've shown how to set them up using &lt;strong&gt;Docker Compose&lt;/strong&gt;, making sure they work smoothly with &lt;strong&gt;Traefik&lt;/strong&gt;.&lt;br&gt;
We've also given step-by-step instructions on setting up oCIS with Keycloak manually, like making realms, adding clients and roles, and creating users.&lt;br&gt;
For those who like using JSON files, Keycloak lets you do that to set things up more easily.&lt;/p&gt;

</description>
      <category>owncloud</category>
      <category>ocis</category>
      <category>ociswithkeycloak</category>
      <category>keycloak</category>
    </item>
    <item>
      <title>Introduction to Keycloak</title>
      <dc:creator>Amrita Shrestha</dc:creator>
      <pubDate>Tue, 20 Aug 2024 07:05:55 +0000</pubDate>
      <link>https://forem.com/jankaritech/introduction-to-keycloak-5803</link>
      <guid>https://forem.com/jankaritech/introduction-to-keycloak-5803</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/keycloak/keycloak" rel="noopener noreferrer"&gt;Keycloak&lt;/a&gt; is an open-source project created by RedHat for Single Sign-On. It provides an &lt;code&gt;Identity and Access Management&lt;/code&gt; (IAM) solution designed to secure application services.&lt;br&gt;
Additionally, it enables users to authenticate through various identity providers and use fine-grained permissions for regulating access to Software as a Service (SaaS) applications.&lt;/p&gt;

&lt;p&gt;It facilitates the creation of a user database with customizable roles and groups, offering functionalities such as user management, registration, and password policy enforcement.&lt;br&gt;
This makes it a comprehensive Identity and Access Management solution for contemporary applications. The Keycloak API enables the integration of all these features into your application&lt;br&gt;
without the need for additional coding.&lt;/p&gt;
&lt;h2&gt;
  
  
  Keycloak Features
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjx32yffgl90vufff1t2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjx32yffgl90vufff1t2.png" alt="Keycloak features" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Identity Broker:&lt;br&gt;
Identity Broker acts as a middleman, linking various service providers with different identity providers. It establishes trust with external identity providers to utilize their identities for accessing internal services offered by service providers.&lt;br&gt;
Imagine a company, which has two Keycloak setups: one for customers and another for internal employees. If you want your employees to access external services without creating new accounts on the customer Keycloak, you can use the customer Keycloak as &lt;code&gt;Broker&lt;/code&gt; and the internal Keycloak as &lt;code&gt;Provider&lt;/code&gt; in this scenario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User Federation:&lt;br&gt;
Keycloak provides the ability to integrate with existing LDAP or Active Directory servers. It also supports implementation of your own provider such as a relational database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standard Protocols:&lt;br&gt;
Keycloak is based on three standard protocols i.e., OpenID Connect, OAuth2.0, and SAML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Password Policies:&lt;br&gt;
Keycloak contains different password policies i.e., HashAlgorithm, Hashing Iterations, Digits, Lowercase Characters, Regular Expression and so on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Single Sign-On:&lt;br&gt;
Keycloak facilitates a seamless login experience where users only need to sign in once to access multiple applications, eliminating the need for repeated logins.&lt;br&gt;
This not only streamlines the user experience but also simplifies identity management for administrators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Social Login:&lt;br&gt;
Keycloak has built-in support to login via Google, GitHub, and Facebook, which helps us to use social identity providers.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Keycloak Installation
&lt;/h2&gt;

&lt;p&gt;In this blog, two different ways are discussed to install Keycloak.&lt;/p&gt;
&lt;h3&gt;
  
  
  By Docker
&lt;/h3&gt;

&lt;p&gt;Make sure &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Docker Engine&lt;/a&gt; and &lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt; has been installed in your system.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Keycloak using docker image&lt;br&gt;
Run the following docker command to serve the Keycloak image. Keycloak will be available on &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt; docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;KEYCLOAK_ADMIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin quay.io/keycloak/keycloak:24.0.2 start-dev
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Keycloak with postgres database using docker-compose&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:alpine&lt;/span&gt;
     &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;
     &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;
       &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;
       &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;

   &lt;span class="na"&gt;keycloak&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quay.io/keycloak/keycloak:24.0.1&lt;/span&gt;
     &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start-dev"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
     &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;KC_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
       &lt;span class="na"&gt;KC_DB_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jdbc:postgresql://postgres:5432/keycloak"&lt;/span&gt;
       &lt;span class="na"&gt;KC_DB_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;
       &lt;span class="na"&gt;KC_DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;
       &lt;span class="na"&gt;KC_FEATURES&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;impersonation&lt;/span&gt;
       &lt;span class="na"&gt;KEYCLOAK_ADMIN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
       &lt;span class="na"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
     &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8001:8080&lt;/span&gt; &lt;span class="c1"&gt;# map keycloak port 8080 to 8001&lt;/span&gt;
     &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;

 &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Save the above code in &lt;code&gt;compose.yaml&lt;/code&gt; file and run &lt;code&gt;docker compose up&lt;/code&gt; in a terminal.&lt;/p&gt;

&lt;p&gt;Docker compose serves Keycloak on &lt;code&gt;http://localhost:8001&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  By Distribution File
&lt;/h3&gt;

&lt;p&gt;There is another way to set up Keycloak using the Keycloak distribution file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the Keycloak distribution&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KC_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;24.0.4
curl &lt;span class="nt"&gt;-LO&lt;/span&gt;  https://github.com/keycloak/keycloak/releases/download/&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KC_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/keycloak-&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KC_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unzip the Keycloak distribution package&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unzip keycloak-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KC_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install openjdk&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-17-jdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the Keycloak directory&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;keycloak-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KC_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When we start the server for the first time, we have to set the admin user and the admin password:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;KEYCLOAK_ADMIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="nv"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin ./bin/kc.sh start-dev
&lt;/code&gt;&lt;/pre&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: if port 8080 is already used, then you can map the Keycloak port using the Keycloak environment variable 'KC_HTTP_PORT=8001'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When we start again, it is not necessary to set these variables again. You can start the server with:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bin/kc.sh start-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: start-dev runs the Keycloak application in DEV-mode. Do not use this for production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By default, the Keycloak server is on port &lt;strong&gt;8080&lt;/strong&gt; for HTTP and &lt;strong&gt;8084&lt;/strong&gt; for HTTPS. They are only served from the localhost loopback address 127.0.0.1:&lt;br&gt;
Keycloak serves on &lt;code&gt;http://localhost:&amp;lt;port&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Keycloak Matters
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Keycloak is open source.&lt;/li&gt;
&lt;li&gt;Keycloak supports three different authentication protocols which gives you the possibility to cover many applications with different security demands with a single tool.&lt;/li&gt;
&lt;li&gt;Keycloak provides a web-based GUI which makes any configuration changes easy.&lt;/li&gt;
&lt;li&gt;Keycloak has huge &lt;a href="https://www.keycloak.org/community" rel="noopener noreferrer"&gt;community support&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keycloak Drawbacks
&lt;/h2&gt;

&lt;p&gt;Despite its extensive features, Keycloak does have certain limitations. One of these is the need for a more varied implementation approach.&lt;br&gt;
Additionally, the following are some of the drawbacks associated with Keycloak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Complex Server Deployment:&lt;br&gt;
The manual process involved in deploying Keycloak on a server can be complicated, potentially affecting overall productivity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lack of Comprehensive Support Documentation:&lt;br&gt;
Despite its robust functionalities, Keycloak could benefit from more efficient and extensive support documentation. This would make it easier for users to find suitable solutions to their problems.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When It May Not Be the Best Choice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enterprises seeking robust guarantees or support may find Keycloak lacking in this regard. As an open-source project, there are no assurances provided by its producer regarding its functionality or roadmap.
Support is community-driven, typically through platforms like Stack Overflow, with no guaranteed response times.&lt;/li&gt;
&lt;li&gt;If your application consists of a single application with just one client in the Keycloak realm, you won't benefit from Single Sign-On (SSO) capabilities.&lt;/li&gt;
&lt;li&gt;For applications solely reliant on a pure user database, Keycloak could be overkill. A database with specific tables may offer a simpler alternative, especially if you already have one set up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In conclusion, when considering Identity Access Management solutions, Keycloak stands out as a robust option. However, it's essential to explore alternatives such as Auth0, Zluri, Microsoft Azure Active Directory, Okta, or WSO2 Identity Server to ensure you find the best fit for your specific needs and preferences.&lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>iam</category>
    </item>
  </channel>
</rss>
