<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Apereo Community Blog</title>
    <description>This is a blog managed and edited by the Apereo project participants. It is typically used to post project updates, announce news, etc.</description>
    <link>https://apereo.github.io/</link>
    <atom:link href="https://apereo.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>OpenID Federation with pac4j and CAS</title>
        <description>&lt;p&gt;As CAS v8.1.0 will support the three roles of the OpenID federation protocol: trust anchor, intermediate and OP, this is the perfect opportunity to present a live demo.&lt;/p&gt;

&lt;p&gt;The setup consists of three components:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;a client, referred to as the Relying Party (RP) in OIDC, implemented with pac4j&lt;/li&gt;
  &lt;li&gt;a server, referred to as the OpenID Provider (OP) in OIDC, implemented with the CAS server&lt;/li&gt;
  &lt;li&gt;a Trust Anchor (TA), also implemented with the CAS server, responsible for establishing trust between the other two components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although we use the CAS server for the OP and the TA, we can’t use a single CAS node: we have two separate nodes of the CAS server, each supporting an exclusive role.&lt;/p&gt;

&lt;p&gt;The following URLs are used:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the OP runs on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8080/cas&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;the RP runs on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8081&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;the TA runs on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8082/cas&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the CAS server nodes, we use this basic Maven overlay: &lt;a href=&quot;https://github.com/casinthecloud/cas-overlay-demo&quot;&gt;https://github.com/casinthecloud/cas-overlay-demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both our CAS servers have a similar &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pom.xml&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;project&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://maven.apache.org/POM/4.0.0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:xsi=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.casinthecloud&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-overlay-demo&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.1.0-SNAPSHOT&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;war&lt;span class=&quot;nt&quot;&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apereo.cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-server-webapp${tomcat.properties}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${cas.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;type&amp;gt;&lt;/span&gt;war&lt;span class=&quot;nt&quot;&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;runtime&lt;span class=&quot;nt&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apereo.cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-server-support-oidc-federation&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${cas.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-war-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.3.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;failOnMissingWebXml&amp;gt;&lt;/span&gt;false&lt;span class=&quot;nt&quot;&gt;&amp;lt;/failOnMissingWebXml&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;recompressZippedFiles&amp;gt;&lt;/span&gt;false&lt;span class=&quot;nt&quot;&gt;&amp;lt;/recompressZippedFiles&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;archive&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;compress&amp;gt;&lt;/span&gt;false&lt;span class=&quot;nt&quot;&gt;&amp;lt;/compress&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;manifestFile&amp;gt;&lt;/span&gt;${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${tomcat.properties}/META-INF/MANIFEST.MF&lt;span class=&quot;nt&quot;&gt;&amp;lt;/manifestFile&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/archive&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;overlays&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;overlay&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apereo.cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-server-webapp${tomcat.properties}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/overlay&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/overlays&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.8.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;release&amp;gt;&lt;/span&gt;${java.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/release&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.2.0-M1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;mainClass&amp;gt;&lt;/span&gt;org.apereo.cas.web.CasWebApplication&lt;span class=&quot;nt&quot;&gt;&amp;lt;/mainClass&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;excludes&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apereo.cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-server-webapp-tomcat&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/excludes&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;nt&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;repackage&lt;span class=&quot;nt&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;finalName&amp;gt;&lt;/span&gt;cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/finalName&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;cas.version&amp;gt;&lt;/span&gt;8.1.0-RC1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/cas.version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;java.version&amp;gt;&lt;/span&gt;25&lt;span class=&quot;nt&quot;&gt;&amp;lt;/java.version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;tomcat.properties&amp;gt;&lt;/span&gt;-tomcat&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tomcat.properties&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;project.build.sourceEncoding&amp;gt;&lt;/span&gt;UTF-8&lt;span class=&quot;nt&quot;&gt;&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The OP has one more CAS dependency though (compared to the TA):&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apereo.cas&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;cas-server-support-oidc&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${cas.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the configuration specific to each server changes.&lt;/p&gt;

&lt;p&gt;For the pac4j application, we use this simple demo: &lt;a href=&quot;https://github.com/pac4j/simple-spring-boot-pac4j-demos/tree/oidc/src/main/java/org/pac4j/demos&quot;&gt;https://github.com/pac4j/simple-spring-boot-pac4j-demos/tree/oidc/src/main/java/org/pac4j/demos&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1-setup-a-cas-server-as-the-op&quot;&gt;1) Setup a CAS server as the OP&lt;/h2&gt;

&lt;p&gt;In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application.yml&lt;/code&gt; file, let’s set up the CAS server to act as the trust anchor:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;server.ssl.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;server.port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8080&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.tgc.secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.tgc.same-site-policy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Lax&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.tgc.crypto.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.webflow.crypto.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.server.name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:${server.port}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.server.prefix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${cas.server.name}/cas&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.host.name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;casop&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.jwks.file-system.jwks-file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;file:./metadata/oidc.jwks&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;OPENID_PROVIDER&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.jwks-file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;file:./metadata/federation.jwks&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.authority-hints&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8082/cas/oidc&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.core.issuer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${cas.server.prefix}/oidc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The configuration is quite easy: we set up the CAS server to run on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8080/cas&lt;/code&gt; (no SSL, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Lax&lt;/code&gt; policy, no cookie/webflow encryption, &lt;strong&gt;this is for development only&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;For OIDC, we define its OIDC base URL (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;issuer&lt;/code&gt;) and its JWKS (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./metadata/oidc.jwks&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;And for the federation part, we set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OPENID_PROVIDER&lt;/code&gt; role, the specific JWKS (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./metadata/federation.jwks&lt;/code&gt;) and the trust anchor:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.authority-hints&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8082/cas/oidc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;2-setup-the-pac4j-application-as-the-rp&quot;&gt;2) Setup the pac4j application as the RP&lt;/h2&gt;

&lt;p&gt;In the pac4j ecosystem, Spring Boot is the most popular web stack, so we use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spring-webmvc-pac4j&lt;/code&gt; implementation in this simple demo: &lt;a href=&quot;https://github.com/pac4j/simple-spring-boot-pac4j-demos/tree/oidc/src/main/java/org/pac4j/demos&quot;&gt;https://github.com/pac4j/simple-spring-boot-pac4j-demos/tree/oidc/src/main/java/org/pac4j/demos&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpringBootDemo&lt;/code&gt; class runs the Spring Boot demo&lt;/li&gt;
  &lt;li&gt;the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SecurityConfig&lt;/code&gt; class defines the security configuration (OIDC + URL protection)&lt;/li&gt;
  &lt;li&gt;the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Application&lt;/code&gt; class is a simple controller with two URLs: one public and the other one protected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;a-dependencies&quot;&gt;a) Dependencies&lt;/h3&gt;

&lt;p&gt;We need the following dependencies:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.pac4j&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-webmvc-pac4j&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.0.3&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.pac4j&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;pac4j-oidc&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;6.5.6&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;b-properties&quot;&gt;b) Properties&lt;/h3&gt;

&lt;p&gt;We run it on port 8081 thanks to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application.properties&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;py&quot;&gt;server.port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;8081&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;app.base-url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;http://localhost:8081&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;c-securityconfig-class&quot;&gt;c) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SecurityConfig&lt;/code&gt; class&lt;/h3&gt;

