 Autor: [Miłka Teroy](/autorzy/milka-teroy) Analityk rynku hostingowego · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Keycloak SSO — konfiguracja

# Keycloak SSO — konfiguracja Single Sign-On z OAuth2 i OIDC

Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo / IAM

Keycloak to open source Identity Provider rozwijany przez Red Hat — de facto standard enterprise SSO w środowiskach open source. Zamiast implementować logowanie w każdej aplikacji osobno, rejestrujesz je jako klientów (clients) w Keycloak i delegujesz całą logikę uwierzytelnienia. Użytkownik loguje się raz, a token JWT przenosi jego tożsamość do wszystkich aplikacji. Ten artykuł pokazuje instalację Keycloak przez Docker lub binary, konfigurację realm i clients, zarządzanie użytkownikami i rolami oraz integrację z PHP i Node.js.

## Instalacja przez Docker Compose

Najszybszy start to Docker Compose z Keycloak i PostgreSQL jako bazą danych. Keycloak domyślnie używa H2 (embedded), ale PostgreSQL jest wymagany w produkcji.

version: "3.8"
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES\_DB: keycloak
      POSTGRES\_USER: keycloak
      POSTGRES\_PASSWORD: keycloak\_secret
    volumes:
      - postgres\_data:/var/lib/postgresql/data
    restart: unless-stopped

  keycloak:
    image: quay.io/keycloak/keycloak:25.0
    command: start-dev
    environment:
      KC\_DB: postgres
      KC\_DB\_URL: jdbc:postgresql://postgres:5432/keycloak
      KC\_DB\_USERNAME: keycloak
      KC\_DB\_PASSWORD: keycloak\_secret
      KEYCLOAK\_ADMIN: admin
      KEYCLOAK\_ADMIN\_PASSWORD: admin
      KC\_HOSTNAME: localhost
    ports:
      - "8080:8080"
    depends\_on:
      - postgres
    restart: unless-stopped

volumes:
  postgres\_data:

docker compose up -d
# Po 30-60 sekundach: http://localhost:8080
# Admin console: http://localhost:8080/admin (admin/admin)

## Instalacja binary (bez Docker) z SSL

\# Pobierz Keycloak
wget https://github.com/keycloak/keycloak/releases/download/25.0.0/keycloak-25.0.0.tar.gz
tar -xzf keycloak-25.0.0.tar.gz
sudo mv keycloak-25.0.0 /opt/keycloak
sudo useradd -r -d /opt/keycloak -s /bin/false keycloak
sudo chown -R keycloak: /opt/keycloak

# Konfiguracja /opt/keycloak/conf/keycloak.conf
# db=postgres
# db-url=jdbc:postgresql://localhost:5432/keycloak
# db-username=keycloak
# db-password=SECRET
# hostname=auth.example.com
# https-certificate-file=/etc/letsencrypt/live/auth.example.com/fullchain.pem
# https-certificate-key-file=/etc/letsencrypt/live/auth.example.com/privkey.pem

# Zbuduj konfiguracje (cache JPA)
sudo -u keycloak /opt/keycloak/bin/kc.sh build

# Uruchom produkcyjnie
sudo -u keycloak /opt/keycloak/bin/kc.sh start \\
  --optimized \\
  --https-port=8443

\# /etc/systemd/system/keycloak.service
\[Unit\]
Description=Keycloak Server
After=network.target postgresql.service

\[Service\]
Type=idle
User=keycloak
ExecStart=/opt/keycloak/bin/kc.sh start --optimized
Restart=always
Environment="KEYCLOAK\_ADMIN=admin"
Environment="KEYCLOAK\_ADMIN\_PASSWORD=ZMIEN\_NA\_SILNE\_HASLO"
Environment="JAVA\_OPTS\_KC\_HEAP=-Xms512m -Xmx1024m"

\[Install\]
WantedBy=multi-user.target

## Realm, Client i Role — konfiguracja przez Admin UI

Po zalogowaniu do Admin Console stwórz nowy realm (np. `myfirma`). Realm master zostaw dla administracji Keycloak. Następnie:

