Getting Started
Let's discover Keycloak Connector in less than 15 minutes.
🕒 Can't wait? Run it now with Docker Quickstart.What you'll need​
Configure Keycloak​
Following FAPI guidance, several changes to your Keycloak configuration may be required.
info
Changing Realm configurations may impact existing Clients if they are not similarly configured.
Realm Configuration​
Sessions​
- SSO Session Idle:
4 hoursoptional - SSO Session Max:
1 dayoptional
Tokens​
- Default Signature Algorithm:
PS256 - Revoke Refresh Token:
Enabledrecommended - Refresh token max reuse:
0recommended - Access Token Lifespan:
15 minutesoptional
Client Configuration​
Settings​
- Root URL
http://localhost:5000*your backend server - Valid redirect URIs
/auth/callback* - Web origins
+ - Admin URL
/auth/k-admin-url* - Client authentication
On - Authentication flow
Standard flow - Front channel logout
Off
Backchannel logout URL
When running Keycloak in a Docker instance and your NodeJs server on your host machine, try: http://host.docker.internal:5000/auth/k_logout
- Backchannel logout URL
http://localhost:5000/auth/k-logout - Backchannel logout session required
On
Credentials​
warning
Clients must authenticate using Signed JWT (PS256) in production, Keycloak Connector will not start otherwise.
- Client Authenticator
Client Id and Secretdev only - Access token signature algorithm
PS256 - ID token signature algorithm
PS256 - User info signed response algorithm
PS256 - Request object signature algorithm
PS256 - Authorization response signature algorithm
PS256 - Proof Key for Code Exchange Code Challenge Method
S256
Configure Webserver​
- Express
- Fastify
server.js
import express from 'express';
import {keycloakConnectorExpress, lock} from "@dapperduckling/keycloak-connector-server";
import cookieParser from "cookie-parser"
const serverPort = 5000;
// Grab express app
const app = express();
// Register the cookie parser
app.use(cookieParser());
// Initialize keycloak connector server
await keycloakConnectorExpress(app, {
realm: 'kcc-example',
clientId: 'example-express-app',
clientSecret: '***REPLACE WITH CLIENT SECRET FROM KEYCLOAK***', // Dev only
DANGEROUS_disableJwtClientAuthentication: true, // Dev only
fetchUserInfo: true,
serverOrigin: `http://localhost:${serverPort}`, // This server's origin
authServerUrl: 'http://localhost:8080', // Your keycloak server here
});
// Register a public route on the app
app.get('/', (req, res) => {
res.send(`Public route`);
});
// Create a new router to secure all routes behind
const router = express.Router();
// Only authentication required route
router.get('/private', (req, res) => {
res.send(`Private route`);
});
// Lock all routes in the router behind a login page
app.use(lock(), router);
// Start the server
app.listen(serverPort, () => {
console.log(`express :: listening at http://localhost:${serverPort}`);
});
server.js
import Fastify from 'fastify';
import {keycloakConnectorFastify} from "@dapperduckling/keycloak-connector-server";
import cookie from '@fastify/cookie';
const serverPort = 5000;
// Configure fastify
const fastify = Fastify({
pluginTimeout: 120_000, // Allow for lengthy plugin initialization
});
// Add cookie support to fastify
await fastify.register(cookie);
// Initialize the keycloak connector
await fastify.register(keycloakConnectorFastify(), {
realm: 'kcc-example',
clientId: 'example-fastify-app',
clientSecret: '***REPLACE WITH CLIENT SECRET FROM KEYCLOAK***', // Dev only
DANGEROUS_disableJwtClientAuthentication: true, // Dev only
fetchUserInfo: true,
serverOrigin: `http://localhost:${serverPort}`, // This server's origin
authServerUrl: 'http://localhost:8080', // Your keycloak server here
});
// A public route
fastify.get('/', {config: {public: true}}, async () => {
return `Public route`;
});
// Only authentication required for this route
fastify.get('/private', async () => {
return `Private route`;
});
// Launch the server
await fastify.listen({
port: serverPort,
listenTextResolver: () => `Server listening at http://localhost:${serverPort}`
});
Launch the server​
node server.js
Test it!​
| Purpose | Url |
|---|---|
| Public Route | http://localhost:5000 |
| Private Route | http://localhost:5000/private |
| Login | http://localhost:5000/auth/login |
| Logout | http://localhost:5000/auth/logout |