Skip to content

Commit c1c9fda

Browse files
Deploy documentation on 2025-05-11 17:57:57 UTC
1 parent 016acd1 commit c1c9fda

14 files changed

Lines changed: 687 additions & 153 deletions

File tree

blacksheep/authentication/index.html

Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,15 @@
778778
</span>
779779
</a>
780780

781+
</li>
782+
783+
<li class="md-nav__item">
784+
<a href="#dependency-injection-in-authentication-handlers" class="md-nav__link">
785+
<span class="md-ellipsis">
786+
Dependency Injection in authentication handlers
787+
</span>
788+
</a>
789+
781790
</li>
782791

783792
<li class="md-nav__item">
@@ -1596,6 +1605,15 @@
15961605
</span>
15971606
</a>
15981607

1608+
</li>
1609+
1610+
<li class="md-nav__item">
1611+
<a href="#dependency-injection-in-authentication-handlers" class="md-nav__link">
1612+
<span class="md-ellipsis">
1613+
Dependency Injection in authentication handlers
1614+
</span>
1615+
</a>
1616+
15991617
</li>
16001618

16011619
<li class="md-nav__item">
@@ -1788,7 +1806,7 @@ <h2 id="jwt-bearer">JWT Bearer<a class="headerlink" href="#jwt-bearer" title="Pe
17881806
the future.</p>
17891807
<div class="admonition">
17901808
<p class="admonition-title">💡</p>
1791-
<p>It is possible to configure several JWTBearerAuthentication handlers,
1809+
<p>It is possible to configure several <code>JWTBearerAuthentication</code> handlers,
17921810
for applications that need to support more than one identity provider. For
17931811
example, for applications that need to support sign-in through Auth0, Azure
17941812
Active Directory, Azure Active Directory B2C.</p>
@@ -1897,12 +1915,97 @@ <h2 id="reading-a-users-context">Reading a user's context<a class="headerlink" h
18971915
</div>
18981916
</div>
18991917
</div>
1918+
<h2 id="dependency-injection-in-authentication-handlers">Dependency Injection in authentication handlers<a class="headerlink" href="#dependency-injection-in-authentication-handlers" title="Permanent link">&para;</a></h2>
1919+
<p>Dependency Injection is supported in authentication handlers. To use it:</p>
1920+
<ol>
1921+
<li>Configure <code>AuthenticationHandler</code> objects as types (not instances)
1922+
associated to the <code>AuthenticationStrategy</code> object.</li>
1923+
<li>Register dependencies in the DI container, and in the handler classes
1924+
according to the solution you are using for dependency injection.</li>
1925+
</ol>
1926+
<p>The code below illustrates and example using the built-in solution for DI.</p>
1927+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-10-1"> 1</a></span>
1928+
<span class="normal"><a href="#__codelineno-10-2"> 2</a></span>
1929+
<span class="normal"><a href="#__codelineno-10-3"> 3</a></span>
1930+
<span class="normal"><a href="#__codelineno-10-4"> 4</a></span>
1931+
<span class="normal"><a href="#__codelineno-10-5"> 5</a></span>
1932+
<span class="normal"><a href="#__codelineno-10-6"> 6</a></span>
1933+
<span class="normal"><a href="#__codelineno-10-7"> 7</a></span>
1934+
<span class="normal"><a href="#__codelineno-10-8"> 8</a></span>
1935+
<span class="normal"><a href="#__codelineno-10-9"> 9</a></span>
1936+
<span class="normal"><a href="#__codelineno-10-10">10</a></span>
1937+
<span class="normal"><a href="#__codelineno-10-11">11</a></span>
1938+
<span class="normal"><a href="#__codelineno-10-12">12</a></span>
1939+
<span class="normal"><a href="#__codelineno-10-13">13</a></span>
1940+
<span class="normal"><a href="#__codelineno-10-14">14</a></span>
1941+
<span class="normal"><a href="#__codelineno-10-15">15</a></span>
1942+
<span class="normal"><a href="#__codelineno-10-16">16</a></span>
1943+
<span class="normal"><a href="#__codelineno-10-17">17</a></span>
1944+
<span class="normal"><a href="#__codelineno-10-18">18</a></span>
1945+
<span class="normal"><a href="#__codelineno-10-19">19</a></span>
1946+
<span class="normal"><a href="#__codelineno-10-20">20</a></span>
1947+
<span class="normal"><a href="#__codelineno-10-21">21</a></span>
1948+
<span class="normal"><a href="#__codelineno-10-22">22</a></span>
1949+
<span class="normal"><a href="#__codelineno-10-23">23</a></span>
1950+
<span class="normal"><a href="#__codelineno-10-24">24</a></span>
1951+
<span class="normal"><a href="#__codelineno-10-25">25</a></span>
1952+
<span class="normal"><a href="#__codelineno-10-26">26</a></span>
1953+
<span class="normal"><a href="#__codelineno-10-27">27</a></span>
1954+
<span class="normal"><a href="#__codelineno-10-28">28</a></span>
1955+
<span class="normal"><a href="#__codelineno-10-29">29</a></span>
1956+
<span class="normal"><a href="#__codelineno-10-30">30</a></span>
1957+
<span class="normal"><a href="#__codelineno-10-31">31</a></span>
1958+
<span class="normal"><a href="#__codelineno-10-32">32</a></span>
1959+
<span class="normal"><a href="#__codelineno-10-33">33</a></span>
1960+
<span class="normal"><a href="#__codelineno-10-34">34</a></span>
1961+
<span class="normal"><a href="#__codelineno-10-35">35</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">blacksheep</span><span class="w"> </span><span class="kn">import</span> <span class="n">Application</span><span class="p">,</span> <span class="n">Request</span><span class="p">,</span> <span class="n">json</span>
1962+
<a id="__codelineno-10-2" name="__codelineno-10-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">guardpost</span><span class="w"> </span><span class="kn">import</span> <span class="n">AuthenticationHandler</span><span class="p">,</span> <span class="n">Identity</span>
1963+
<a id="__codelineno-10-3" name="__codelineno-10-3"></a>
1964+
<a id="__codelineno-10-4" name="__codelineno-10-4"></a><span class="n">app</span> <span class="o">=</span> <span class="n">Application</span><span class="p">()</span>
1965+
<a id="__codelineno-10-5" name="__codelineno-10-5"></a>
1966+
<a id="__codelineno-10-6" name="__codelineno-10-6"></a>
1967+
<a id="__codelineno-10-7" name="__codelineno-10-7"></a><span class="hll"><span class="k">class</span><span class="w"> </span><span class="nc">ExampleDependency</span><span class="p">:</span>
1968+
</span><a id="__codelineno-10-8" name="__codelineno-10-8"></a><span class="hll"> <span class="k">pass</span>
1969+
</span><a id="__codelineno-10-9" name="__codelineno-10-9"></a>
1970+
<a id="__codelineno-10-10" name="__codelineno-10-10"></a>
1971+
<a id="__codelineno-10-11" name="__codelineno-10-11"></a><span class="hll"><span class="k">class</span><span class="w"> </span><span class="nc">MyAuthenticationHandler</span><span class="p">(</span><span class="n">AuthenticationHandler</span><span class="p">):</span>
1972+
</span><a id="__codelineno-10-12" name="__codelineno-10-12"></a><span class="hll"> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependency</span><span class="p">:</span> <span class="n">ExampleDependency</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
1973+
</span><a id="__codelineno-10-13" name="__codelineno-10-13"></a><span class="hll"> <span class="bp">self</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="n">dependency</span>
1974+
</span><a id="__codelineno-10-14" name="__codelineno-10-14"></a>
1975+
<a id="__codelineno-10-15" name="__codelineno-10-15"></a> <span class="k">def</span><span class="w"> </span><span class="nf">authenticate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">Request</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Identity</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
1976+
<a id="__codelineno-10-16" name="__codelineno-10-16"></a> <span class="c1"># TODO: implement your own authentication logic</span>
1977+
<a id="__codelineno-10-17" name="__codelineno-10-17"></a> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dependency</span><span class="p">,</span> <span class="n">ExampleDependency</span><span class="p">)</span>
1978+
<a id="__codelineno-10-18" name="__codelineno-10-18"></a> <span class="k">return</span> <span class="n">Identity</span><span class="p">({</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;example&quot;</span><span class="p">,</span> <span class="s2">&quot;sub&quot;</span><span class="p">:</span> <span class="s2">&quot;001&quot;</span><span class="p">},</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheme</span><span class="p">)</span>
1979+
<a id="__codelineno-10-19" name="__codelineno-10-19"></a>
1980+
<a id="__codelineno-10-20" name="__codelineno-10-20"></a>
1981+
<a id="__codelineno-10-21" name="__codelineno-10-21"></a><span class="n">auth</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">use_authentication</span><span class="p">()</span> <span class="c1"># AuthenticationStrategy</span>
1982+
<a id="__codelineno-10-22" name="__codelineno-10-22"></a>
1983+
<a id="__codelineno-10-23" name="__codelineno-10-23"></a><span class="hll"><span class="c1"># The authentication handler will be instantiated by `app.services`,</span>
1984+
</span><a id="__codelineno-10-24" name="__codelineno-10-24"></a><span class="hll"><span class="c1"># which can be any object implementing the ContainerProtocol</span>
1985+
</span><a id="__codelineno-10-25" name="__codelineno-10-25"></a><span class="hll"><span class="n">auth</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">MyAuthenticationHandler</span><span class="p">)</span>
1986+
</span><a id="__codelineno-10-26" name="__codelineno-10-26"></a><span class="hll">
1987+
</span><a id="__codelineno-10-27" name="__codelineno-10-27"></a><span class="c1"># We need to register the types in the DI container!</span>
1988+
<a id="__codelineno-10-28" name="__codelineno-10-28"></a><span class="hll"><span class="n">app</span><span class="o">.</span><span class="n">services</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">MyAuthenticationHandler</span><span class="p">)</span>
1989+
</span><a id="__codelineno-10-29" name="__codelineno-10-29"></a><span class="hll"><span class="n">app</span><span class="o">.</span><span class="n">services</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">ExampleDependency</span><span class="p">)</span>
1990+
</span><a id="__codelineno-10-30" name="__codelineno-10-30"></a><span class="hll">
1991+
</span><a id="__codelineno-10-31" name="__codelineno-10-31"></a>
1992+
<a id="__codelineno-10-32" name="__codelineno-10-32"></a><span class="nd">@app</span><span class="o">.</span><span class="n">router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
1993+
<a id="__codelineno-10-33" name="__codelineno-10-33"></a><span class="k">def</span><span class="w"> </span><span class="nf">home</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
1994+
<a id="__codelineno-10-34" name="__codelineno-10-34"></a> <span class="k">assert</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
1995+
<a id="__codelineno-10-35" name="__codelineno-10-35"></a> <span class="k">return</span> <span class="n">json</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">claims</span><span class="p">)</span>
1996+
</code></pre></div></td></tr></table></div>
1997+
<div class="admonition tip">
1998+
<p class="admonition-title">ContainerProtocol.</p>
1999+
<p>As documented in <a href="../dependency-injection/#the-container-protocol"><em>Container Protocol</em></a>, BlackSheep
2000+
supports the use of other DI containers as replacements for the built-in
2001+
library used for dependency injection.</p>
2002+
</div>
19002003
<h2 id="next">Next<a class="headerlink" href="#next" title="Permanent link">&para;</a></h2>
19012004
<p>While authentication focuses on <em>identifying</em> users, authorization determines
19022005
whether a user <em>is permitted</em> to perform the requested action. The next page
19032006
describes the built-in <a href="../authorization/">authorization strategy</a> in
19042007
BlackSheep.</p>
1905-
<div class="nt-contribs"><p class="nt-mod-time">Last modified on: 2025-04-22 08:29:25</p><div class="nt-contributors"><div class="nt-contributor nt-group-0" title="Roberto Prevato &lt;roberto.prevato@gmail.com&gt; (7)"><span class="nt-initials">RP</span></div><div class="nt-contributor nt-group-1" title="Elliot Waite &lt;elliot@elliotwaite.com&gt; (1)"><span class="nt-initials">EW</span></div><div class="nt-contributor nt-group-2" title="Roman Vlasenko &lt;56698047+Klavionik@users.noreply.github.com&gt; (1)"><span class="nt-initials">RV</span></div></div></div>
2008+
<div class="nt-contribs"><p class="nt-mod-time">Last modified on: 2025-05-11 19:57:17</p><div class="nt-contributors"><div class="nt-contributor nt-group-0" title="Roberto Prevato &lt;roberto.prevato@gmail.com&gt; (8)"><span class="nt-initials">RP</span></div><div class="nt-contributor nt-group-1" title="Elliot Waite &lt;elliot@elliotwaite.com&gt; (1)"><span class="nt-initials">EW</span></div><div class="nt-contributor nt-group-2" title="Roman Vlasenko &lt;56698047+Klavionik@users.noreply.github.com&gt; (1)"><span class="nt-initials">RV</span></div></div></div>
19062009

19072010

19082011

0 commit comments

Comments
 (0)