1.  **Utwórz Client** — Clients → Create client. Wpisz Client ID (np. `myapp`), wybierz OpenID Connect. Ustaw Valid redirect URIs: `https://myapp.example.com/auth/callback`. Włącz Client authentication (dla server-side apps z secret).
2.  **Pobierz Client Secret** — Clients → myapp → Credentials → Client secret. Skopiuj do konfiguracji aplikacji.
3.  **Stwórz Role** — Realm roles → Create role: `admin`, `editor`, `viewer`.
4.  **Stwórz użytkownika** — Users → Create user. Wpisz username, email. W zakładce Credentials ustaw hasło (wyłącz Temporary). W zakładce Role Mapping przypisz role.

## Integracja PHP — league/oauth2-client

composer require league/oauth2-client

<?php
// config.php
define('KC\_BASE', 'https://auth.example.com');
define('KC\_REALM', 'myfirma');
define('KC\_CLIENT\_ID', 'myapp');
define('KC\_CLIENT\_SECRET', 'twoj-client-secret');
define('REDIRECT\_URI', 'https://myapp.example.com/callback.php');

// login.php — redirect do Keycloak
require\_once 'vendor/autoload.php';

$provider = new \\League\\OAuth2\\Client\\Provider\\GenericProvider(\[
    'clientId'                => KC\_CLIENT\_ID,
    'clientSecret'            => KC\_CLIENT\_SECRET,
    'redirectUri'             => REDIRECT\_URI,
    'urlAuthorize'            => KC\_BASE . '/realms/' . KC\_REALM . '/protocol/openid-connect/auth',
    'urlAccessToken'          => KC\_BASE . '/realms/' . KC\_REALM . '/protocol/openid-connect/token',
    'urlResourceOwnerDetails' => KC\_BASE . '/realms/' . KC\_REALM . '/protocol/openid-connect/userinfo',
\]);

// Generuj URL logowania z state (CSRF protection)
$authUrl = $provider->getAuthorizationUrl(\['scope' => 'openid profile email'\]);
$\_SESSION\['oauth2state'\] = $provider->getState();
header('Location: ' . $authUrl);
exit;

<?php
// callback.php — obsługa powrotu z Keycloak
session\_start();
require\_once 'vendor/autoload.php';
// ... (inicjalizacja $provider jak wyzej)

// Weryfikuj state (CSRF)
if (empty($\_GET\['state'\]) || $\_GET\['state'\] !== $\_SESSION\['oauth2state'\]) {
    die('Invalid state - CSRF attack?');
}

// Wymien code na token
$token = $provider->getAccessToken('authorization\_code', \[
    'code' => $\_GET\['code'\]
\]);

// Pobierz dane uzytkownika
$user = $provider->getResourceOwner($token);
$userData = $user->toArray();

// Dane dostepne:
// $userData\['sub'\] - unikalny ID uzytkownika w Keycloak
// $userData\['email'\]
// $userData\['name'\]
// $userData\['realm\_access'\]\['roles'\] - lista rol

$\_SESSION\['user'\] = $userData;
$\_SESSION\['access\_token'\] = $token->getToken();
header('Location: /dashboard.php');
exit;

## Integracja Node.js — openid-client

npm install openid-client express express-session

// app.js
const express = require('express');
const session = require('express-session');
const { Issuer, generators } = require('openid-client');

const app = express();
app.use(session({ secret: 'session-secret', resave: false, saveUninitialized: false }));

let client;

async function init() {
  const keycloakIssuer = await Issuer.discover(
    'https://auth.example.com/realms/myfirma'
  );
  client = new keycloakIssuer.Client({
    client\_id: 'myapp',
    client\_secret: 'twoj-client-secret',
    redirect\_uris: \['http://localhost:3000/callback'\],
    response\_types: \['code'\],
  });
}

app.get('/login', (req, res) => {
  const nonce = generators.nonce();
  const state = generators.state();
  req.session.nonce = nonce;
  req.session.state = state;
  const url = client.authorizationUrl({
    scope: 'openid email profile',
    state,
    nonce,
  });
  res.redirect(url);
});

app.get('/callback', async (req, res) => {
  const params = client.callbackParams(req);
  const tokenSet = await client.callback(
    'http://localhost:3000/callback',
    params,
    { nonce: req.session.nonce, state: req.session.state }
  );
  const userinfo = await client.userinfo(tokenSet.access\_token);
  req.session.user = userinfo;
  res.redirect('/dashboard');
});

