{"id":954,"date":"2019-02-12T18:10:27","date_gmt":"2019-02-12T17:10:27","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=954"},"modified":"2020-11-21T22:22:47","modified_gmt":"2020-11-21T21:22:47","slug":"identity-management-and-authentications","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/","title":{"rendered":"Identity Management and Authentication for Java Webservices and Javascript GUIs"},"content":{"rendered":"<p>I am currently working on a new project which uses <a href=\"https:\/\/vuejs.org\/\">Vue.js<\/a> on the frontend and <strong>JAX-RS Webservices<\/strong> implemented in Java in the backend. Both, the frontend and the backend will be deployed with Docker.<\/p>\n<p>The solution will need to <strong>manage customers, users<\/strong> and provide <strong>authentication<\/strong> to protect the web application and web services. It does not make any sense to build my own solution for this so I decided to base my architecture on some existing open source tools.<\/p>\n<h3>Open Source Identity Management Tools<\/h3>\n<p>There is quite an impressive list of potential <strong>Open Source Identity Management Tools<\/strong>. I also included LDAP based tools into the evaluation:<\/p>\n<ul class=\"ul1\">\n<li><a href=\"https:\/\/www.openldap.org\/\"><em>OpenLDAP<\/em><\/a><\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/directory.apache.org\/apacheds\/\">ApacheDS<\/a><\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/www.apereo.org\/projects\/cas\">Central Authentication Service (CAS)<\/a><span class=\"s1\"><\/span><\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/www.freeipa.org\/page\/Main_Page\">FreeIPA<\/a>.<\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/www.gluu.org\/\">Gluu<\/a>.<\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/www.keycloak.org\/\">Keycloak<\/a>.<\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/evolveum.com\/midpoint\/\">MidPoint<\/a>.<\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/github.com\/OpenIdentityPlatform\/OpenAM\">OpenAM<\/a>.<\/li>\n<li class=\"li1\"><span class=\"s1\"><\/span><a href=\"https:\/\/github.com\/OpenIdentityPlatform\/OpenDJ\">OpenDJ<\/a><\/li>\n<li>etc<\/li>\n<\/ul>\n<h3>Criteria<\/h3>\n<p>In order to evaluate the best fitting solution I defined my <strong>evaluation criteria<\/strong><\/p>\n<ul>\n<li>Manage our\u00a0<strong>Customers<\/strong> with custom attributes<\/li>\n<li>Manage <strong>Users<\/strong> with custom attributes<\/li>\n<li><strong>Java API<\/strong> to manage Customers and Users<\/li>\n<li><strong>Basic Processes<\/strong>: User Registration, Password Reset<\/li>\n<li>Basic Authentication functionality with <strong>Password Policies, Brute Force Detection<\/strong><\/li>\n<li>Authentication support with <strong>OpenID Connect<\/strong><\/li>\n<li>Integration with <strong>LDAP<\/strong><\/li>\n<li>Support of <strong>external Identity Providers<\/strong> (Microsoft, Google etc)<\/li>\n<li><strong>Easy to use<\/strong><\/li>\n<li>Integration with <strong>Vue.js <\/strong>for Authentication<\/li>\n<li>Integration with <strong>Java Webservices<\/strong> (JAX-RS) for Authentication<\/li>\n<li>Easy to deploy with <strong>Docker<\/strong><\/li>\n<li>Integration with <strong>WordPress<\/strong><\/li>\n<li><strong>Open Source<\/strong><\/li>\n<\/ul>\n<h3>Result<\/h3>\n<p>LDAP is quite popular but it is quite painful to extend the schema and it is missing most of my defined criteria.<\/p>\n<p>There is basically only <strong>one tool<\/strong> which turned out to be <strong>the<\/strong>\u00a0<strong>perfect match<\/strong>: <a href=\"https:\/\/www.keycloak.org\/\">Keycloak<\/a>. The user, roles and user groups provide dynamic key values so it is easy to store our custom attributes with the help of a <a href=\"https:\/\/www.keycloak.org\/documentation.html\">Java API or with some web services.<\/a><\/p>\n<p>Usually my Webservices are based on <a href=\"https:\/\/jersey.github.io\/\">Jersey<\/a>. Unfortunately it turned out that the Keycloak API was based on <a href=\"https:\/\/resteasy.github.io\/\">RestEasy<\/a> and it did not feel right to have two\u00a0JAX-RS frameworks in parallel so I moved my solution to\u00a0RestEasy as well.<\/p>\n<p>In order to simplify the deployment of the web services in Docker I usually integrate an embedded server.\u00a0 For RestEasy I could use the <strong>UndertowJaxrsServer<\/strong>\u00a0and with 2 lines of code I had my embedded web server running as well<\/p>\n<p><code><span style=\"color: #3366ff;\">UndertowJaxrsServer  server = new UndertowJaxrsServer().deploy(new Application());<\/span><\/code><code><span style=\"color: #3366ff;\"><\/span><\/code><\/p>\n<p><code><span style=\"color: #3366ff;\">server.start(Undertow.builder().addHttpListener(Integer.parseInt(port), host));<\/span><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I am currently working on a new project which uses Vue.js on the frontend and JAX-RS Webservices implemented in Java in the backend. Both, the frontend and the backend will be deployed with Docker. The solution will need to manage customers, users and provide authentication to protect the web application [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-infrastructure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"I am currently working on a new project which uses Vue.js on the frontend and JAX-RS Webservices implemented in Java in the backend. Both, the frontend and the backend will be deployed with Docker. The solution will need to manage customers, users and provide authentication to protect the web application [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-12T17:10:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-21T21:22:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png\" \/>\n\t<meta property=\"og:image:width\" content=\"225\" \/>\n\t<meta property=\"og:image:height\" content=\"225\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Identity Management and Authentication for Java Webservices and Javascript GUIs\",\"datePublished\":\"2019-02-12T17:10:27+00:00\",\"dateModified\":\"2020-11-21T21:22:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/\"},\"wordCount\":368,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/keycloak.png\",\"articleSection\":[\"Infrastructure\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/\",\"name\":\"Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/keycloak.png\",\"datePublished\":\"2019-02-12T17:10:27+00:00\",\"dateModified\":\"2020-11-21T21:22:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/keycloak.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/keycloak.png\",\"width\":225,\"height\":225},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2019\\\/02\\\/12\\\/identity-management-and-authentications\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Identity Management and Authentication for Java Webservices and Javascript GUIs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann","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.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/","og_locale":"en_US","og_type":"article","og_title":"Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann","og_description":"I am currently working on a new project which uses Vue.js on the frontend and JAX-RS Webservices implemented in Java in the backend. Both, the frontend and the backend will be deployed with Docker. The solution will need to manage customers, users and provide authentication to protect the web application [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/","og_site_name":"Phil Schatzmann","article_published_time":"2019-02-12T17:10:27+00:00","article_modified_time":"2020-11-21T21:22:47+00:00","og_image":[{"width":225,"height":225,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png","type":"image\/png"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Identity Management and Authentication for Java Webservices and Javascript GUIs","datePublished":"2019-02-12T17:10:27+00:00","dateModified":"2020-11-21T21:22:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/"},"wordCount":368,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png","articleSection":["Infrastructure"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/","url":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/","name":"Identity Management and Authentication for Java Webservices and Javascript GUIs - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png","datePublished":"2019-02-12T17:10:27+00:00","dateModified":"2020-11-21T21:22:47+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2019\/02\/keycloak.png","width":225,"height":225},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2019\/02\/12\/identity-management-and-authentications\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Identity Management and Authentication for Java Webservices and Javascript GUIs"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=954"}],"version-history":[{"count":1,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/954\/revisions"}],"predecessor-version":[{"id":1823,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/954\/revisions\/1823"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/971"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}