&lt;p&gt;We update the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SecurityConfig&lt;/code&gt; class to change the configuration for the federation:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.demos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;com.nimbusds.jose.JWSAlgorithm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;com.nimbusds.oauth2.sdk.auth.ClientAuthenticationMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.core.config.Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.oidc.client.OidcClient&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.oidc.config.OidcConfiguration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.oidc.config.method.PrivateKeyJwtClientAuthnMethodConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.oidc.federation.config.OidcTrustAnchorProperties&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.pac4j.springframework.config.Pac4jSecurityConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.beans.factory.annotation.Value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.context.annotation.Configuration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.web.servlet.config.annotation.InterceptorRegistry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@Configuration&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SecurityConfig&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pac4jSecurityConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${app.base-url:http://localhost:8080}&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;baseUri&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Bean&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OidcConfiguration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setAllowUnsignedIdTokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getRpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;file:./metadata/rpjwks.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setKid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;defaultjwks26&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setClientAuthenticationMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ClientAuthenticationMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PRIVATE_KEY_JWT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;privateKeyJwtConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PrivateKeyJwtClientAuthnMethodConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setPrivateKeyJWTClientAuthnMethodConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;privateKeyJwtConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setRequestObjectSigningAlgorithm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;JWSAlgorithm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;RS256&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFederation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setTargetOp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8080/cas/oidc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OidcTrustAnchorProperties&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setIssuer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8082/cas/oidc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;classpath:trustanchor.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTrustAnchors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;file:./metadata/oidcfede.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setKid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mykeyoidcfede26&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setContactName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;RP with CAS&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setContactEmails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jerome@casinthecloud.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setEntityId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8081&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;baseUri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;/callback&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OidcClient&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addInterceptors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;InterceptorRegistry&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;registry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;addSecurity&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;registry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;OidcClient&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;addPathPatterns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/protected/**&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The configuration is more complicated here.&lt;/p&gt;

&lt;p&gt;We define a global JWKS for the RP that is also used for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;private_key_jwt&lt;/code&gt; authentication method:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getRpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;file:./metadata/rpjwks.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setKid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;defaultjwks26&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setClientAuthenticationMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ClientAuthenticationMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PRIVATE_KEY_JWT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;privateKeyJwtConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PrivateKeyJwtClientAuthnMethodConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rpJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setPrivateKeyJWTClientAuthnMethodConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;privateKeyJwtConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For federation, we use:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setRequestObjectSigningAlgorithm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;JWSAlgorithm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;RS256&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFederation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setTargetOp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8080/cas/oidc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OidcTrustAnchorProperties&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setIssuer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8082/cas/oidc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;classpath:trustanchor.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTrustAnchors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The target OP is of course the CAS server acting as an OP.&lt;/p&gt;

&lt;p&gt;For the trust anchor, it’s the other CAS node (on port 8082) for which we retrieve the JWKS from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8082/cas/oidc/.well-known/openid-federation&lt;/code&gt; and save it in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trustanchor.jwks&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;keys&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kty&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AQAB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;use&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;19f7aaaa-c4d3-4c26-a26e-3ce4b8ab1beb&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;uXgnb...SEdSw&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also have a specific JWKS configuration dedicated to federation (displayed on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.well-known/openid-federation&lt;/code&gt; endpoint):&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setJwksPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;file:./metadata/oidcfede.jwks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJwks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setKid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mykeyoidcfede26&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setContactName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;RP with CAS&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setContactEmails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jerome@casinthecloud.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;federation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setEntityId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://localhost:8081&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;d-application-class&quot;&gt;d) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Application&lt;/code&gt; class&lt;/h3&gt;

&lt;p&gt;We also need to update the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Application&lt;/code&gt; class to add the mapping for the OpenID federation endpoint:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Controller&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Application&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;/.well-known/openid-federation&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;produces&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DefaultEntityConfigurationGenerator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;CONTENT_TYPE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@ResponseBody&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;oidcFederation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HttpAction&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oidcClient&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;OidcClient&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getClients&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findClient&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;OidcClient&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oidcClient&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getConfiguration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFederation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getEntityConfigurationGenerator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;generateEntityStatement&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;3-setup-a-cas-server-as-the-trust-anchor&quot;&gt;3) Setup a CAS server as the trust anchor&lt;/h2&gt;

&lt;p&gt;In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application.yml&lt;/code&gt; file, let’s set up the CAS server as the trust anchor this time:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;server.ssl.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;server.port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8082&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.tgc.secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.tgc.same-site-policy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Lax&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.tgc.crypto.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.webflow.crypto.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.server.name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:${server.port}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.server.prefix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${cas.server.name}/cas&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.host.name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;casta&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TRUST_ANCHOR&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.jwks-file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;file:./metadata/trustanchor.jwks&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.core.issuer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${cas.server.prefix}/oidc&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cas.authn.oidc.federation.subordinate-directory&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./subordinates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The configuration is close to that of the other CAS node, except that we define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TRUST_ANCHOR&lt;/code&gt; role as well as the file directory in which we will define its subordinates.&lt;/p&gt;

&lt;p&gt;The subordinates are the entities for which the CAS server provides trust. They must be defined upfront with their metadata and their federation key(s).&lt;/p&gt;

&lt;p&gt;Here, it will be the RP (the pac4j client, Spring Boot demo) and the OP (the other CAS server).&lt;/p&gt;

&lt;p&gt;For the RP (pac4j), we call the URL: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8081/.well-known/openid-federation&lt;/code&gt;. An entity statement is returned by the Spring Boot demo and we can decode it via any JWT tool or the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwt.io&lt;/code&gt; website.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keys&lt;/code&gt; from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks&lt;/code&gt; property (not in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata&lt;/code&gt; property) are the ones we use to build the subordinate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rp.json&lt;/code&gt; file (placed in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./subordinates&lt;/code&gt; directory):&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;entityId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8081&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;openid_relying_party&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;redirect_uris&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8081/callback?client_name=OidcClient&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;application_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;web&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;response_types&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;grant_types&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;authorization_code&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scope&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;openid email profile&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;token_endpoint_auth_method&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;private_key_jwt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;token_endpoint_auth_signing_alg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;request_object_signing_alg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jwks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;keys&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kty&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AQAB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;use&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;defaultjwks26&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;v-zf7...G2tyw&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;client_registration_types&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;explicit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;automatic&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;client_name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RP with CAS&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;contacts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;jerome@casinthecloud.com&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;federationKeys&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kty&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AQAB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;use&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mykeyoidcfede26&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;uaov...EpbZQ&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the OP (CAS server), we do something similar and call the URL: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8080/cas/oidc/.well-known/openid-federation&lt;/code&gt; to get the metadata and the federation keys and create the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;op.json&lt;/code&gt; file (in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./subordinates&lt;/code&gt; directory).&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;entityId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/cas/oidc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;openid_provider&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;DPopSigningAlgValuesSupported&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES512&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;request_parameter_supported&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pushed_authorization_request_endpoint&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/cas/oidc/oidcPushAuthorize&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;introspection_signing_alg_values_supported&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS512&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;TRUNCATED&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;registration_endpoint&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/cas/oidc/register&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;request_object_signing_alg_values_supported&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RS512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PS512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ES512&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS384&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HS512&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;request_object_encryption_alg_values_supported&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA1_5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA-OAEP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA-OAEP-256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A128KW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A192KW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A256KW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A128GCMKW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A192GCMKW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;A256GCMKW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ECDH-ES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ECDH-ES+A128KW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ECDH-ES+A192KW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ECDH-ES+A256KW&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;federation_entity&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;organization_name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Apereo CAS&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;contacts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;federationKeys&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kty&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;RSA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;AQAB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;use&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0bf6c36e-1cba-41d3-a50e-a11881fd85e7&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;xoP5Q...3EkRw&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;4-final-test&quot;&gt;4) Final test&lt;/h2&gt;