app.get('/dashboard', (req, res) => {
  if (!req.session.user) return res.redirect('/login');
  res.json({ user: req.session.user });
});

init().then(() => app.listen(3000));

## Kluczowe przepływy OAuth2/OIDC w Keycloak

Flow

Zastosowanie

Konfiguracja w Keycloak

Authorization Code

Aplikacje webowe server-side (PHP, Node)

Client authentication ON, redirect URIs

Authorization Code + PKCE

SPA, aplikacje mobilne (bez secret)

Public client, PKCE enforced

Client Credentials

Komunikacja M2M (mikroserwisy, API)

Service Account Roles enabled

Device Authorization

Smart TV, IoT bez przeglądarki

Device Authorization Grant enabled

## Najczęstsze pytania

Czym jest Keycloak i do czego służy SSO? +

Keycloak to open source Identity and Access Management (IAM) — centralne zarządzanie tożsamością i dostępem. SSO (Single Sign-On) pozwala użytkownikowi zalogować się raz i automatycznie uzyskać dostęp do wielu aplikacji bez ponownego podawania hasła. Keycloak obsługuje standardy OAuth2, OpenID Connect (OIDC) i SAML 2.0. Typowe zastosowania: jeden login dla wielu aplikacji firmowych, integracja z LDAP/Active Directory, federacja tożsamości z zewnętrznymi providerami (Google, GitHub, Facebook).

Co to jest realm i client w Keycloak? +

Realm to izolowana przestrzeń w Keycloak — ma własnych użytkowników, role, grupy i klientów (aplikacje). Możesz mieć realm "firma" dla pracowników i realm "klienci" dla użytkowników zewnętrznych. Client to aplikacja lub serwis zarejestrowany w Keycloak — np. aplikacja webowa, API, mobile app. Każdy client ma swój client\_id, secret (dla poufnych klientów) i konfigurację dozwolonych redirect URI. Keycloak master realm to administracyjny — zarządza innymi realmami.

OAuth2 vs OpenID Connect — jaka różnica? +

OAuth2 to protokół autoryzacji — pozwala aplikacji uzyskać ograniczony dostęp do zasobów w imieniu użytkownika (np. do kalendarza Google). OAuth2 mówi co aplikacja może robić, ale nie mówi KTO to jest. OpenID Connect (OIDC) to warstwa tożsamości nad OAuth2 — dodaje ID Token (JWT z danymi użytkownika: sub, email, name). OIDC odpowiada na pytanie "KIM jest ten użytkownik". Keycloak obsługuje oba: dla logowania użytkowników używaj OIDC, dla delegowania dostępu do API używaj OAuth2 (client credentials).

Ile RAM potrzebuje Keycloak? +

Keycloak 21+ (Quarkus) zużywa znacznie mniej pamięci niż starszy WildFly-based. Minimalne wymagania: 512 MB RAM dla dev/test, 1-2 GB dla małej produkcji (do 1000 użytkowników), 2-4 GB dla średniej produkcji z LDAP sync i wieloma realmami. Heap JVM ustaw przez JAVA\_OPTS\_KC\_HEAP. Keycloak 25+ wspiera natywny kompilat przez GraalVM — jeszcze mniejszy footprint. Do testów na VPS z 1 GB RAM można uruchomić Keycloak w trybie dev, ale nie nadaje się do produkcji.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z 4+ GB RAM dla Keycloak produkcyjny z PostgreSQL backend

VPS SSO

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikr.us

Tani VPS do testów Keycloak w trybie dev (start-dev)

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

Cyberfolks

Hosting z PHP — testuj integrację aplikacji z Keycloak SSO

Hosting PHP

[Aktywuj rabat →](/out/cyberfolks)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/cyberfolks)

## Powiązane strony

-   [HashiCorp Vault — zarządzanie sekretami](/baza-wiedzy/vault-hashicorp-sekrety)
-   [Bezpieczeństwo VPS — checklist](/baza-wiedzy/bezpieczenstwo-vps-checklist)
-   [SSL i Let's Encrypt — automatyzacja certyfikatów](/baza-wiedzy/ssl-lets-encrypt-automatyzacja)
-   [Nginx — konfiguracja wirtualnych hostów](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [Wszystkie artykuły](/baza-wiedzy/)