{"id":9736,"date":"2025-07-11T09:55:21","date_gmt":"2025-07-11T07:55:21","guid":{"rendered":"https:\/\/www.credativ.de\/blog\/credativ-inside\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/"},"modified":"2025-11-24T19:18:58","modified_gmt":"2025-11-24T18:18:58","slug":"postgresql-18-meets-oauth2-how-native-support-works-with-keycloak","status":"publish","type":"post","link":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/","title":{"rendered":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-9732\" src=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-300x300.png\" alt=\"PostgreSQL Meets OAuth2\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-300x300.png 300w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-1024x1024.png 1024w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-150x150.png 150w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-768x768.png 768w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-1536x1536.png 1536w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-600x600.png 600w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs-180x180.png 180w, https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>With the release of the beta version of <a href=\"https:\/\/www.credativ.de\/en\/blog\/?term_cat%5B%5D=postgresql\">PostgreSQL 18<\/a>, an exciting new feature was introduced: native support for OAuth2. Since I couldn&#8217;t find any guide or blog post online showing how to use this feature, I decided out of curiosity to try it out myself. <\/p>\n<p>I created a new project directory and started experimenting.<\/p>\n<h2 id=\"umgebung-und-zielsetzung\">Environment and Objective<\/h2>\n<p>The goal was to set up <strong>PostgreSQL 18<\/strong> Beta with OAuth2 authentication; for the identity provider, I chose <strong>Keycloak<\/strong>.<\/p>\n<p>I decided to use Docker Compose to quickly and easily spin up both services.<\/p>\n<h2 id=\"docker-compose-konfiguration\">Docker Compose Configuration<\/h2>\n<p>Here is the  <code>docker-compose.yml<\/code>, which I used:<\/p>\n<div id=\"cb1\" class=\"sourceCode\">\n<pre class=\"sourceCode yaml\"><code class=\"sourceCode yaml\"><span id=\"cb1-1\"><span class=\"fu\">services<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-2\">  <span class=\"fu\">mock-oauth2<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-3\">    <span class=\"fu\">image<\/span><span class=\"kw\">:<\/span><span class=\"at\"> quay.io\/keycloak\/keycloak:24.0<\/span><\/span>\n<span id=\"cb1-4\">    <span class=\"fu\">command<\/span><span class=\"kw\">:<\/span><span class=\"at\"> start --https-port=8080 --https-key-store-file=\/etc\/x509\/https\/localhost.p12 --https-key-store-password=changeit --import-realm --hostname-strict=false --hostname-url=https:\/\/mock-oauth2:8080<\/span><\/span>\n<span id=\"cb1-5\">    <span class=\"fu\">ports<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-6\">      <span class=\"kw\">-<\/span> <span class=\"st\">\"8080:8080\"<\/span><\/span>\n<span id=\"cb1-7\">    <span class=\"fu\">environment<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-8\">      <span class=\"fu\">KEYCLOAK_ADMIN<\/span><span class=\"kw\">:<\/span><span class=\"at\"> admin<\/span><\/span>\n<span id=\"cb1-9\">      <span class=\"fu\">KEYCLOAK_ADMIN_PASSWORD<\/span><span class=\"kw\">:<\/span><span class=\"at\"> admin<\/span><\/span>\n<span id=\"cb1-10\">    <span class=\"fu\">volumes<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-11\">      <span class=\"kw\">-<\/span><span class=\"at\"> .\/certs:\/etc\/x509\/https<\/span><\/span>\n<span id=\"cb1-12\">      <span class=\"kw\">-<\/span><span class=\"at\"> .\/keycloak-realm.json:\/opt\/keycloak\/data\/import\/realm.json<\/span><\/span>\n<span id=\"cb1-13\">    <span class=\"fu\">networks<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-14\">      <span class=\"kw\">-<\/span><span class=\"at\"> pgnet<\/span><\/span>\n<span id=\"cb1-15\"\/>\n<span id=\"cb1-16\">  <span class=\"fu\">postgres18<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-17\">    <span class=\"fu\">build<\/span><span class=\"kw\">:<\/span><span class=\"at\"> .<\/span><\/span>\n<span id=\"cb1-18\">    <span class=\"fu\">ports<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-19\">      <span class=\"kw\">-<\/span> <span class=\"st\">\"5432:5432\"<\/span><\/span>\n<span id=\"cb1-20\">    <span class=\"fu\">environment<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-21\">      <span class=\"fu\">POSTGRES_PASSWORD<\/span><span class=\"kw\">:<\/span><span class=\"at\"> postgres<\/span><\/span>\n<span id=\"cb1-22\">    <span class=\"fu\">volumes<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-23\">      <span class=\"kw\">-<\/span><span class=\"at\"> .\/postgres\/postgresql.conf:\/etc\/postgresql\/postgresql.conf<\/span><\/span>\n<span id=\"cb1-24\">      <span class=\"kw\">-<\/span><span class=\"at\"> .\/postgres\/pg_hba.conf:\/etc\/postgresql\/pg_hba.conf<\/span><\/span>\n<span id=\"cb1-25\">    <span class=\"fu\">command<\/span><span class=\"kw\">:<\/span> <span class=\"kw\">[<\/span><span class=\"st\">\"-c\"<\/span><span class=\"kw\">,<\/span> <span class=\"st\">\"config_file=\/etc\/postgresql\/postgresql.conf\"<\/span><span class=\"kw\">]<\/span><\/span>\n<span id=\"cb1-26\">    <span class=\"fu\">networks<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-27\">      <span class=\"kw\">-<\/span><span class=\"at\"> pgnet<\/span><\/span>\n<span id=\"cb1-28\"\/>\n<span id=\"cb1-29\"><span class=\"fu\">networks<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-30\">  <span class=\"fu\">pgnet<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb1-31\">    <span class=\"fu\">driver<\/span><span class=\"kw\">:<\/span><span class=\"at\"> bridge<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>PostgreSQL expects a connection to the OAuth2 issuer via HTTPS. The same URL must also be accessible from the host, for example, when using the Keycloak UI. This means the certificate must be valid and trusted on both the host and in the container.  <\/p>\n<p>The hostname used (e.g., <code>https:\/\/mock-oauth2:8080<\/code>) must be correctly resolvable in both environments.<\/p>\n<p>For this, I added the following line to my <code>\/etc\/hosts<\/code> file on the host:<\/p>\n<pre class=\"text\"><code>127.0.0.1 mock-oauth2<\/code><\/pre>\n<p>This allowed both the PostgreSQL container and my host to reach the Keycloak service at <code>https:\/\/mock-oauth2:8080<\/code>.<\/p>\n<h2 id=\"tls-zertifikat-f\u00fcr-keycloak\">TLS Certificate for Keycloak<\/h2>\n<p>Keycloak absolutely requires an HTTPS endpoint for the OAuth2 issuer URL to be accepted by PostgreSQL.<\/p>\n<p>For this, I created a self-signed certificate and converted it into a <code>.p12<\/code> keystore package that Keycloak can use.<\/p>\n<p>The <code>.p12<\/code> certificate is integrated into the container via the following mount:<\/p>\n<div id=\"cb3\" class=\"sourceCode\">\n<pre class=\"sourceCode yaml\"><code class=\"sourceCode yaml\"><span id=\"cb3-1\"><span class=\"fu\">volumes<\/span><span class=\"kw\">:<\/span><\/span>\n<span id=\"cb3-2\">  <span class=\"kw\">-<\/span><span class=\"at\"> .\/certs:\/etc\/x509\/https<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>In the <code>certs<\/code> directory, there is the <code>localhost.p12<\/code> file, which I created from my self-signed key and certificate as follows:<\/p>\n<div id=\"cb4\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb4-1\"><span class=\"ex\">openssl<\/span> req <span class=\"at\">-x509<\/span> <span class=\"at\">-nodes<\/span> <span class=\"at\">-days<\/span> 365 <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb4-2\">  <span class=\"at\">-newkey<\/span> rsa:2048 <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb4-3\">  <span class=\"at\">-keyout<\/span> server.key <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb4-4\">  <span class=\"at\">-out<\/span> server.crt <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb4-5\">  <span class=\"at\">-subj<\/span> <span class=\"st\">\"\/CN=mock-oauth2\"<\/span> <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb4-6\">  <span class=\"at\">-addext<\/span> <span class=\"st\">\"subjectAltName = DNS:mock-oauth2,DNS:localhost,IP:127.0.0.1\"<\/span><\/span><\/code><\/pre>\n<\/div>\n<h2 id=\"keycloak-realm-konfiguration\">Keycloak Realm Configuration<\/h2>\n<p>I created a minimalist realm file for Keycloak. It contains a client named <code>postgres<\/code> and a user with corresponding credentials. <\/p>\n<p>Content of <code>keycloak-realm.json<\/code>:<\/p>\n<div id=\"cb5\" class=\"sourceCode\">\n<pre class=\"sourceCode json\"><code class=\"sourceCode json\"><span id=\"cb5-1\"><span class=\"fu\">{<\/span><\/span>\n<span id=\"cb5-2\">  <span class=\"dt\">\"realm\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"pg\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-3\">  <span class=\"dt\">\"enabled\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">true<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-4\">  <span class=\"dt\">\"clients\"<\/span><span class=\"fu\">:<\/span> <span class=\"ot\">[<\/span><\/span>\n<span id=\"cb5-5\">    <span class=\"fu\">{<\/span><\/span>\n<span id=\"cb5-6\">      <span class=\"dt\">\"clientId\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"postgres\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-7\">      <span class=\"dt\">\"enabled\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">true<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-8\">      <span class=\"dt\">\"publicClient\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">false<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-9\">      <span class=\"dt\">\"redirectUris\"<\/span><span class=\"fu\">:<\/span> <span class=\"ot\">[<\/span><span class=\"st\">\"*\"<\/span><span class=\"ot\">]<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-10\">      <span class=\"dt\">\"protocol\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"openid-connect\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-11\">      <span class=\"dt\">\"secret\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"postgres\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-12\">      <span class=\"dt\">\"directAccessGrantsEnabled\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">true<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-13\">      <span class=\"dt\">\"standardFlowEnabled\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">true<\/span><\/span>\n<span id=\"cb5-14\">    <span class=\"fu\">}<\/span><\/span>\n<span id=\"cb5-15\">  <span class=\"ot\">]<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-16\">  <span class=\"dt\">\"users\"<\/span><span class=\"fu\">:<\/span> <span class=\"ot\">[<\/span><\/span>\n<span id=\"cb5-17\">    <span class=\"fu\">{<\/span><\/span>\n<span id=\"cb5-18\">      <span class=\"dt\">\"username\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"postgres\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-19\">      <span class=\"dt\">\"enabled\"<\/span><span class=\"fu\">:<\/span> <span class=\"kw\">true<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-20\">      <span class=\"dt\">\"credentials\"<\/span><span class=\"fu\">:<\/span> <span class=\"ot\">[<\/span><\/span>\n<span id=\"cb5-21\">        <span class=\"fu\">{<\/span><\/span>\n<span id=\"cb5-22\">          <span class=\"dt\">\"type\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"password\"<\/span><span class=\"fu\">,<\/span><\/span>\n<span id=\"cb5-23\">          <span class=\"dt\">\"value\"<\/span><span class=\"fu\">:<\/span> <span class=\"st\">\"postgres\"<\/span><\/span>\n<span id=\"cb5-24\">        <span class=\"fu\">}<\/span><\/span>\n<span id=\"cb5-25\">      <span class=\"ot\">]<\/span><\/span>\n<span id=\"cb5-26\">    <span class=\"fu\">}<\/span><\/span>\n<span id=\"cb5-27\">  <span class=\"ot\">]<\/span><\/span>\n<span id=\"cb5-28\"><span class=\"fu\">}<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>After importing the realm, Keycloak was ready and the default scope was visible in the UI.<\/p>\n<h2 id=\"installation-von-libpq-oauth-und-oauth_validator\">Installation of <code>libpq-oauth<\/code> and  <code>oauth_validator<\/code><\/h2>\n<p>I had to extend the official PostgreSQL image to include additional dependencies such as the extension  <code>libpq-oauth<\/code>  as well as the validator  <code>oauth_validator<\/code>  to install.<\/p>\n<p>PostgreSQL 18 experimentally supports OAuth2 authentication. However, PostgreSQL <strong>does not provide its own validator library<\/strong>. The official documentation states:  <\/p>\n<blockquote><p><em>The PostgreSQL distribution does not include libraries for validating OAuth2 tokens. Users must provide their own solution or compile one themselves. <\/em><br \/>\n<a href=\"https:\/\/www.postgresql.org\/docs\/18\/runtime-config-connection.html#GUC-OAUTH-VALIDATOR-LIBRARIES\">PostgreSQL<br \/>\nDocs \u2013  <code>oauth_validator_libraries<\/code><\/a><\/p><\/blockquote>\n<p>For testing, I used the following open-source implementation:<\/p>\n<blockquote><p><a href=\"https:\/\/github.com\/TantorLabs\/oauth_validator\">github.com\/TantorLabs\/oauth_validator<\/a><\/p><\/blockquote>\n<p>This minimalist C library can be compiled and used as <code>oauth_validator_library<\/code> in PostgreSQL.<\/p>\n<h3 id=\"verwendetes-dockerfile\">Used Dockerfile<\/h3>\n<div id=\"cb6\" class=\"sourceCode\">\n<pre class=\"sourceCode dockerfile\"><code class=\"sourceCode dockerfile\"><span id=\"cb6-1\"><span class=\"kw\">FROM<\/span> postgres:18beta1<\/span>\n<span id=\"cb6-2\"\/>\n<span id=\"cb6-3\"><span class=\"kw\">USER<\/span> root<\/span>\n<span id=\"cb6-4\"\/>\n<span id=\"cb6-5\"><span class=\"kw\">RUN<\/span> <span class=\"ex\">apt-get<\/span> update <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-6\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"ex\">apt-get<\/span> install <span class=\"at\">-y<\/span> libpq-oauth build-essential libkrb5-dev <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-7\">       libsasl2-dev libcurl4-openssl-dev postgresql-server-dev-18 git <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-8\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">git<\/span> clone https:\/\/github.com\/TantorLabs\/oauth_validator.git \/tmp\/oauth_validator <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-9\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"bu\">cd<\/span> \/tmp\/oauth_validator <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-10\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">make<\/span> <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">make<\/span> install <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-11\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">rm<\/span> <span class=\"at\">-rf<\/span> \/tmp\/oauth_validator <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-12\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"ex\">apt-get<\/span> remove <span class=\"at\">-y<\/span> build-essential git <span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb6-13\">    <span class=\"kw\">&amp;&amp;<\/span> <span class=\"ex\">apt-get<\/span> autoremove <span class=\"at\">-y<\/span> <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">rm<\/span> <span class=\"at\">-rf<\/span> \/var\/lib\/apt\/lists\/<span class=\"pp\">*<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>I then used this image for the `postgres18` service in my Docker Compose setup.<\/p>\n<h2 id=\"postgresql-mit-der-keycloak-ca-vertrauen-lassen\">Making PostgreSQL Trust the Keycloak CA<\/h2>\n<p>PostgreSQL must trust the certificate presented by Keycloak, otherwise the connection to the OAuth2 issuer will be rejected.<\/p>\n<p>For this, I copied the `mock-oauth.crt` file into the PostgreSQL container and placed it in the typical CA path:<\/p>\n<div id=\"cb7\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb7-1\"><span class=\"ex\">\/usr\/local\/share\/ca-certificates\/<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Then, inside the container, I executed the following command:<\/p>\n<div id=\"cb8\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb8-1\"><span class=\"ex\">update-ca-certificates<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>After that, the certificate was accepted, and PostgreSQL could successfully verify the connection to the HTTPS issuer.<\/p>\n<h2 id=\"postgresql-konfiguration\">PostgreSQL Configuration<\/h2>\n<p>In  <code>pg_hba.conf<\/code> , I added the following line:<\/p>\n<div id=\"cb9\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb9-1\"><span class=\"ex\">host<\/span> all all all oauth scope=<span class=\"st\">\"profile\"<\/span> issuer=<span class=\"st\">\"https:\/\/mock-oauth2:8080\/realms\/pg\"<\/span> map=<span class=\"st\">\"oauthmap\"<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>In <code>pg_ident.conf<\/code>, I mapped the identity provided by the token to the PostgreSQL user:<\/p>\n<pre class=\"text\"><code>oauthmap \"postgresID\" \"postgres\"<\/code><\/pre>\n<p>This mapping may need to be adjusted \u2013 depending on how your Keycloak client is configured and which field (e.g.,<br \/>\n<code>preferred_username<\/code>  or <code>sub<\/code>) is passed in the token.<\/p>\n<h2>Connection Test with OAuth2<\/h2>\n<p>To test the connection, I used the following `psql` command:<\/p>\n<div id=\"cb11\" class=\"sourceCode\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb11-1\"><span class=\"ex\">psql<\/span> <span class=\"st\">\"host=localhost <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-2\"><span class=\"st\">      port=5432 <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-3\"><span class=\"st\">      dbname=postgres <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-4\"><span class=\"st\">      user=postgres <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-5\"><span class=\"st\">      oauth_issuer=https:\/\/mock-oauth2:8080\/realms\/pg <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-6\"><span class=\"st\">      oauth_client_id=postgres <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-7\"><span class=\"st\">      oauth_client_secret=changeme <\/span><span class=\"dt\">\\<\/span><\/span>\n<span id=\"cb11-8\"><span class=\"st\">      oauth_scope=profile\"<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>After the call, a device code message appears, such as:<\/p>\n<blockquote><p>Visit `https:\/\/mock-oauth2:8080\/realms\/pg\/device` and enter the code <strong>FBAD-XXYZ<\/strong>.<\/p><\/blockquote>\n<p>After logging in with the user credentials, `psql` successfully establishes a connection to PostgreSQL via OAuth2.<\/p>\n<h2 id=\"erkenntnisse-und-tipps\">Insights and Tips<\/h2>\n<ul>\n<li>PostgreSQL 18 requires <strong>HTTPS<\/strong> for the OAuth2 issuer URL \u2013 even in a local setup.<\/li>\n<li><code>pg_hba.conf<\/code>  is sensitive to formatting errors. I had to reload the configuration multiple times (<code>SELECT pg_reload_conf();<\/code>) and carefully analyze the logs. <\/li>\n<li>To trust a local certificate authority, it is sufficient to copy the <code>.crt<\/code> certificate into the container and register it with <code>update-ca-certificates<\/code>.<\/li>\n<li>Keycloak is well-suited for testing with OAuth2, but you may need to experiment with scopes, claims, and secrets until everything aligns with PostgreSQL.<\/li>\n<\/ul>\n<h2 id=\"fazit\">Conclusion<\/h2>\n<p>This was an exciting, practical experiment with a promising new feature in PostgreSQL. OAuth2 integration brings PostgreSQL closer to modern identity management solutions and simplifies operations in environments with centralized authentication. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the release of the beta version of PostgreSQL 18, an exciting new feature was introduced: native support for OAuth2. Since I couldn&#8217;t find any guide or blog post online showing how to use this feature, I decided out of curiosity to try it out myself. I created a new project directory and started experimenting. [&hellip;]<\/p>\n","protected":false},"author":84,"featured_media":9735,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3,1708],"tags":[2080,1801],"class_list":["post-9736","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-credativ-inside","category-postgresql-en","tag-oauth2","tag-postgresql-en"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak - credativ\u00ae<\/title>\n<meta name=\"description\" content=\"PostgreSQL 18 offers native OAuth2 support. Here&#039;s how you can use this feature with Docker Compose.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak\" \/>\n<meta property=\"og:description\" content=\"PostgreSQL 18 offers native OAuth2 support. Here&#039;s how you can use this feature with Docker Compose.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/\" \/>\n<meta property=\"og:site_name\" content=\"credativ\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/credativDE\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-11T07:55:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-24T18:18:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"2048\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Felix Alipaz-Dicke\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@credativde\" \/>\n<meta name=\"twitter:site\" content=\"@credativde\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Felix Alipaz-Dicke\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/\"},\"author\":{\"name\":\"Felix Alipaz-Dicke\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/f7368d35ad7a1d1644fe6a02d38e94f0\"},\"headline\":\"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak\",\"datePublished\":\"2025-07-11T07:55:21+00:00\",\"dateModified\":\"2025-11-24T18:18:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/\"},\"wordCount\":684,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png\",\"keywords\":[\"OAuth2\",\"PostgreSQL\u00ae\"],\"articleSection\":[\"credativ\u00ae Inside\",\"PostgreSQL\u00ae\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/\",\"name\":\"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak - credativ\u00ae\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png\",\"datePublished\":\"2025-07-11T07:55:21+00:00\",\"dateModified\":\"2025-11-24T18:18:58+00:00\",\"description\":\"PostgreSQL 18 offers native OAuth2 support. Here's how you can use this feature with Docker Compose.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png\",\"contentUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png\",\"width\":2048,\"height\":2048,\"caption\":\"PostgreSQL Meets OAuth2\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"name\":\"credativ GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\",\"name\":\"credativ\u00ae\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/credativDE\\\/\",\"https:\\\/\\\/x.com\\\/credativde\",\"https:\\\/\\\/mastodon.social\\\/@credativde\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/credativ-gmbh\",\"https:\\\/\\\/www.instagram.com\\\/credativ\\\/\"],\"description\":\"Die credativ GmbH ist ein f\u00fchrendes, auf Open Source Software spezialisiertes IT-Dienstleistungs- und Beratungsunternehmen. Wir bieten umfassende und professionelle Services, von Beratung und Infrastruktur-Betrieb \u00fcber 24\\\/7 Support bis hin zu individuellen L\u00f6sungen und Schulungen. Unser Fokus liegt auf dem ganzheitlichen Management von gesch\u00e4ftskritischen Open-Source-Systemen, darunter Betriebssysteme (z.B. Linux), Datenbanken (z.B. PostgreSQL), Konfigurationsmanagement (z.B. Ansible, Puppet) und Virtualisierung. Als engagierter Teil der Open-Source-Community unterst\u00fctzen wir unsere Kunden dabei, die Vorteile freier Software sicher, stabil und effizient in ihrer IT-Umgebung zu nutzen.\",\"legalName\":\"credativ GmbH\",\"foundingDate\":\"2025-03-01\",\"duns\":\"316387060\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"11\",\"maxValue\":\"50\"},\"address\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#local-main-place-address\"},\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":\"51.1732374\",\"longitude\":\"6.392010099999999\"},\"telephone\":[\"+4921619174200\",\"08002733284\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"telephone\":\"08002733284\",\"email\":\"vertrieb@credativ.de\"},\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\"],\"opens\":\"09:00\",\"closes\":\"17:00\"},{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"00:00\"}],\"email\":\"info@credativ.de\",\"areaServed\":\"D-A-CH\",\"vatID\":\"DE452151696\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/f7368d35ad7a1d1644fe6a02d38e94f0\",\"name\":\"Felix Alipaz-Dicke\"},{\"@type\":\"PostalAddress\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#local-main-place-address\",\"streetAddress\":\"Hennes-Weisweiler-Allee 23\",\"addressLocality\":\"M\u00f6nchengladbach\",\"postalCode\":\"41179\",\"addressRegion\":\"Deutschland\",\"addressCountry\":\"DE\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"contentUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"caption\":\"credativ\u00ae\"}]}<\/script>\n<meta name=\"geo.placename\" content=\"M\u00f6nchengladbach\" \/>\n<meta name=\"geo.position\" content=\"51.1732374;6.392010099999999\" \/>\n<meta name=\"geo.region\" content=\"Germany\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak - credativ\u00ae","description":"PostgreSQL 18 offers native OAuth2 support. Here's how you can use this feature with Docker Compose.","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:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak","og_description":"PostgreSQL 18 offers native OAuth2 support. Here's how you can use this feature with Docker Compose.","og_url":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/","og_site_name":"credativ\u00ae","article_publisher":"https:\/\/www.facebook.com\/credativDE\/","article_published_time":"2025-07-11T07:55:21+00:00","article_modified_time":"2025-11-24T18:18:58+00:00","og_image":[{"width":2048,"height":2048,"url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png","type":"image\/png"}],"author":"Felix Alipaz-Dicke","twitter_card":"summary_large_image","twitter_creator":"@credativde","twitter_site":"@credativde","twitter_misc":{"Written by":"Felix Alipaz-Dicke","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#article","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/"},"author":{"name":"Felix Alipaz-Dicke","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/f7368d35ad7a1d1644fe6a02d38e94f0"},"headline":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak","datePublished":"2025-07-11T07:55:21+00:00","dateModified":"2025-11-24T18:18:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/"},"wordCount":684,"commentCount":0,"publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#primaryimage"},"thumbnailUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png","keywords":["OAuth2","PostgreSQL\u00ae"],"articleSection":["credativ\u00ae Inside","PostgreSQL\u00ae"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/www.credativ.de\/#organization"}},{"@type":"WebPage","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/","url":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/","name":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak - credativ\u00ae","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#primaryimage"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#primaryimage"},"thumbnailUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png","datePublished":"2025-07-11T07:55:21+00:00","dateModified":"2025-11-24T18:18:58+00:00","description":"PostgreSQL 18 offers native OAuth2 support. Here's how you can use this feature with Docker Compose.","breadcrumb":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#primaryimage","url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png","contentUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/07\/Gemini_Generated_Image_rdvsmprdvsmprdvs.png","width":2048,"height":2048,"caption":"PostgreSQL Meets OAuth2"},{"@type":"BreadcrumbList","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.credativ.de\/en\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 18 Meets OAuth2: how Native Support Works with Keycloak"}]},{"@type":"WebSite","@id":"https:\/\/www.credativ.de\/en\/#website","url":"https:\/\/www.credativ.de\/en\/","name":"credativ GmbH","description":"","publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.credativ.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Organization","Place"],"@id":"https:\/\/www.credativ.de\/en\/#organization","name":"credativ\u00ae","url":"https:\/\/www.credativ.de\/en\/","logo":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#local-main-organization-logo"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/credativDE\/","https:\/\/x.com\/credativde","https:\/\/mastodon.social\/@credativde","https:\/\/www.linkedin.com\/company\/credativ-gmbh","https:\/\/www.instagram.com\/credativ\/"],"description":"Die credativ GmbH ist ein f\u00fchrendes, auf Open Source Software spezialisiertes IT-Dienstleistungs- und Beratungsunternehmen. Wir bieten umfassende und professionelle Services, von Beratung und Infrastruktur-Betrieb \u00fcber 24\/7 Support bis hin zu individuellen L\u00f6sungen und Schulungen. Unser Fokus liegt auf dem ganzheitlichen Management von gesch\u00e4ftskritischen Open-Source-Systemen, darunter Betriebssysteme (z.B. Linux), Datenbanken (z.B. PostgreSQL), Konfigurationsmanagement (z.B. Ansible, Puppet) und Virtualisierung. Als engagierter Teil der Open-Source-Community unterst\u00fctzen wir unsere Kunden dabei, die Vorteile freier Software sicher, stabil und effizient in ihrer IT-Umgebung zu nutzen.","legalName":"credativ GmbH","foundingDate":"2025-03-01","duns":"316387060","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"11","maxValue":"50"},"address":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#local-main-place-address"},"geo":{"@type":"GeoCoordinates","latitude":"51.1732374","longitude":"6.392010099999999"},"telephone":["+4921619174200","08002733284"],"contactPoint":{"@type":"ContactPoint","telephone":"08002733284","email":"vertrieb@credativ.de"},"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"17:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday"],"opens":"00:00","closes":"00:00"}],"email":"info@credativ.de","areaServed":"D-A-CH","vatID":"DE452151696"},{"@type":"Person","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/f7368d35ad7a1d1644fe6a02d38e94f0","name":"Felix Alipaz-Dicke"},{"@type":"PostalAddress","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#local-main-place-address","streetAddress":"Hennes-Weisweiler-Allee 23","addressLocality":"M\u00f6nchengladbach","postalCode":"41179","addressRegion":"Deutschland","addressCountry":"DE"},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/postgresql-18-meets-oauth2-how-native-support-works-with-keycloak\/#local-main-organization-logo","url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","contentUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","caption":"credativ\u00ae"}]},"geo.placename":"M\u00f6nchengladbach","geo.position":{"lat":"51.1732374","long":"6.392010099999999"},"geo.region":"Germany"},"_links":{"self":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/9736","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/users\/84"}],"replies":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/comments?post=9736"}],"version-history":[{"count":3,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/9736\/revisions"}],"predecessor-version":[{"id":10260,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/9736\/revisions\/10260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/media\/9735"}],"wp:attachment":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/media?parent=9736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/categories?post=9736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/tags?post=9736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}