&lt;p&gt;With the RP, OP and TA started, we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8081&lt;/code&gt; in the browser:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;pac4j home page&quot; src=&quot;https://www.pac4j.org/img/blog/2026_10/pac4j_before.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then, we click on the “Protected area” link.&lt;/p&gt;

&lt;p&gt;On the CAS server login page, we use the pre-defined user: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;casuser&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mellon&lt;/code&gt; to log in:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;CAS login page&quot; src=&quot;https://www.pac4j.org/img/blog/2026_10/cas_login.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and we validate the authorizations:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;CAS authorization page&quot; src=&quot;https://www.pac4j.org/img/blog/2026_10/cas_authorize.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And it works:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;pac4j authenticated page&quot; src=&quot;https://www.pac4j.org/img/blog/2026_10/pac4j_after.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We are finally logged in to the pac4j application thanks to the OpenID Federation protocol and the two CAS server nodes.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;So the CAS server can now act as a federated OP and as a trust anchor &lt;i&gt;with&lt;/i&gt; the pac4j RP client.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.casinthecloud.com/index-en.html&quot;&gt;Jerome LELEU&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/09/01/openidfederation/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/09/01/openidfederation/</guid>
      </item>
    
      <item>
        <title>CAS Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;, which describes a security vulnerability that mainly affects how the CAS server operates as an OAuth or OpenID Connect identity provider.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.3.x
- 8.0.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are (or your institution is) a member of the Apereo foundation with &lt;em&gt;an active support subscription&lt;/em&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;exposure&quot;&gt;Exposure&lt;/h1&gt;

&lt;p&gt;You are affected if your CAS deployment qualifies for &lt;strong&gt;ANY&lt;/strong&gt; of the following conditions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;CAS is configured to act as an OAuth identity provider.&lt;/li&gt;
  &lt;li&gt;…or, CAS is configured to act as an OpenID Connect identity provider.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are also changes in place to protect against a few other variations of &lt;a href=&quot;https://apereo.github.io/2026/08/18/vuln/&quot;&gt;this issue&lt;/a&gt;. These fixes apply to the CAS server as a whole and are not connected to a particular feature or extension module.&lt;/p&gt;

&lt;p&gt;Finally the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.0.x&lt;/code&gt; security patch release, described below, also presents small and yet important changes to strengthen delegated authentication requests particularly for external SAML2 and OpenID Connect identity providers. For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.x&lt;/code&gt; deployments that use delegated authentication features routing requests to external SAML2 and OpenID Connect identity providers, the recommendation is to upgrade to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.0.x&lt;/code&gt; line to benefit from these security fixes.&lt;/p&gt;

&lt;p&gt;The fixes mainly cover the following areas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Carry-over from &lt;a href=&quot;https://apereo.github.io/2026/08/18/vuln/&quot;&gt;here&lt;/a&gt; to fix a few more affected areas: A request parameter whose name equals the FQCN of the internal service attribute key &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org.apereo.cas.authentication.principal.Service&lt;/code&gt; overrides the CAS response target after login. CAS issues the Service Ticket (ST) for the legitimate registered service, but redirects the victim to the attacker-controlled URL with the ST appended.&lt;/li&gt;
  &lt;li&gt;CAS corrected an issue where percent-encoded OAuth and OpenID Connect endpoint paths could be interpreted differently by request routing and security filters. For example, an encoded character in an endpoint name could cause CAS to route the request normally while an access-control or throttling filter failed to recognize the endpoint. In affected configurations, this could bypass protections for endpoints such as (but not limited to) OIDC dynamic client registration and client configuration retrieval, potentially allowing unauthorized registration or disclosure of client information. The fix normalizes percent-encoded request paths before applying OAuth/OIDC security and throttling rules. Regression tests now cover all relevant OAuth and OIDC endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;timeline--credits&quot;&gt;Timeline &amp;amp; Credits&lt;/h1&gt;

&lt;p&gt;The issues were originally reported to the CAS project on August 23rd, 2026 and fixed on August 24th, 2026. The issues were reported to the project by third-parties researchers and adopters and were then further validated and tested by Mr. Jérôme Leleu, who is a long-time project member and an active committer.&lt;/p&gt;

&lt;p&gt;Thank you everyone!&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases were published on August 25th, 2026. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Drop-in Replacement?&lt;/strong&gt;&lt;br /&gt;
  For the most part, a drop-in replacement release (as is the case for almost all security patch releases) does not require you to change platform requirements, Java versions, application registration records, user interface, CAS configuration, logging semantics, etc. For most deployments, this should be closer to &lt;i&gt;“upgrade and verify”&lt;/i&gt; than &lt;i&gt;“cancel your weekend.”&lt;/i&gt;, unless explicitly (and uncommonly) noted otherwise.&lt;br /&gt;&lt;br /&gt;

  The only serious exception to this rule would be in scenarios where you have modified Java code and CAS server internal components and your changes directly overwrite upstream&apos;s fixes. While we do our best to ensure fixes are non-intrusive with a low footprint as much as possible, we cannot guarantee that your custom Java components that entirely overwrite and overlay on top of CAS remain fully functional or compatible with CAS APIs and implementations. The risk with owning code is that you own the code. Review and assess carefully.
&lt;/div&gt;

&lt;h2 id=&quot;versions&quot;&gt;Versions&lt;/h2&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Forward Ports&lt;/strong&gt;&lt;br /&gt;
  Any CAS version that is still in development and considered a work-in-progress automatically receives any and all fixes. All changes are expected to be carried forward and released in due time.
&lt;/div&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.8.2&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;80x&quot;&gt;8.0.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.0.1.2&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the appropriate release version noted above by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./gradlew[.bat] clean build&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;security-in-the-ai-era&quot;&gt;Security In The AI Era&lt;/h1&gt;

&lt;p&gt;We are beginning to see a clear trend in how security issues are researched and reported: AI is playing a much larger role in analyzing, documenting, explaining, and submitting potential vulnerability reports. This is not unique to CAS. It is happening across open source. The same productivity gains that AI gives developers and maintainers are also changing how code is reviewed, assessed, challenged, and patched. As &lt;a href=&quot;https://spring.io/blog/2026/06/01/spring_and_security_in_the_times_of_ai&quot;&gt;this article&lt;/a&gt; puts it:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;It’s one thing for a development team of 4-10 engineers to use generative AI to build new features faster. It’s a whole other situation when, for each engineer on the team, there are dozens in our community using generative AI to create issues, pull requests, and security reports.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI did not just learn to write code. It also learned to open security reports, explain them confidently, attach a proof of concept, and then politely ask why nobody has fixed it yet! This trend is likely to accelerate. With that in mind, we would like to highlight two practical points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Maintainer capacity is a real constraint.&lt;/strong&gt; Human resources and available maintainer time matter a great deal here. It is very likely that time-to-fix expectations will need to stretch, not just for CAS but for many open source projects. If the volume of security reports becomes difficult to manage, our response may be slower than usual. There are only a few of us, and many of you, them, and possibly a small army of extremely confident, polite autocomplete machines. Please set expectations accordingly, and &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;review the vulnerability response process&lt;/a&gt; to understand how reports are handled and what commitments, if any, can realistically be made.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automated verification and deployment are no longer optional luxuries.&lt;/strong&gt; It is becoming increasingly important for adopters of open source projects, especially CAS, to invest in tooling and processes that support automated release verification, automated integration testing, reliable CI/CD pipelines, and fast production deployment. If your current deployment process depends on manual steps, delayed approvals, synchronous coordination, or one heroic person remembering the exact production checklist from 2019, you may start to feel the pain. As security fixes and patches appear more frequently, teams with slow or manual deployment practices will have a harder time consuming updates quickly and safely.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/08/25/vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/08/25/vuln/</guid>
      </item>
    
      <item>
        <title>CAS Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;, which describes a security vulnerability that affects how the CAS server manages application authentication requests.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.3.x
