{"id":3922,"date":"2025-11-19T10:00:00","date_gmt":"2025-11-19T15:00:00","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3922"},"modified":"2025-11-16T22:25:29","modified_gmt":"2025-11-17T03:25:29","slug":"beyond-rbac-spring-security-6-oauth-2-1-and-the-zero-trust-evolution","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spng_security\/beyond-rbac-spring-security-6-oauth-2-1-and-the-zero-trust-evolution\/","title":{"rendered":"Beyond RBAC: Spring Security 6, OAuth 2.1, and the Zero-Trust Evolution"},"content":{"rendered":"\n<p>The journey to Zero Trust (ZT) is an ongoing architectural evolution, not a single deployment. While the foundational principles\u2014never trust, always verify\u2014are clear, implementing them in a distributed microservice environment requires rigorous adherence to modern standards.<\/p>\n\n\n\n<p>For <strong>Spring<\/strong> architects and developers, Spring Security 6 and the Spring Authorization Server provide the definitive toolkit to implement ZT at the application layer. This advanced guide moves past basic role-based access control (RBAC) to focus on three critical technical pillars: <strong>OAuth 2.1<\/strong>, <strong>Token Exchange (RFC 8693)<\/strong>, and <strong>Fine-Grained Authorization (FGA)<\/strong> via external policy engines.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. The Secure Baseline: Mandating OAuth 2.1<\/h2>\n\n\n\n<p>OAuth 2.1 is not a brand-new protocol; it\u2019s a necessary consolidation of the best practices and security extensions developed over the last decade of OAuth 2.0. In a ZT environment, where every interaction is scrutinized, using a &#8220;secure-by-default&#8221; standard like 2.1 is non-negotiable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key Shifts Mandatory for Zero Trust:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>PKCE for All:<\/strong> Proof Key for Code Exchange (PKCE) is now mandatory for <strong>all<\/strong> clients using the Authorization Code Flow, including confidential server-side applications. This eliminates the authorization code interception attack vector, providing cryptographically strong proof that the client exchanging the code is the same client that initiated the flow.<\/li>\n\n\n\n<li><strong>Insecure Flows Removed:<\/strong> The Implicit Grant Flow (due to token leakage risks in the browser) and the Resource Owner Password Credentials (ROPC) grant (due to credential exposure) are formally deprecated and removed. Spring Security 6 strongly encourages the Authorization Code with PKCE flow for all application types, including Single-Page Applications (SPAs) and mobile clients.<\/li>\n\n\n\n<li><strong>Strict Redirection:<\/strong> OAuth 2.1 mandates <strong>exact string matching<\/strong> for redirect URIs. This crucial change eliminates the possibility of open redirect vulnerabilities, a common attack surface that can be exploited to steal tokens.<\/li>\n<\/ol>\n\n\n\n<p><strong>Architectural Takeaway:<\/strong> By adopting Spring Security 6&#8217;s OAuth 2.1 support, you are ensuring that your application is compliant with the minimum security bar. Every client must be treated as potentially hostile, and 2.1 enforces the strongest possible initial security handshake.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. The Microservice Enabler: Token Exchange (RFC 8693)<\/h2>\n\n\n\n<p>In a microservice architecture, a single user request often results in a chain of service-to-service calls. If the initial access token is simply forwarded, you violate the Principle of Least Privilege: the downstream services receive an &#8220;over-permissioned&#8221; token intended for the initial gateway.<\/p>\n\n\n\n<p>This is where <strong>OAuth 2.0 Token Exchange (RFC 8693)<\/strong> becomes central to ZT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How Token Exchange Supports Least Privilege:<\/h3>\n\n\n\n<p>Token Exchange defines a mechanism where a Resource Server (Service A), acting as a client, can exchange the user&#8217;s initial access token (the <code>subject_token<\/code>) for a <em>new<\/em> token intended solely for a downstream service (Service B).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Parameter<\/strong><\/td><td><strong>Service A Token (Subject Token)<\/strong><\/td><td><strong>Service B Token (Requested Token)<\/strong><\/td><\/tr><tr><td><strong>Audience (<code>aud<\/code>)<\/strong><\/td><td><code>gateway-service<\/code>, <code>service-a<\/code><\/td><td><code>service-b<\/code> (Highly restricted)<\/td><\/tr><tr><td><strong>Scope (<code>scope<\/code>)<\/strong><\/td><td><code>user:read<\/code>, <code>data:write<\/code><\/td><td><code>internal:read-widget-detail<\/code> (Minimal)<\/td><\/tr><tr><td><strong>Token Type<\/strong><\/td><td><code>urn:ietf:params:oauth:token-type:access_token<\/code><\/td><td><code>urn:ietf:params:oauth:token-type:access_token<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Security 6.3+ Integration<\/h3>\n\n\n\n<p>With support shipping in Spring Security 6.3 (and Spring Authorization Server 1.3 for the provider side), implementing this delegated authority becomes standard.<\/p>\n\n\n\n<p>As a Spring architect, you can configure your service to act as both a <strong>Resource Server<\/strong> (to validate the incoming user token) and an <strong>OAuth2 Client<\/strong> (to execute the token exchange):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Client Configuration:<\/strong> Define your service as a client with the new <code>token-exchange<\/code> grant type enabled.<\/li>\n\n\n\n<li><strong>Token Acquisition:<\/strong> Use <code>OAuth2AuthorizedClientManager<\/code> to request the new token, passing the incoming user token as the subject token and explicitly setting the audience to the downstream service.<\/li>\n<\/ol>\n\n\n\n<p>This ensures that every internal service call is made with a newly minted, narrowly scoped access token, enforcing ZT at the service boundary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Decoupling Authorization with a Policy Engine<\/h2>\n\n\n\n<p>Authorization decisions that live within application code (e.g., <code>if (user.isAdmin())<\/code>) are brittle, untestable, and difficult to audit. Fine-Grained Authorization (FGA) decouples the &#8220;what&#8221; (business logic) from the &#8220;who, what, where, and why&#8221; (policy logic).<\/p>\n\n\n\n<p>For high-scale ZT, you need an external, centralized engine that manages policies as code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Power of Policy as Code<\/h3>\n\n\n\n<p>External policy engines, such as <strong>Open Policy Agent (OPA)<\/strong> using the <strong>Rego<\/strong> language, or <strong>OpenFGA<\/strong> (based on Zanzibar), offer critical benefits:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Centralization:<\/strong> All policies are defined in a single, version-controlled location.<\/li>\n\n\n\n<li><strong>Decoupling:<\/strong> Business logic merely asks, &#8220;Can User X perform Action Y on Resource Z?&#8221; The policy engine answers the request.<\/li>\n\n\n\n<li><strong>Contextual Decisions:<\/strong> Policies can evaluate complex attributes beyond simple roles, such as resource ownership, geo-location, time of day, or data sensitivity.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Integrating OPA into Spring Security 6<\/h3>\n\n\n\n<p>The most robust way to integrate a policy engine into a Spring Resource Server is by implementing a custom <strong><code>AuthorizationManager<\/code><\/strong>.<\/p>\n\n\n\n<p>In Spring Security 6, access control is handled by the <code>AuthorizationManager<\/code> interface (replacing the older <code>AccessDecisionManager<\/code>).<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create a Custom AuthorizationManager:<\/strong> This component intercepts the request before it hits your controller.<\/li>\n\n\n\n<li><strong>Construct the Input:<\/strong> Gather all relevant context:\n<ul class=\"wp-block-list\">\n<li><strong>Subject:<\/strong> User identity from the JWT (e.g., <code>authentication.getPrincipal()<\/code>).<\/li>\n\n\n\n<li><strong>Action:<\/strong> The HTTP method (GET, POST, etc.) and the requested path.<\/li>\n\n\n\n<li><strong>Resource:<\/strong> Path variables or request body data.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Call the Policy Engine:<\/strong> Your custom manager makes an HTTP call to the external OPA service, sending the input context.<\/li>\n\n\n\n<li><strong>Enforce the Decision:<\/strong> Based on the policy engine&#8217;s JSON response (e.g., <code>{\"allow\": true}<\/code>), the <code>AuthorizationManager<\/code> grants or denies access.<\/li>\n<\/ol>\n\n\n\n<p>This architecture shifts the security decision from a local code fragment to a remote, auditable, and easily updated policy. It achieves true separation of concerns, which is the hallmark of a mature ZT implementation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion: An Advanced Zero-Trust Architecture<\/h2>\n\n\n\n<p>By integrating the security enhancements of <strong>OAuth 2.1<\/strong>, the microservice-native capabilities of <strong>Token Exchange<\/strong>, and the architectural decoupling provided by a <strong>Policy Engine<\/strong>, you create a modern, defensible Zero-Trust architecture built on industry-leading standards.<\/p>\n\n\n\n<p>Spring Security 6 serves as the perfect enforcement point for this strategy, providing the necessary hooks (<code>SecurityFilterChain<\/code>, <code>AuthorizationManager<\/code>, and <code>OAuth2AuthorizedClientProvider<\/code>) to integrate these advanced standards seamlessly.<\/p>\n\n\n\n<p><strong>What to do next:<\/strong> If you&#8217;re using <strong>Gradle<\/strong> (as many Spring developers do), begin by adding the Spring Security OAuth2 client dependencies and exploring the configuration for the new Token Exchange provider. Then, focus your efforts on developing a custom <code>AuthorizationManager<\/code> to externalize your first policy into OPA.<\/p>\n\n\n\n<p>Let me know if you would like to dive deeper into the code structure for a custom <code>AuthorizationManager<\/code> integration or explore how to define a sample Rego policy for resource ownership!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The journey to Zero Trust (ZT) is an ongoing architectural evolution, not a single deployment. While the foundational principles\u2014never trust, always verify\u2014are clear, implementing them in a distributed microservice environment requires rigorous adherence to modern standards. For Spring architects and developers, Spring Security 6 and the Spring Authorization Server provide the definitive toolkit to implement [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3923,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[441],"tags":[477,476,319],"series":[],"class_list":["post-3922","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spng_security","tag-oauth","tag-security","tag-spring"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/coding-1841550_1280.avif","jetpack-related-posts":[{"id":3957,"url":"https:\/\/www.mymiller.name\/wordpress\/spring-admin\/mastering-spring-authorization-server-architectural-guide\/","url_meta":{"origin":3922,"position":0},"title":"Mastering Spring Authorization Server: Architectural Guide","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"As a Software Architect, transitioning from the legacy spring-security-oauth2 to the modern Spring Authorization Server (SAS) is a critical shift. This guide provides a deep dive into building a robust identity platform integrated with Spring Cloud Gateway and Social Logins. 1. Core Architecture: How it Works Spring Authorization Server is\u2026","rel":"","context":"In &quot;Spring Admin&quot;","block_context":{"text":"Spring Admin","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring-admin\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_dj5ssndj5ssndj5s.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_dj5ssndj5ssndj5s.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_dj5ssndj5ssndj5s.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_dj5ssndj5ssndj5s.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_dj5ssndj5ssndj5s.avif 3x"},"classes":[]},{"id":3438,"url":"https:\/\/www.mymiller.name\/wordpress\/spring\/architecting-with-spring-and-spring-cloud\/","url_meta":{"origin":3922,"position":1},"title":"Architecting with Spring and Spring Cloud","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Building a Multi-Service Architecture with Spring 3.1.x and Spring Cloud: Unlocking the Power of Microservices In the ever-evolving landscape of software development, microservices have emerged as a powerful architectural paradigm, enabling organizations to build scalable, resilient, and agile applications. Spring, a widely adopted Java framework, provides a comprehensive suite of\u2026","rel":"","context":"In &quot;Spring&quot;","block_context":{"text":"Spring","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3560,"url":"https:\/\/www.mymiller.name\/wordpress\/spng_security\/zero-trust-with-spring-boot-deep-dive-into-security\/","url_meta":{"origin":3922,"position":2},"title":"Zero Trust with Spring Boot: Deep Dive into Security","author":"Jeffery Miller","date":"September 22, 2025","format":false,"excerpt":"Zero Trust is a paradigm shift in security, assuming no inherent trust within a network. Implementing Zero Trust principles with Spring Boot fortifies your microservices against modern threats. Let\u2019s delve deeper into the key concepts: Secure Communication (HTTPS\/TLS): Encryption: HTTPS encrypts all communication between microservices, preventing eavesdropping and data tampering.\u2026","rel":"","context":"In &quot;Spring Security&quot;","block_context":{"text":"Spring Security","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spng_security\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_y76fbby76fbby76f.jpg?fit=1200%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_y76fbby76fbby76f.jpg?fit=1200%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_y76fbby76fbby76f.jpg?fit=1200%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_y76fbby76fbby76f.jpg?fit=1200%2C1200&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_y76fbby76fbby76f.jpg?fit=1200%2C1200&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3730,"url":"https:\/\/www.mymiller.name\/wordpress\/spng_security\/beyond-roles-fine-grained-authorization-with-spring-security-acls\/","url_meta":{"origin":3922,"position":3},"title":"Beyond Roles: Fine-Grained Authorization with Spring Security ACLs","author":"Jeffery Miller","date":"December 23, 2025","format":false,"excerpt":"Spring Security is a robust framework for securing your Java applications. While roles and authorities provide a good foundation for authorization, sometimes you need more granular control. This is where Access Control Lists (ACLs) shine. ACLs allow you to define permissions at the object level, offering greater flexibility and precision\u2026","rel":"","context":"In &quot;Spring Security&quot;","block_context":{"text":"Spring Security","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spng_security\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 3x"},"classes":[]},{"id":3641,"url":"https:\/\/www.mymiller.name\/wordpress\/spng_security\/integrating-java-spring-with-keycloak-a-comprehensive-guide\/","url_meta":{"origin":3922,"position":4},"title":"Integrating Java Spring with Keycloak: A Comprehensive Guide","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Java Spring, a popular framework for building enterprise-level applications, can seamlessly integrate with Keycloak, a robust open-source Identity and Access Management (IAM) solution. This combination offers a powerful way to implement secure authentication, authorization, and user management features in your Spring-based applications. Let\u2019s explore how to achieve this integration along\u2026","rel":"","context":"In &quot;Spring Security&quot;","block_context":{"text":"Spring Security","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spng_security\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/ghost-7571881_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/ghost-7571881_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/ghost-7571881_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/ghost-7571881_1280-jpg.avif 2x"},"classes":[]},{"id":3871,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_events\/tracking-user-lifecycle-capturing-login-failed-login-and-signup-events-in-spring-authorization-server\/","url_meta":{"origin":3922,"position":5},"title":"Tracking User Lifecycle: Capturing Login, Failed Login, and Signup Events in Spring Authorization Server","author":"Jeffery Miller","date":"November 24, 2025","format":false,"excerpt":"Understanding how users interact with your Spring Authorization Server is crucial for security, auditing, and gaining insights into user behavior. By capturing key lifecycle events like successful logins, failed login attempts, and new user signups, you can build a robust monitoring system. This post will guide you through the process\u2026","rel":"","context":"In &quot;Spring Events&quot;","block_context":{"text":"Spring Events","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_events\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/05\/technology-6701509_1280-1.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/05\/technology-6701509_1280-1.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/05\/technology-6701509_1280-1.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/05\/technology-6701509_1280-1.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/05\/technology-6701509_1280-1.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3922"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3922\/revisions"}],"predecessor-version":[{"id":3924,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3922\/revisions\/3924"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3923"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3922"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}