Files
Flash5/javadoc/2.0.0/dev/relism/flash/ext/oidc/OidcMiddleware.html
T

250 lines
19 KiB
HTML

<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (21) on Tue May 12 14:36:52 UTC 2026 -->
<title>OidcMiddleware (flash-parent 2.1.0-SNAPSHOT API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2026-05-12">
<meta name="description" content="declaration: package: dev.relism.flash.ext.oidc, class: OidcMiddleware">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../script-dir/jquery-ui.min.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation links"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="class-use/OidcMiddleware.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html#class">Help</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>Summary:</p>
<ul>
<li>Nested</li>
<li>Field</li>
<li>Constr</li>
<li><a href="#method-summary">Method</a></li>
</ul>
</li>
<li>
<p>Detail:</p>
<ul>
<li>Field</li>
<li>Constr</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-summary">Method</a></li>
</ul>
<ul class="sub-nav-list">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../../../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="Search">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">dev.relism.flash.ext.oidc</a></div>
<h1 title="Class OidcMiddleware" class="title">Class OidcMiddleware</h1>
</div>
<div class="inheritance" title="Inheritance Tree"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">java.lang.Object</a>
<div class="inheritance">dev.relism.flash.ext.oidc.OidcMiddleware</div>
</div>
<section class="class-description" id="class-description">
<hr>
<div class="type-signature"><span class="modifiers">public class </span><span class="element-name type-name-label">OidcMiddleware</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
<div class="block">Request-level OIDC middleware. Exposed in the <a href="../../extension/FlashContext.html" title="class in dev.relism.flash.extension"><code>FlashContext</code></a>
for manual use on lambda routes; injected automatically for handlers annotated with
<a href="Authenticated.html" title="annotation interface in dev.relism.flash.ext.oidc"><code>Authenticated</code></a>, <a href="RolesAllowed.html" title="annotation interface in dev.relism.flash.ext.oidc"><code>RolesAllowed</code></a> or <a href="ScopesAllowed.html" title="annotation interface in dev.relism.flash.ext.oidc"><code>ScopesAllowed</code></a>.
<p>Resolution order on each request:
<ol>
<li><code>Authorization: Bearer ...</code> header — validated via JWKS (<a href="JwtValidator.html" title="class in dev.relism.flash.ext.oidc"><code>JwtValidator</code></a>).</li>
<li><code>oidc_session</code> cookie — looked up in <a href="OidcSessionStore.html" title="interface in dev.relism.flash.ext.oidc"><code>OidcSessionStore</code></a>; transparently
refreshed if the access token is expired.</li>
<li>Browser clients (no <code>Accept: application/json</code>) → redirect to
<code>{routePrefix}/login?redirect={path}</code>.</li>
<li>API clients → 401.</li>
</ol>
<pre><code>
// Manual use on a lambda route:
OidcMiddleware oidc = app.ctx().require(OidcMiddleware.class);
app.get("/api/me", (req, res) -&gt; ClaimsHolder.claim("sub"), oidc.protect());
app.delete("/admin/users/{id}", handler, oidc.requireRole("admin"));
</code></pre></div>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">Concrete Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel" aria-labelledby="method-summary-table-tab0">
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#authorize(dev.relism.flash.ext.oidc.OidcAuthPolicy)" class="member-name-link">authorize</a><wbr>(dev.relism.flash.ext.oidc.OidcAuthPolicy&nbsp;policy)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Compiled authorization policy path used by annotation-driven mounting.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#optional()" class="member-name-link">optional</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Silently populates <a href="ClaimsHolder.html" title="class in dev.relism.flash.ext.oidc"><code>ClaimsHolder</code></a> if a valid bearer token or session cookie
is present, but never rejects or redirects unauthenticated requests.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#protect()" class="member-name-link">protect</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Validates the bearer token or session cookie.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#requireAnyScope(java.lang.String...)" class="member-name-link">requireAnyScope</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;scopes)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Requires at least one of the listed scopes to be present in the token.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#requireRole(java.lang.String...)" class="member-name-link">requireRole</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;roles)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Like <a href="#protect()"><code>protect()</code></a> but also enforces that the caller holds at least one
of the given roles (OR semantics).</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#requireScopes(java.lang.String...)" class="member-name-link">requireScopes</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;scopes)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Requires all listed scopes to be present in the token.</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Object">Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#clone()" title="class or interface in java.lang" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#finalize()" title="class or interface in java.lang" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#getClass()" title="class or interface in java.lang" class="external-link">getClass</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notify()" title="class or interface in java.lang" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notifyAll()" title="class or interface in java.lang" class="external-link">notifyAll</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#toString()" title="class or interface in java.lang" class="external-link">toString</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait()" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long)" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="class or interface in java.lang" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="protect()">
<h3>protect</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">protect</span>()</div>
<div class="block">Validates the bearer token or session cookie. Browser clients are redirected
to the login page on failure; API clients receive 401.</div>
</section>
</li>
<li>
<section class="detail" id="optional()">
<h3>optional</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">optional</span>()</div>
<div class="block">Silently populates <a href="ClaimsHolder.html" title="class in dev.relism.flash.ext.oidc"><code>ClaimsHolder</code></a> if a valid bearer token or session cookie
is present, but never rejects or redirects unauthenticated requests. Use this on
public routes that want to personalise the response when the user happens to be
logged in (e.g. showing a username on a landing page).
<pre><code>
app.get("/", handler, oidc.optional());
// Inside handler: ClaimsHolder.user() is non-null iff the user is logged in.
</code></pre></div>
</section>
</li>
<li>
<section class="detail" id="authorize(dev.relism.flash.ext.oidc.OidcAuthPolicy)">
<h3>authorize</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">authorize</span><wbr><span class="parameters">(dev.relism.flash.ext.oidc.OidcAuthPolicy&nbsp;policy)</span></div>
<div class="block">Compiled authorization policy path used by annotation-driven mounting.
The policy is immutable and built once at boot.</div>
</section>
</li>
<li>
<section class="detail" id="requireRole(java.lang.String...)">
<h3>requireRole</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">requireRole</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;roles)</span></div>
<div class="block">Like <a href="#protect()"><code>protect()</code></a> but also enforces that the caller holds at least one
of the given roles (OR semantics). Roles are extracted via
<a href="OidcConfig.html#rolesClaimPath()"><code>OidcConfig.rolesClaimPath()</code></a>.</div>
</section>
</li>
<li>
<section class="detail" id="requireScopes(java.lang.String...)">
<h3>requireScopes</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">requireScopes</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;scopes)</span></div>
<div class="block">Requires all listed scopes to be present in the token.
Scopes are resolved from configured claim paths (default: <code>scope,scp</code>).</div>
</section>
</li>
<li>
<section class="detail" id="requireAnyScope(java.lang.String...)">
<h3>requireAnyScope</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../../routing/Middleware.html" title="interface in dev.relism.flash.routing">Middleware</a></span>&nbsp;<span class="element-name">requireAnyScope</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>...&nbsp;scopes)</span></div>
<div class="block">Requires at least one of the listed scopes to be present in the token.
Scopes are resolved from configured claim paths (default: <code>scope,scp</code>).</div>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
<footer role="contentinfo">
<hr>
<p class="legal-copy"><small>Copyright &#169; 2026. All rights reserved.</small></p>
</footer>
</div>
</div>
</body>
</html>