- 8.0.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are (or your institution is) a member of the Apereo foundation with &lt;em&gt;an active support subscription&lt;/em&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;exposure&quot;&gt;Exposure&lt;/h1&gt;

&lt;p&gt;The issue is not tied to a specific feature of the CAS software and is an &lt;a href=&quot;https://owasp.org/www-community/attacks/open_redirect&quot;&gt;Open Redirect&lt;/a&gt; type of vulnerability. You are affected by this security vulnerability if you simply run CAS.&lt;/p&gt;

&lt;p&gt;A request parameter whose name equals the FQCN of the internal service attribute key &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org.apereo.cas.authentication.principal.Service&lt;/code&gt; overrides the CAS response target after login. CAS issues the Service Ticket (ST) for the legitimate registered service, but redirects the victim to the attacker-controlled URL with the ST appended.&lt;/p&gt;

&lt;h1 id=&quot;timeline--credits&quot;&gt;Timeline &amp;amp; Credits&lt;/h1&gt;

&lt;p&gt;The issue was originally reported to the CAS project on August 16th, 2026 and fixed on August 17th, 2026. The reporter decided to remain anonymous. Thank you anyway!&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases were published on August 17th, 2026. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Drop-in Replacement?&lt;/strong&gt;&lt;br /&gt;
  For the most part, a drop-in replacement release (as is the case for almost all security patch releases) does not require you to change platform requirements, Java versions, application registration records, user interface, CAS configuration, logging semantics, etc. For most deployments, this should be closer to &lt;i&gt;“upgrade and verify”&lt;/i&gt; than &lt;i&gt;“cancel your weekend.”&lt;/i&gt;, unless explicitly (and uncommonly) noted otherwise.&lt;br /&gt;&lt;br /&gt;

  The only serious exception to this rule would be in scenarios where you have modified Java code and CAS server internal components and your changes directly overwrite upstream&apos;s fixes. While we do our best to ensure fixes are non-intrusive with a low footprint as much as possible, we cannot guarantee that your custom Java components that entirely overwrite and overlay on top of CAS remain fully functional or compatible with CAS APIs and implementations. The risk with owning code is that you own the code. Review and assess carefully.
&lt;/div&gt;

&lt;h2 id=&quot;versions&quot;&gt;Versions&lt;/h2&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Forward Ports&lt;/strong&gt;&lt;br /&gt;
  Any CAS version that is still in development and considered a work-in-progress automatically receives any and all fixes. All changes are expected to be carried forward and released in due time.
&lt;/div&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.8.1&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;80x&quot;&gt;8.0.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.0.1.1&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the appropriate release version noted above by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./gradlew[.bat] clean build&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;security-in-the-ai-era&quot;&gt;Security In The AI Era&lt;/h1&gt;

&lt;p&gt;We are beginning to see a clear trend in how security issues are researched and reported: AI is playing a much larger role in analyzing, documenting, explaining, and submitting potential vulnerability reports. This is not unique to CAS. It is happening across open source. The same productivity gains that AI gives developers and maintainers are also changing how code is reviewed, assessed, challenged, and patched. As &lt;a href=&quot;https://spring.io/blog/2026/06/01/spring_and_security_in_the_times_of_ai&quot;&gt;this article&lt;/a&gt; puts it:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;It’s one thing for a development team of 4-10 engineers to use generative AI to build new features faster. It’s a whole other situation when, for each engineer on the team, there are dozens in our community using generative AI to create issues, pull requests, and security reports.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI did not just learn to write code. It also learned to open security reports, explain them confidently, attach a proof of concept, and then politely ask why nobody has fixed it yet! This trend is likely to accelerate. With that in mind, we would like to highlight two practical points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Maintainer capacity is a real constraint.&lt;/strong&gt; Human resources and available maintainer time matter a great deal here. It is very likely that time-to-fix expectations will need to stretch, not just for CAS but for many open source projects. If the volume of security reports becomes difficult to manage, our response may be slower than usual. There are only a few of us, and many of you, them, and possibly a small army of extremely confident, polite autocomplete machines. Please set expectations accordingly, and &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;review the vulnerability response process&lt;/a&gt; to understand how reports are handled and what commitments, if any, can realistically be made.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automated verification and deployment are no longer optional luxuries.&lt;/strong&gt; It is becoming increasingly important for adopters of open source projects, especially CAS, to invest in tooling and processes that support automated release verification, automated integration testing, reliable CI/CD pipelines, and fast production deployment. If your current deployment process depends on manual steps, delayed approvals, synchronous coordination, or one heroic person remembering the exact production checklist from 2019, you may start to feel the pain. As security fixes and patches appear more frequently, teams with slow or manual deployment practices will have a harder time consuming updates quickly and safely.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/08/18/vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/08/18/vuln/</guid>
      </item>
    
      <item>
        <title>Changes to CAS Security Vulnerability Response</title>
        <description>&lt;h1 id=&quot;tldr&quot;&gt;TL;DR&lt;/h1&gt;

&lt;p&gt;The Apereo CAS project has approved a proposal to shorten our security grace window from &lt;strong&gt;four weeks&lt;/strong&gt; to &lt;strong&gt;two weeks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Going forward, security fixes will follow a two-week grace period before broader public disclosure and announcement. This change reflects both the current pace of software delivery and the evolving security landscape in which fixes, diffs, source artifacts, and public hints can be analyzed far more quickly than in the past.&lt;/p&gt;

&lt;h1 id=&quot;why-the-change&quot;&gt;Why the Change?&lt;/h1&gt;

&lt;p&gt;The previous four-week window was established at a time when many organizations still relied heavily on manual build, release, and deployment processes. It was intended to give adopters a reasonable amount of time to upgrade before security issues were more widely announced.&lt;/p&gt;

&lt;p&gt;That environment has changed significantly. Today, automated builds, dependency management tools, CI/CD pipelines, containerized deployments, and release automation are far more common. At the same time, security reports are arriving more frequently, and AI-assisted analysis has shortened the time between a fix being published and the underlying vulnerability being understood. In practice, this means the effective secrecy window around a security fix is much shorter than it used to be. Once a fix is available, motivated observers can often infer the nature of the issue without a lot of hassle.&lt;/p&gt;

&lt;p&gt;Given that reality, maintaining a four-week delay before wider disclosure no longer provides the same level of protection it once did.&lt;/p&gt;

&lt;h1 id=&quot;what-is-changing&quot;&gt;What Is Changing?&lt;/h1&gt;

&lt;p&gt;For future security fixes, the grace window will be shortened from 4 weeks to 2 weeks. This means adopters will have two weeks after a security fix is published before broader public disclosure and announcement. The project documentation has been updated to reflect the new two-week security grace window.&lt;/p&gt;

