Build: 0.1.8
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-03-08 01:01:39 +05:30
parent 8701bf92ac
commit 9191de9dff
200 changed files with 130793 additions and 18277 deletions

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="jwtlib" class="md-header__button md-logo" aria-label="jwtlib" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,116 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../app/" class="md-tabs__link">
Authentication Logic
</a>
</li>
<li class="md-tabs__item">
<a href="../models/" class="md-tabs__link">
Data & Models
</a>
</li>
<li class="md-tabs__item">
<a href="../repository/" class="md-tabs__link">
Persistence & Security
</a>
</li>
<li class="md-tabs__item">
<a href="../utils/" class="md-tabs__link">
Support & Utilities
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -305,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="jwtlib" class="md-nav__button md-logo" aria-label="jwtlib" data-md-component="logo">
@@ -353,13 +250,18 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -479,6 +381,34 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#jwtlib.introspection--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#jwtlib.introspection-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#jwtlib.introspection-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#jwtlib.introspection.authenticate_request" class="md-nav__link">
<span class="md-ellipsis">
authenticate_request
@@ -499,6 +429,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -525,13 +460,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -540,8 +489,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -550,8 +500,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -561,27 +517,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -667,13 +602,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -682,7 +627,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
@@ -786,13 +731,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -801,7 +754,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
@@ -911,6 +864,34 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#jwtlib.introspection--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#jwtlib.introspection-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#jwtlib.introspection-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#jwtlib.introspection.authenticate_request" class="md-nav__link">
<span class="md-ellipsis">
authenticate_request
@@ -931,6 +912,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -957,7 +943,7 @@
<h2 id="jwtlib.introspection" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">jwtlib.introspection</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">jwtlib.introspection</span>
</h2>
@@ -965,24 +951,27 @@
<div class="doc doc-contents first">
<p>Auth client and access-control utilities.</p>
<hr />
<h4 id="jwtlib.introspection--summary">Summary</h4>
<p>This module provides <strong>pure authentication and authorization logic</strong>
for validating JWTs via service-to-service introspection and resolving
authenticated users.</p>
<p>Key characteristics:
- No framework or HTTP routing dependencies
- Async-first and fully typed
- Designed for use by adapters (HTTP, CLI, background workers)
- Delegates token validity decisions to an external auth service</p>
<p>Responsibilities:
- Calling the auth service introspection endpoint
- Translating introspection responses into typed user models
- Enforcing access control decisions at the logic layer</p>
<p>This module does NOT:
- Parse HTTP requests or headers
- Implement authentication policies
- Perform JWT signature verification locally</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>- Calling the auth service introspection endpoint
- Translating introspection responses into typed user models
- Enforcing access control decisions at the logic layer
</code></pre></div></td></tr></table></div>
<p><strong>Constraints:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This module intentionally does NOT: Parse HTTP requests or headers, implement authentication policies, or perform JWT signature verification locally.
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
@@ -991,30 +980,27 @@ authenticated users.</p>
<h3 id="jwtlib.introspection-classes">Classes</h3>
<h3 id="jwtlib.introspection-functions">Functions</h3>
<div class="doc doc-object doc-function">
<h3 id="jwtlib.introspection.authenticate_request" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">authenticate_request</span>
<h4 id="jwtlib.introspection.authenticate_request" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">authenticate_request</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">authenticate_request</span><span class="p">(</span><span class="n">should_skip_authentication</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">],</span> <span class="nb">bool</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">authorization_token</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">PublicUser</span><span class="p">]</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">authenticate_request</span><span class="p">(</span><span class="n">should_skip_authentication</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">],</span> <span class="nb">bool</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">method</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">authorization_token</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">PublicUser</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Authenticate an incoming request using token introspection.</p>
<p>Determines whether authentication should be skipped for the given
request context and, if not, resolves the authenticated user via
token introspection.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1035,8 +1021,7 @@ token introspection.</p>
</td>
<td>
<div class="doc-md-description">
<p>Callable that decides whether
authentication is required for a given HTTP method and path.</p>
<p>Callable that decides whether authentication is required for a given HTTP method and path.</p>
</div>
</td>
<td>
@@ -1074,7 +1059,7 @@ authentication is required for a given HTTP method and path.</p>
<tr class="doc-section-item">
<td><code>authorization_token</code></td>
<td>
<code><span title="typing.Optional">Optional</span>[str]</code>
<code>str | None</code>
</td>
<td>
<div class="doc-md-description">
@@ -1104,17 +1089,8 @@ authentication is required for a given HTTP method and path.</p>
</td>
<td>
<div class="doc-md-description">
<p>PublicUser if authentication succeeds.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Optional">Optional</span>[<a class="autorefs autorefs-internal" title="jwtlib.models.PublicUser" href="../models/#jwtlib.models.PublicUser">PublicUser</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>None if authentication is skipped.</p>
<p>PublicUser | None:
PublicUser if authentication succeeds; None if authentication is skipped.</p>
</div>
</td>
</tr>
@@ -1133,18 +1109,17 @@ authentication is required for a given HTTP method and path.</p>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.InvalidToken" href="../exceptions/#jwtlib.exceptions.InvalidToken">InvalidToken</a></code>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.InvalidToken" href="../jwtlib/exceptions/#jwtlib.exceptions.InvalidToken">InvalidToken</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If authentication is required but the token is
missing, invalid, or revoked.</p>
<p>If authentication is required but the token is missing, invalid, or revoked.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.AuthServiceUnavailable" href="../exceptions/#jwtlib.exceptions.AuthServiceUnavailable">AuthServiceUnavailable</a></code>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.AuthServiceUnavailable" href="../jwtlib/exceptions/#jwtlib.exceptions.AuthServiceUnavailable">AuthServiceUnavailable</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1158,12 +1133,12 @@ missing, invalid, or revoked.</p>
<details class="notes" open>
<summary>Notes</summary>
<ul>
<li>This function does not parse Authorization headers; callers must
supply the raw token.</li>
<li>Access-control policy is externalized via <code>should_skip_authentication</code>.</li>
<li>The returned PublicUser contains no sensitive information.</li>
</ul>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Determines whether authentication should be skipped for the given request context and, if not, resolves the authenticated user via token introspection
</code></pre></div></td></tr></table></div>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This function does not parse Authorization headers; callers must supply the raw token. Access-control policy is externalized via `should_skip_authentication`.
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1172,23 +1147,21 @@ missing, invalid, or revoked.</p>
<div class="doc doc-object doc-function">
<h3 id="jwtlib.introspection.introspect_token" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">introspect_token</span>
<h4 id="jwtlib.introspection.introspect_token" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">introspect_token</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">introspect_token</span><span class="p">(</span><span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">introspect_token</span><span class="p">(</span><span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Introspect a JWT using the external authentication service.</p>
<p>Sends the provided JWT to the configured auth service introspection
endpoint and validates the response.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1235,7 +1208,8 @@ endpoint and validates the response.</p>
</td>
<td>
<div class="doc-md-description">
<p>A dictionary containing the authenticated user's public payload.</p>
<p>dict[str, Any]:
A dictionary containing the authenticated user's public payload.</p>
</div>
</td>
</tr>
@@ -1254,7 +1228,7 @@ endpoint and validates the response.</p>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.InvalidToken" href="../exceptions/#jwtlib.exceptions.InvalidToken">InvalidToken</a></code>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.InvalidToken" href="../jwtlib/exceptions/#jwtlib.exceptions.InvalidToken">InvalidToken</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1264,12 +1238,11 @@ endpoint and validates the response.</p>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.AuthServiceUnavailable" href="../exceptions/#jwtlib.exceptions.AuthServiceUnavailable">AuthServiceUnavailable</a></code>
<code><a class="autorefs autorefs-internal" title="jwtlib.exceptions.AuthServiceUnavailable" href="../jwtlib/exceptions/#jwtlib.exceptions.AuthServiceUnavailable">AuthServiceUnavailable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If the auth service cannot be reached or
fails unexpectedly.</p>
<p>If the auth service cannot be reached or fails unexpectedly.</p>
</div>
</td>
</tr>
@@ -1279,11 +1252,9 @@ fails unexpectedly.</p>
<details class="notes" open>
<summary>Notes</summary>
<ul>
<li>This function treats the auth service as the source of truth.</li>
<li>No local JWT validation or signature checking is performed here.</li>
<li>The returned payload is expected to be safe for public exposure.</li>
</ul>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This function treats the auth service as the source of truth. No local JWT validation or signature checking is performed here. The returned payload is expected to be safe for public exposure.
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1313,6 +1284,8 @@ fails unexpectedly.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1350,7 +1323,7 @@ fails unexpectedly.</p>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>