|
778 | 778 | </span> |
779 | 779 | </a> |
780 | 780 |
|
| 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 | + |
781 | 790 | </li> |
782 | 791 |
|
783 | 792 | <li class="md-nav__item"> |
|
1596 | 1605 | </span> |
1597 | 1606 | </a> |
1598 | 1607 |
|
| 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 | + |
1599 | 1617 | </li> |
1600 | 1618 |
|
1601 | 1619 | <li class="md-nav__item"> |
@@ -1788,7 +1806,7 @@ <h2 id="jwt-bearer">JWT Bearer<a class="headerlink" href="#jwt-bearer" title="Pe |
1788 | 1806 | the future.</p> |
1789 | 1807 | <div class="admonition"> |
1790 | 1808 | <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, |
1792 | 1810 | for applications that need to support more than one identity provider. For |
1793 | 1811 | example, for applications that need to support sign-in through Auth0, Azure |
1794 | 1812 | 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 |
1897 | 1915 | </div> |
1898 | 1916 | </div> |
1899 | 1917 | </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">¶</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">-></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">-></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">"id"</span><span class="p">:</span> <span class="s2">"example"</span><span class="p">,</span> <span class="s2">"sub"</span><span class="p">:</span> <span class="s2">"001"</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">"/"</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> |
1900 | 2003 | <h2 id="next">Next<a class="headerlink" href="#next" title="Permanent link">¶</a></h2> |
1901 | 2004 | <p>While authentication focuses on <em>identifying</em> users, authorization determines |
1902 | 2005 | whether a user <em>is permitted</em> to perform the requested action. The next page |
1903 | 2006 | describes the built-in <a href="../authorization/">authorization strategy</a> in |
1904 | 2007 | 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 <roberto.prevato@gmail.com> (7)"><span class="nt-initials">RP</span></div><div class="nt-contributor nt-group-1" title="Elliot Waite <elliot@elliotwaite.com> (1)"><span class="nt-initials">EW</span></div><div class="nt-contributor nt-group-2" title="Roman Vlasenko <56698047+Klavionik@users.noreply.github.com> (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 <roberto.prevato@gmail.com> (8)"><span class="nt-initials">RP</span></div><div class="nt-contributor nt-group-1" title="Elliot Waite <elliot@elliotwaite.com> (1)"><span class="nt-initials">EW</span></div><div class="nt-contributor nt-group-2" title="Roman Vlasenko <56698047+Klavionik@users.noreply.github.com> (1)"><span class="nt-initials">RV</span></div></div></div> |
1906 | 2009 |
|
1907 | 2010 |
|
1908 | 2011 |
|
|
0 commit comments