&lt;h1 id=&quot;what-is-not-changing&quot;&gt;What Is Not Changing?&lt;/h1&gt;

&lt;p&gt;This change does not affect security fixes that have already been published. Any security fix already operating under the previous four-week window will continue to follow that original timeline. The new two-week window applies only to future security fixes.&lt;/p&gt;

&lt;h1 id=&quot;expectations-for-adopters&quot;&gt;Expectations for Adopters&lt;/h1&gt;

&lt;p&gt;We recognize that this change means organizations will need to respond more quickly to security releases. However, this is also an intentional nudge toward more automated, repeatable, and reliable upgrade processes. Projects and organizations that still depend on manual upgrade and deployment steps should use this change as an opportunity to review their release workflows, dependency management practices, and deployment automation. Today, the ability to apply security updates quickly is no longer just operationally convenient. It is part of maintaining a responsible security posture.&lt;/p&gt;

&lt;p&gt;The goal is to strike a better balance between giving adopters time to upgrade and ensuring the wider community receives timely information about security issues. We appreciate the community’s continued attention to responsible disclosure, timely upgrades, and the ongoing security of the ecosystem.&lt;/p&gt;

&lt;p&gt;On behalf of the CAS Project,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/06/23/sec-grace-window/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/06/23/sec-grace-window/</guid>
      </item>
    
      <item>
        <title>CAS Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;, which describes a security vulnerability that affects how the CAS server manages state for authentication flows.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.3.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are (or your institution is) a member of the Apereo foundation with &lt;em&gt;an active support subscription&lt;/em&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;exposure&quot;&gt;Exposure&lt;/h1&gt;

&lt;p&gt;You are affected by this security vulnerability if your CAS deployment manages its state for authentication webflows using the client browser. This is the default setup and configuration for almost all deployments.&lt;/p&gt;

&lt;p&gt;A vulnerability in CAS client-side Spring Webflow state encryption caused &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AES-GCM&lt;/code&gt; to reuse a deterministic initialization vector with the same encryption key. This allowed unauthenticated attackers to collect chosen webflow state ciphertexts and recover portions of the encryption keystream. If an attacker obtained another user’s webflow execution token, the recovered keystream could be used to disclose corresponding portions of that user’s serialized webflow state. The issue primarily affects confidentiality of client-side webflow state; integrity remains protected when CAS webflow signing is enabled.&lt;/p&gt;

&lt;h1 id=&quot;timeline--credits&quot;&gt;Timeline &amp;amp; Credits&lt;/h1&gt;

&lt;p&gt;The issue was originally reported to the CAS project on June 16th, 2026 and fixed on June 17th, 2026. The reporter decided to remain anonymous. Thank you anyway!&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases were published on June 18th, 2026. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Drop-in Replacement?&lt;/strong&gt;&lt;br /&gt;
  For the most part, a drop-in replacement release (as is the case for almost all security patch releases) does not require you to change platform requirements, Java versions, application registration records, user interface, CAS configuration, logging semantics, etc. For most deployments, this should be closer to &lt;i&gt;“upgrade and verify”&lt;/i&gt; than &lt;i&gt;“cancel your weekend.”&lt;/i&gt;, unless explicitly (and uncommonly) noted otherwise.&lt;br /&gt;&lt;br /&gt;

  The only serious exception to this rule would be in scenarios where you have modified Java code and CAS server internal components and your changes directly overwrite upstream&apos;s fixes. While we do our best to ensure fixes are non-intrusive with a low footprint as much as possible, we cannot guarantee that your custom Java components that entirely overwrite and overlay on top of CAS remain fully functional or compatible with CAS APIs and implementations. The risk with owning code is that you own the code. Review and assess carefully.
&lt;/div&gt;

&lt;h2 id=&quot;versions&quot;&gt;Versions&lt;/h2&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Forward Ports&lt;/strong&gt;&lt;br /&gt;
  Any CAS version that is still in development and considered a work-in-progress automatically receives any and all fixes. All changes are expected to be carried forward and released in due time.
&lt;/div&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.7.3&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the appropriate release version noted above by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./gradlew[.bat] clean build&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;security-in-the-ai-era&quot;&gt;Security In The AI Era&lt;/h1&gt;

&lt;p&gt;We are beginning to see a clear trend in how security issues are researched and reported: AI is playing a much larger role in analyzing, documenting, explaining, and submitting potential vulnerability reports. This is not unique to CAS. It is happening across open source. The same productivity gains that AI gives developers and maintainers are also changing how code is reviewed, assessed, challenged, and patched. As &lt;a href=&quot;https://spring.io/blog/2026/06/01/spring_and_security_in_the_times_of_ai&quot;&gt;this article&lt;/a&gt; puts it:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;It’s one thing for a development team of 4-10 engineers to use generative AI to build new features faster. It’s a whole other situation when, for each engineer on the team, there are dozens in our community using generative AI to create issues, pull requests, and security reports.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI did not just learn to write code. It also learned to open security reports, explain them confidently, attach a proof of concept, and then politely ask why nobody has fixed it yet! This trend is likely to accelerate. With that in mind, we would like to highlight two practical points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Maintainer capacity is a real constraint.&lt;/strong&gt; Human resources and available maintainer time matter a great deal here. It is very likely that time-to-fix expectations will need to stretch, not just for CAS but for many open source projects. If the volume of security reports becomes difficult to manage, our response may be slower than usual. There are only a few of us, and many of you, them, and possibly a small army of extremely confident, polite autocomplete machines. Please set expectations accordingly, and &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;review the vulnerability response process&lt;/a&gt; to understand how reports are handled and what commitments, if any, can realistically be made.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automated verification and deployment are no longer optional luxuries.&lt;/strong&gt; It is becoming increasingly important for adopters of open source projects, especially CAS, to invest in tooling and processes that support automated release verification, automated integration testing, reliable CI/CD pipelines, and fast production deployment. If your current deployment process depends on manual steps, delayed approvals, synchronous coordination, or one heroic person remembering the exact production checklist from 2019, you may start to feel the pain. As security fixes and patches appear more frequently, teams with slow or manual deployment practices will have a harder time consuming updates quickly and safely.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/06/18/vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/06/18/vuln/</guid>
      </item>
    
      <item>
        <title>CAS Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;, which describes a &lt;em&gt;series&lt;/em&gt; of security vulnerabilities that affect different features and aspects of the CAS server. Additional details will be made public once the security grace window has passed.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.3.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are (or your institution is) a member of the Apereo foundation with &lt;em&gt;an active support subscription&lt;/em&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;exposure&quot;&gt;Exposure&lt;/h1&gt;

&lt;p&gt;You are affected by this security vulnerability &lt;strong&gt;IF ANY&lt;/strong&gt; of the following separate conditions apply to your CAS deployment:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Your CAS server is using Google Authenticator for multifactor authentication and storing user device records in Redis.&lt;/li&gt;
  &lt;li&gt;Your CAS server is using Redis to store tickets, complemented with a local cache.&lt;/li&gt;
  &lt;li&gt;Your CAS server is acting as an OpenID Connect identity provider.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These conditions are separate from one another and operate independently. Again, your CAS deployment is considered vulnerable &lt;strong&gt;IF ANY&lt;/strong&gt; of the above conditions are true for your CAS deployment.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;THIS IS SERIOUS!&lt;/strong&gt;&lt;br /&gt;
  Our initial analysis of issue #3, where CAS acts as an OpenID Connect identity provider in a vulnerable state, indicates that the impact may extend beyond OpenID Connect provider functionality. The issue may affect broader CAS server behavior and could potentially lead to remote code execution.&lt;br /&gt;&lt;br /&gt;

  Even if you do not believe you are affected by any of the above conditions, we &lt;strong&gt;VERY STRONGLY&lt;/strong&gt; recommend that you upgrade anyway.
&lt;/div&gt;

&lt;h1 id=&quot;timeline--credits&quot;&gt;Timeline &amp;amp; Credits&lt;/h1&gt;

&lt;h2 id=&quot;issue-google-authenticator-with-redis&quot;&gt;Issue: Google Authenticator with Redis&lt;/h2&gt;

&lt;p&gt;The issue was originally reported to the CAS project on May 28th, 2026 and fixed on June 1st, 2026. The reporter declined to be listed in this advisory. Thank you anyway!&lt;/p&gt;

&lt;h3 id=&quot;exposure-1&quot;&gt;Exposure&lt;/h3&gt;

&lt;p&gt;This issue affects deployments that use a dedicated Redis backend to manage Google Authenticator accounts and scratch codes. When using a scratch code to authenticate, instead of updating the original account and the owner of the scratch code, CAS would instead create a new record for the account with the updated list of scratch codes and thus leaving the original in place as an orphaned account. This meant that the scratch code assigned now to the orphaned account could be used indefinitely to authenticate.&lt;/p&gt;

&lt;h2 id=&quot;issue-redis-ticket-registry&quot;&gt;Issue: Redis Ticket Registry&lt;/h2&gt;

&lt;p&gt;This issue was originally reported to the CAS project on May 30th, 2026 by &lt;strong&gt;&lt;a href=&quot;https://www.gatech.edu/&quot;&gt;Georgia Tech&lt;/a&gt;&lt;/strong&gt;’s Enterprise Application and Identity teams and a candidate fix was offered on June 1st, 2026. While final reporter confirmation is still pending, our analysis gives us reasonable confidence that the issue has been addressed. We may iterate further if additional testing identifies gaps. As ever, we appreciate Georgia Tech’s cooperation and willingness to report and verify the fixes.&lt;/p&gt;

&lt;h3 id=&quot;exposure-2&quot;&gt;Exposure&lt;/h3&gt;

&lt;p&gt;With crypto operations enabled for the Redis ticket registry coupled with a local cache that is backed by Redis messaging, the publisher CAS node would capture the ticket in its local cache using a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SHA-512&lt;/code&gt; of the ticket id to publish a message using Redis messaging to other CAS nodes. The receiver nodes would then receive a signal that is composed of the op type (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ADD&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELETE&lt;/code&gt;, etc) as well as the ticket object itself, when available/relevant. The bug here was that the receiver node attempted to remove the ticket from its own local cache using the plain ticket id as the key; not its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SHA-512&lt;/code&gt; equivalent. This of course meant that receiver nodes will end up carrying a cached ticket that is effectively removed from Redis itself, which would then pose a problem for logout operations, specially those that are admin-forced for disabled or compromised accounts.&lt;/p&gt;

&lt;h2 id=&quot;issue-openid-connect&quot;&gt;Issue: OpenID Connect&lt;/h2&gt;

&lt;p&gt;This issue was originally reported to the CAS project on June 2nd, 2026 by &lt;strong&gt;Richard Gašparík&lt;/strong&gt;, an ethical hacker at &lt;a href=&quot;https://citadelo.com&quot;&gt;Citadelo&lt;/a&gt; and was fixed on June 3rd, 2026. Citadelo is &lt;em&gt;a European cybersecurity company that focuses primarily on penetration testing and offensive security, helping organizations across Europe find and fix vulnerabilities before attackers do&lt;/em&gt;. We also wish to credit Richard’s colleague, &lt;strong&gt;Josef Korbel&lt;/strong&gt;, who worked on the penetration test with Richard and helped to find the vulnerabilities.&lt;/p&gt;

&lt;p&gt;We appreciate Richard’s and Josef’s time and effort who shared complete and thorough instructions on how this vulnerability can be observed and exercised and were able to ultimately verify the fix. Thank you both very much!&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;CVEs&lt;/strong&gt;&lt;br /&gt;
  The Citadelo team has reserved CVEs for this issue. We&apos;ll notify them to publish the records and make CVEs public, once the security grace period has passed.
&lt;/div&gt;

&lt;h3 id=&quot;exposure-3&quot;&gt;Exposure&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Authentication bypass of OIDC dynamic client registration. The authentication interceptor is registered for the OIDC base endpoint plus a single path segment while the registration endpoint also maps a multi-segment wildcard. A request with one extra path segment reaches the registration handler without the required initial access token.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Expression-language injection in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks_uri&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks&lt;/code&gt; leading to RCE in OIDC dynamic client registration requests. The client-supplied &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks_uri&lt;/code&gt; can be passed as a Spring expression which evaluates using a standard non-sandboxed evaluation context. A registered &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jwks_uri&lt;/code&gt; such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;${T(java.lang.Runtime)...}&lt;/code&gt; can execute arbitrary code.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases were published on June 5th, 2026. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Drop-in Replacement?&lt;/strong&gt;&lt;br /&gt;
  For the most part, a drop-in replacement release (as is the case for almost all security patch releases) does not require you to change platform requirements, Java versions, application registration records, user interface, CAS configuration, logging semantics, etc. For most deployments, this should be closer to &lt;i&gt;“upgrade and verify”&lt;/i&gt; than &lt;i&gt;“cancel your weekend.”&lt;/i&gt;, unless explicitly (and uncommonly) noted otherwise.&lt;br /&gt;&lt;br /&gt;

  The only serious exception to this rule would be in scenarios where you have modified Java code and CAS server internal components and your changes directly overwrite upstream&apos;s fixes. While we do our best to ensure fixes are non-intrusive with a low footprint as much as possible, we cannot guarantee that your custom Java components that entirely overwrite and overlay on top of CAS remain fully functional or compatible with CAS APIs and implementations. The risk with owning code is that you own the code. Review and assess carefully.
&lt;/div&gt;

&lt;h2 id=&quot;versions&quot;&gt;Versions&lt;/h2&gt;

&lt;p&gt;Given the timeline and severity of the reported issues, we decided to publish one security patch release for affected versions &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, rather than individual releases for every fix and issue. This was a rather unusual event where we received multiple security reports all around the same timeframe and &lt;em&gt;one release to rule them all&lt;/em&gt; helps us reduce maintenance burden and release churn, as the fixes are quite targeted and surgical.&lt;/p&gt;

&lt;div class=&quot;alert alert-info&quot;&gt;
  &lt;strong&gt;Forward Ports&lt;/strong&gt;&lt;br /&gt;
  Any CAS version that is still in development and considered a work-in-progress automatically receives any and all fixes. All changes are expected to be carried forward and released in due time.
&lt;/div&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.7.2&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the appropriate release version noted above by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./gradlew[.bat] clean build&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;security-in-the-ai-era&quot;&gt;Security In The AI Era&lt;/h1&gt;

&lt;p&gt;We are beginning to see a clear trend in how security issues are researched and reported: AI is playing a much larger role in analyzing, documenting, explaining, and submitting potential vulnerability reports. This is not unique to CAS. It is happening across open source. The same productivity gains that AI gives developers and maintainers are also changing how code is reviewed, assessed, challenged, and patched. As &lt;a href=&quot;https://spring.io/blog/2026/06/01/spring_and_security_in_the_times_of_ai&quot;&gt;this article&lt;/a&gt; puts it:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;It’s one thing for a development team of 4-10 engineers to use generative AI to build new features faster. It’s a whole other situation when, for each engineer on the team, there are dozens in our community using generative AI to create issues, pull requests, and security reports.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI did not just learn to write code. It also learned to open security reports, explain them confidently, attach a proof of concept, and then politely ask why nobody has fixed it yet! This trend is likely to accelerate. With that in mind, we would like to highlight two practical points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Maintainer capacity is a real constraint.&lt;/strong&gt; Human resources and available maintainer time matter a great deal here. It is very likely that time-to-fix expectations will need to stretch, not just for CAS but for many open source projects. If the volume of security reports becomes difficult to manage, our response may be slower than usual. There are only a few of us, and many of you, them, and possibly a small army of extremely confident, polite autocomplete machines. Please set expectations accordingly, and &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;review the vulnerability response process&lt;/a&gt; to understand how reports are handled and what commitments, if any, can realistically be made.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automated verification and deployment are no longer optional luxuries.&lt;/strong&gt; It is becoming increasingly important for adopters of open source projects, especially CAS, to invest in tooling and processes that support automated release verification, automated integration testing, reliable CI/CD pipelines, and fast production deployment. If your current deployment process depends on manual steps, delayed approvals, synchronous coordination, or one heroic person remembering the exact production checklist from 2019, you may start to feel the pain. As security fixes and patches appear more frequently, teams with slow or manual deployment practices will have a harder time consuming updates quickly and safely.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/06/06/vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/06/06/vuln/</guid>
      </item>
    
      <item>
        <title>CAS OpenID Connect Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;,
describing an issue in CAS acting and running as an OpenID Connect provider.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;credits&quot;&gt;Credits&lt;/h1&gt;

&lt;p&gt;This issue was originally reported to the team at &lt;a href=&quot;https://www.coop.ch/&quot;&gt;Coop (Switzerland)&lt;/a&gt;, namely Artur Stoecklin and David Roth, via the &lt;em&gt;YesWeHack&lt;/em&gt; platform, which is a &lt;em&gt;“global crowdsourced security and bug bounty platform that connects organizations with a vetted community of tens of thousands of ethical (white-hat) hackers to identify and report vulnerabilities in websites, mobile apps, and infrastructure”&lt;/em&gt;. Both the original reporter as well as the team at YesWeHack shared complete and thorough instructions on how this vulnerability can be observed and exercised. The team at &lt;a href=&quot;https://www.coop.ch/&quot;&gt;Coop (Switzerland)&lt;/a&gt; further validated and tested the fix.&lt;/p&gt;

&lt;p&gt;Thank you everyone!&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.3.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are (or your institution is) a member of the Apereo foundation with &lt;em&gt;an active support subscription&lt;/em&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;severity&quot;&gt;Severity&lt;/h1&gt;

&lt;p&gt;You are affected by this security vulnerability &lt;strong&gt;IF AND ONLY IF&lt;/strong&gt; your CAS deployment is acting and running as &lt;em&gt;an OpenID Connect identity provider&lt;/em&gt;. If your deployment does not pass the noted condition(s) above, there is nothing for you to do here. Keep calm and carry on.&lt;/p&gt;

&lt;h2 id=&quot;exposure&quot;&gt;Exposure&lt;/h2&gt;

&lt;p&gt;A security vulnerability was identified in Apereo CAS when operating as an OpenID Connect Provider with support for Pushed Authorization Requests, which is on and available by default. In the affected behavior, CAS accepted a PAR request without properly validating the supplied &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redirect_uri&lt;/code&gt; against the relying party’s registered redirect URI configuration. Because PAR requests move authorization parameters into a back-channel request and later reference them by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request_uri&lt;/code&gt;, validation must occur when the request is pushed, not deferred or assumed safe simply because the request was stored by the server.&lt;/p&gt;

&lt;p&gt;The impact is that a malicious or misconfigured client could submit an authorization request containing an unauthorized &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;redirect_uri&lt;/code&gt;, potentially causing the resulting authorization response, including an authorization code or related OIDC response parameters, to be delivered to a location not approved for that client.&lt;/p&gt;

&lt;h1 id=&quot;timeline&quot;&gt;Timeline&lt;/h1&gt;

&lt;p&gt;The issue was originally reported to the team at &lt;a href=&quot;https://www.coop.ch/&quot;&gt;Coop (Switzerland)&lt;/a&gt; on May 5th, 2026 and was shared with the CAS project on May 22nd, 2026. Upon confirmation, CAS releases were patched and eventually published on May 27th, 2026.&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases are available to address CAS deployments. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;h2 id=&quot;affected-versions&quot;&gt;Affected Versions&lt;/h2&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.7.1&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the approriate release version noted above by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./gradlew[.bat] clean build&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/05/27/oidc-vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/05/27/oidc-vuln/</guid>
      </item>
    
      <item>
        <title>Java CAS Client JWT Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;,
describing an issue in the Java CAS Client while validating tickets issued as JWT.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;credits&quot;&gt;Credits&lt;/h1&gt;

&lt;p&gt;This issue was reported to the project by a third-party researcher and was then further validated and tested by Mr. Jérôme Leleu, who is a project member and an active committer.&lt;/p&gt;

&lt;p&gt;Thank you everyone!&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;If you have an application that uses the Java CAS client to intergrate with a CAS server and is configured to accept and validate JWTs from that server, you are affected and do need to upgrade. If this condition does not pass for your application deployments, there is nothing for you to do here. Keep calm and carry on.&lt;/p&gt;

&lt;p&gt;If you or your institution is a member of the Apereo foundation with an active support subscription supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;timeline&quot;&gt;Timeline&lt;/h1&gt;

&lt;p&gt;The issue was originally reported on May 2nd 2026, and upon confirmation, Java CAS client releases were patched and eventually published on May 20th, 2026.&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Upgrade your applications to use Java CAS client’s version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.1.1&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/05/20/casc-jwt-vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/05/20/casc-jwt-vuln/</guid>
      </item>
    
      <item>
        <title>Apereo CAS - External Identity Providers</title>
        <description>&lt;p&gt;External identity providers registered with CAS, such as those that speak the OpenID Connect or SAML2 protocol largely remain static throughout the server lifecycle. Once built and available, their configuration remains in read-only mode and can only be modified with direct access to CAS configuration, server rebuilds and restarts.&lt;/p&gt;

&lt;p&gt;Building on top of &lt;a href=&quot;https://apereo.github.io/2026/02/07/cas-dynamic-configuration-management/&quot;&gt;Dynamic Configuration Management&lt;/a&gt; features, newer CAS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.x&lt;/code&gt; releases now allow one to register and modify external identity providers that can be used for delegated authentication attempts. The registration of external identity providers is now handled and supported by the Palantir admin dashbord.&lt;/p&gt;

&lt;p&gt;This post provides an overview of external identity providers can be registered with the CAS server dynamically, without having to restart the server. Please note that this work is supported by and executed as part of the CAS proposal to &lt;a href=&quot;https://apereo.github.io/2026/02/01/cas-nlnet/&quot;&gt;NLnet&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;As discussed, the main objective here is to allow the Palantir admin dashbord to support registering external identity providers. Doing so requires one to use &lt;a href=&quot;https://apereo.github.io/2026/02/07/cas-dynamic-configuration-management/&quot;&gt;Dynamic Configuration Management&lt;/a&gt; features of CAS to allow on-the-fly registration of external providers and gain the ability to edit their configuration without having to rebuild or restart.&lt;/p&gt;

&lt;p&gt;Starting with most recent releases of CAS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8.x&lt;/code&gt;, Palantir admin dashbord now provides a humble view of all available external identity providers, regardless of their method of registration and configuration:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-6.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The most notable change here is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEW&lt;/code&gt; button which allows one to register an identity provider. Available identity provider types are for now limited to the following set:&lt;/p&gt;

&lt;h2 id=&quot;cas&quot;&gt;CAS&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-7.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;openid-connect&quot;&gt;OpenID Connect&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-8.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;oauth&quot;&gt;OAUTH&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-9.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;keycloak&quot;&gt;Keycloak&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-10.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;saml2&quot;&gt;SAML2&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://apereo.github.io/images/image-11.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;modifications&quot;&gt;Modifications&lt;/h2&gt;

&lt;p&gt;The registration process requires &lt;a href=&quot;https://apereo.github.io/2026/02/07/cas-dynamic-configuration-management/&quot;&gt;Dynamic Configuration Management&lt;/a&gt; features of CAS. Once an identity provider is registered, its configuration can be modified and edited exactly as any other CAS setting, since all configuration constructs are eventually translated to CAS properties and ultimately become available to the CAS application context.&lt;/p&gt;

&lt;h2 id=&quot;roadmap&quot;&gt;Roadmap&lt;/h2&gt;

&lt;p&gt;The admin dashboard today supports a limited set of external identity provider types and a narrowed populist view of what can be configured for each provider. Going forward, the intention is to customize and enhance the registration process to add more identity provider types and support additional settings as necessary.&lt;/p&gt;

&lt;p&gt;On behalf of the CAS project,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com/misagh&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/04/25/cas-external-identity-providers/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/04/25/cas-external-identity-providers/</guid>
      </item>
    
      <item>
        <title>CAS JWT Authentication Vulnerability Disclosure</title>
        <description>&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;This is an &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt;,
describing an issue in CAS while using a token-based &lt;em&gt;JWT Authentication&lt;/em&gt; feature.&lt;/p&gt;

&lt;p&gt;For additional details on how security issues, patches and announcements are handled, please read the &lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;Apereo CAS project vulnerability disclosure&lt;/a&gt; process.&lt;/p&gt;

&lt;h1 id=&quot;credits&quot;&gt;Credits&lt;/h1&gt;

&lt;p&gt;This issue was originally reported, researched and tested by Mr. Jérôme Leleu, who is a project member and an active committer. Jérôme was kind enough to thoroughly investigate the issue, discuss the problem in detail, provide steps to reproduce the problem and offer insight to diagnose the root cause.&lt;/p&gt;

&lt;p&gt;Thank you Jérôme!&lt;/p&gt;

&lt;h1 id=&quot;affected-deployments&quot;&gt;Affected Deployments&lt;/h1&gt;

&lt;p&gt;The problem addressed here, &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, affects the Apereo CAS server for the following versions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- 7.2.x
- 7.3.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your CAS version is not listed above &lt;strong&gt;AND&lt;/strong&gt; is still part of an active maintenance cycle &lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;per the CAS maintenance policy&lt;/a&gt;, then best effort (analysis or confirmation from reporters/testers) indicates that the version is not affected by this issue. That said, please note that per the project’s Apache2 license, &lt;em&gt;software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied&lt;/em&gt;. For additional information, please &lt;a href=&quot;https://github.com/apereo/cas/blob/master/LICENSE&quot;&gt;see the project license&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a member of the Apereo foundation with an active support subscription supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability report.&lt;/p&gt;

&lt;h1 id=&quot;severity&quot;&gt;Severity&lt;/h1&gt;

&lt;p&gt;You are effected by this security vulnerability if your CAS deployment has specifically enabled a feature called &lt;em&gt;JWT Authentication&lt;/em&gt;, sometimes also referred to as &lt;em&gt;token-based non-interactive authN&lt;/em&gt; and accepts credentials as JWTs for non-interactive authentication attempts. Note that this has nothing to do with any other CAS functionality that deals with JWTs.&lt;/p&gt;

&lt;p&gt;For better details, see:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.pac4j.org/blog/security-advisory-pac4j-jwt-jwtauthenticator.html&quot;&gt;Pac4j advisory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-29000&quot;&gt;CVE-2026-29000&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JwtAuthenticator&lt;/code&gt; decrypts a JWE, it attempts to parse the inner token as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedJWT&lt;/code&gt;. If the inner token is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PlainJWT&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alg=none&lt;/code&gt;), the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedJWT&lt;/code&gt; object is null and the signature verification path is skipped due to a logic error. The code then builds a user profile from unverified claims, enabling full impersonation. Impacted deployments are those using RSA-based JWE together with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JwtAuthenticator&lt;/code&gt; configured with both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EncryptionConfiguration&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignatureConfiguration&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your deployment does not pass the noted condition(s) above, there is nothing for you to do here. Keep calm and carry on.&lt;/p&gt;

&lt;h1 id=&quot;timeline&quot;&gt;Timeline&lt;/h1&gt;

&lt;p&gt;The issue was originally reported on March 2nd 2026, and upon confirmation, CAS releases were patched and eventually published on March 6th, 2026.&lt;/p&gt;

&lt;h1 id=&quot;patching&quot;&gt;Patching&lt;/h1&gt;

&lt;p&gt;Patch releases are available to address CAS deployments. Upgrades to the next patch version for each release should be a drop-in replacement.&lt;/p&gt;

&lt;h2 id=&quot;affected-versions&quot;&gt;Affected Versions&lt;/h2&gt;

&lt;h3 id=&quot;72x&quot;&gt;7.2.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.2.7.1&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;73x&quot;&gt;7.3.x&lt;/h3&gt;

&lt;p&gt;Modify your CAS overlay to point to the version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7.3.5&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-upgrade&quot;&gt;How to upgrade&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Locate your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gradle.properties&lt;/code&gt; file in your CAS overlay, found at the root of the project.&lt;/li&gt;
  &lt;li&gt;Modify your CAS version to point to the approriate release by updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cas.version&lt;/code&gt; property.&lt;/li&gt;
  &lt;li&gt;Follow the instructions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file to build the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;p&gt;Apereo CAS is Apache v2 open source software under the sponsorship of the Apereo Foundation. Support options may be &lt;a href=&quot;https://apereo.github.io/cas/Support.html&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you or your institution is a &lt;strong&gt;member&lt;/strong&gt; of the Apereo foundation with an &lt;strong&gt;active CAS subscription&lt;/strong&gt; supporting the CAS project, please &lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;contact the CAS subs working group&lt;/a&gt; to learn more about this security vulnerability.&lt;/p&gt;

&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Sec-Vuln-Response.html&quot;&gt;CAS Security Vulnerability Response Model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/developer/Maintenance-Policy.html&quot;&gt;CAS Maintenance Policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apereo.github.io/cas/Mailing-Lists.html&quot;&gt;CAS Mailing Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On behalf of the CAS Application Security working group,&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fawnoos.com&quot;&gt;Misagh Moayyed&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://apereo.github.io/2026/03/06/jwt-vuln/</link>
        <guid isPermaLink="true">https://apereo.github.io/2026/03/06/jwt-vuln/</guid>
      </item>
    
  </channel>
</rss>
