1
0
mirror of https://github.com/actix/actix-extras.git synced 2025-09-02 21:16:37 +02:00

Deploying to gh-pages from @ 1e682e7a59 🚀

This commit is contained in:
robjtede
2022-08-24 17:10:06 +00:00
parent 677c856277
commit a717748964
200 changed files with 8532 additions and 8481 deletions

View File

@@ -142,149 +142,149 @@
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
</pre><pre class="rust"><code><span class="doccomment">//! Extractor for the &quot;Bearer&quot; HTTP Authentication Scheme.</span>
</pre><pre class="rust"><code><span class="doccomment">//! Extractor for the &quot;Bearer&quot; HTTP Authentication Scheme.
<span class="kw">use</span> <span class="ident">std</span>::{<span class="ident">borrow::Cow</span>, <span class="ident">default::Default</span>};
</span><span class="kw">use </span>std::{borrow::Cow, default::Default};
<span class="kw">use</span> <span class="ident">actix_utils::future</span>::{<span class="ident">ready</span>, <span class="ident">Ready</span>};
<span class="kw">use</span> <span class="ident">actix_web</span>::{<span class="ident">dev::Payload</span>, <span class="ident">http::header::Header</span>, <span class="ident">FromRequest</span>, <span class="ident">HttpRequest</span>};
<span class="kw">use </span>actix_utils::future::{ready, Ready};
<span class="kw">use </span>actix_web::{dev::Payload, http::header::Header, FromRequest, HttpRequest};
<span class="kw">use</span> <span class="kw">super</span>::{<span class="ident">config::AuthExtractorConfig</span>, <span class="ident">errors::AuthenticationError</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::headers::www_authenticate::bearer::Error</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::headers</span>::{<span class="ident">authorization</span>, <span class="ident">www_authenticate::bearer</span>};
<span class="kw">use super</span>::{config::AuthExtractorConfig, errors::AuthenticationError};
<span class="kw">pub use </span><span class="kw">crate</span>::headers::www_authenticate::bearer::Error;
<span class="kw">use </span><span class="kw">crate</span>::headers::{authorization, www_authenticate::bearer};
<span class="doccomment">/// [`BearerAuth`] extractor configuration.</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>, <span class="ident">Default</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Config</span>(<span class="ident">bearer::Bearer</span>);
<span class="doccomment">/// [`BearerAuth`] extractor configuration.
</span><span class="attribute">#[derive(Debug, Clone, Default)]
</span><span class="kw">pub struct </span>Config(bearer::Bearer);
<span class="kw">impl</span> <span class="ident">Config</span> {
<span class="doccomment">/// Set challenge `scope` attribute.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The `&quot;scope&quot;` attribute is a space-delimited list of case-sensitive</span>
<span class="doccomment">/// scope values indicating the required scope of the access token for</span>
<span class="doccomment">/// accessing the requested resource.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">scope</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Into</span><span class="op">&lt;</span><span class="ident">Cow</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span>, <span class="ident">str</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">value</span>: <span class="ident">T</span>) -&gt; <span class="ident">Config</span> {
<span class="self">self</span>.<span class="number">0</span>.<span class="ident">scope</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">value</span>.<span class="ident">into</span>());
<span class="self">self</span>
}
<span class="kw">impl </span>Config {
<span class="doccomment">/// Set challenge `scope` attribute.
///
/// The `&quot;scope&quot;` attribute is a space-delimited list of case-sensitive
/// scope values indicating the required scope of the access token for
/// accessing the requested resource.
</span><span class="kw">pub fn </span>scope&lt;T: Into&lt;Cow&lt;<span class="lifetime">&#39;static</span>, str&gt;&gt;&gt;(<span class="kw-2">mut </span><span class="self">self</span>, value: T) -&gt; Config {
<span class="self">self</span>.<span class="number">0</span>.scope = <span class="prelude-val">Some</span>(value.into());
<span class="self">self
</span>}
<span class="doccomment">/// Set challenge `realm` attribute.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The &quot;realm&quot; attribute indicates the scope of protection in the manner</span>
<span class="doccomment">/// described in HTTP/1.1 [RFC 2617](https://tools.ietf.org/html/rfc2617#section-1.2).</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">realm</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Into</span><span class="op">&lt;</span><span class="ident">Cow</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span>, <span class="ident">str</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">value</span>: <span class="ident">T</span>) -&gt; <span class="ident">Config</span> {
<span class="self">self</span>.<span class="number">0</span>.<span class="ident">realm</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">value</span>.<span class="ident">into</span>());
<span class="self">self</span>
<span class="doccomment">/// Set challenge `realm` attribute.
///
/// The &quot;realm&quot; attribute indicates the scope of protection in the manner
/// described in HTTP/1.1 [RFC 2617](https://tools.ietf.org/html/rfc2617#section-1.2).
</span><span class="kw">pub fn </span>realm&lt;T: Into&lt;Cow&lt;<span class="lifetime">&#39;static</span>, str&gt;&gt;&gt;(<span class="kw-2">mut </span><span class="self">self</span>, value: T) -&gt; Config {
<span class="self">self</span>.<span class="number">0</span>.realm = <span class="prelude-val">Some</span>(value.into());
<span class="self">self
</span>}
}
<span class="kw">impl </span>AsRef&lt;bearer::Bearer&gt; <span class="kw">for </span>Config {
<span class="kw">fn </span>as_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>bearer::Bearer {
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0
</span>}
}
<span class="kw">impl </span>AuthExtractorConfig <span class="kw">for </span>Config {
<span class="kw">type </span>Inner = bearer::Bearer;
<span class="kw">fn </span>into_inner(<span class="self">self</span>) -&gt; <span class="self">Self</span>::Inner {
<span class="self">self</span>.<span class="number">0
</span>}
}
<span class="doccomment">/// Extractor for HTTP Bearer auth
///
/// # Examples
/// ```
/// use actix_web_httpauth::extractors::bearer::BearerAuth;
///
/// async fn index(auth: BearerAuth) -&gt; String {
/// format!(&quot;Hello, user with token {}!&quot;, auth.token())
/// }
/// ```
///
/// If authentication fails, this extractor fetches the [`Config`] instance
/// from the [app data] in order to properly form the `WWW-Authenticate`
/// response header.
///
/// # Examples
/// ```
/// use actix_web::{web, App};
/// use actix_web_httpauth::extractors::bearer::{self, BearerAuth};
///
/// async fn index(auth: BearerAuth) -&gt; String {
/// format!(&quot;Hello, {}!&quot;, auth.token())
/// }
///
/// App::new()
/// .app_data(
/// bearer::Config::default()
/// .realm(&quot;Restricted area&quot;)
/// .scope(&quot;email photo&quot;),
/// )
/// .service(web::resource(&quot;/index.html&quot;).route(web::get().to(index)));
/// ```
</span><span class="attribute">#[derive(Debug, Clone)]
</span><span class="kw">pub struct </span>BearerAuth(authorization::Bearer);
<span class="kw">impl </span>BearerAuth {
<span class="doccomment">/// Returns bearer token provided by client.
</span><span class="kw">pub fn </span>token(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>str {
<span class="self">self</span>.<span class="number">0</span>.token()
}
}
<span class="kw">impl</span> <span class="ident">AsRef</span><span class="op">&lt;</span><span class="ident">bearer::Bearer</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">Config</span> {
<span class="kw">fn</span> <span class="ident">as_ref</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span><span class="ident">bearer::Bearer</span> {
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>
}
}
<span class="kw">impl </span>FromRequest <span class="kw">for </span>BearerAuth {
<span class="kw">type </span>Future = Ready&lt;<span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, <span class="self">Self</span>::Error&gt;&gt;;
<span class="kw">type </span>Error = AuthenticationError&lt;bearer::Bearer&gt;;
<span class="kw">impl</span> <span class="ident">AuthExtractorConfig</span> <span class="kw">for</span> <span class="ident">Config</span> {
<span class="kw">type</span> <span class="ident">Inner</span> <span class="op">=</span> <span class="ident">bearer::Bearer</span>;
<span class="kw">fn </span>from_request(req: <span class="kw-2">&amp;</span>HttpRequest, _payload: <span class="kw-2">&amp;mut </span>Payload) -&gt; &lt;<span class="self">Self </span><span class="kw">as </span>FromRequest&gt;::Future {
ready(
authorization::Authorization::&lt;authorization::Bearer&gt;::parse(req)
.map(|auth| BearerAuth(auth.into_scheme()))
.map_err(|<span class="kw">_</span>| {
<span class="kw">let </span>bearer = req
.app_data::&lt;Config&gt;()
.map(|config| config.<span class="number">0</span>.clone())
.unwrap_or_else(Default::default);
<span class="kw">fn</span> <span class="ident">into_inner</span>(<span class="self">self</span>) -&gt; <span class="ident"><span class="self">Self</span>::Inner</span> {
<span class="self">self</span>.<span class="number">0</span>
}
}
<span class="doccomment">/// Extractor for HTTP Bearer auth</span>
<span class="doccomment">///</span>
<span class="doccomment">/// # Examples</span>
<span class="doccomment">/// ```</span>
<span class="doccomment">/// use actix_web_httpauth::extractors::bearer::BearerAuth;</span>
<span class="doccomment">///</span>
<span class="doccomment">/// async fn index(auth: BearerAuth) -&gt; String {</span>
<span class="doccomment">/// format!(&quot;Hello, user with token {}!&quot;, auth.token())</span>
<span class="doccomment">/// }</span>
<span class="doccomment">/// ```</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If authentication fails, this extractor fetches the [`Config`] instance</span>
<span class="doccomment">/// from the [app data] in order to properly form the `WWW-Authenticate`</span>
<span class="doccomment">/// response header.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// # Examples</span>
<span class="doccomment">/// ```</span>
<span class="doccomment">/// use actix_web::{web, App};</span>
<span class="doccomment">/// use actix_web_httpauth::extractors::bearer::{self, BearerAuth};</span>
<span class="doccomment">///</span>
<span class="doccomment">/// async fn index(auth: BearerAuth) -&gt; String {</span>
<span class="doccomment">/// format!(&quot;Hello, {}!&quot;, auth.token())</span>
<span class="doccomment">/// }</span>
<span class="doccomment">///</span>
<span class="doccomment">/// App::new()</span>
<span class="doccomment">/// .app_data(</span>
<span class="doccomment">/// bearer::Config::default()</span>
<span class="doccomment">/// .realm(&quot;Restricted area&quot;)</span>
<span class="doccomment">/// .scope(&quot;email photo&quot;),</span>
<span class="doccomment">/// )</span>
<span class="doccomment">/// .service(web::resource(&quot;/index.html&quot;).route(web::get().to(index)));</span>
<span class="doccomment">/// ```</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BearerAuth</span>(<span class="ident">authorization::Bearer</span>);
<span class="kw">impl</span> <span class="ident">BearerAuth</span> {
<span class="doccomment">/// Returns bearer token provided by client.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">token</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="self">self</span>.<span class="number">0</span>.<span class="ident">token</span>()
}
}
<span class="kw">impl</span> <span class="ident">FromRequest</span> <span class="kw">for</span> <span class="ident">BearerAuth</span> {
<span class="kw">type</span> <span class="ident">Future</span> <span class="op">=</span> <span class="ident">Ready</span><span class="op">&lt;</span><span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="ident"><span class="self">Self</span>::Error</span><span class="op">&gt;</span><span class="op">&gt;</span>;
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">AuthenticationError</span><span class="op">&lt;</span><span class="ident">bearer::Bearer</span><span class="op">&gt;</span>;
<span class="kw">fn</span> <span class="ident">from_request</span>(<span class="ident">req</span>: <span class="kw-2">&amp;</span><span class="ident">HttpRequest</span>, <span class="ident">_payload</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Payload</span>) -&gt; <span class="op">&lt;</span><span class="self">Self</span> <span class="kw">as</span> <span class="ident">FromRequest</span><span class="op">&gt;</span><span class="ident">::Future</span> {
<span class="ident">ready</span>(
<span class="ident">authorization::Authorization</span>::<span class="op">&lt;</span><span class="ident">authorization::Bearer</span><span class="op">&gt;</span><span class="ident">::parse</span>(<span class="ident">req</span>)
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">auth</span><span class="op">|</span> <span class="ident">BearerAuth</span>(<span class="ident">auth</span>.<span class="ident">into_scheme</span>()))
.<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="kw">let</span> <span class="ident">bearer</span> <span class="op">=</span> <span class="ident">req</span>
.<span class="ident">app_data</span>::<span class="op">&lt;</span><span class="ident">Config</span><span class="op">&gt;</span>()
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">config</span><span class="op">|</span> <span class="ident">config</span>.<span class="number">0</span>.<span class="ident">clone</span>())
.<span class="ident">unwrap_or_else</span>(<span class="ident">Default::default</span>);
<span class="ident">AuthenticationError::new</span>(<span class="ident">bearer</span>)
AuthenticationError::new(bearer)
}),
)
}
}
<span class="doccomment">/// Extended error customization for HTTP `Bearer` auth.</span>
<span class="kw">impl</span> <span class="ident">AuthenticationError</span><span class="op">&lt;</span><span class="ident">bearer::Bearer</span><span class="op">&gt;</span> {
<span class="doccomment">/// Attach `Error` to the current Authentication error.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// Error status code will be changed to the one provided by the `kind`</span>
<span class="doccomment">/// Error.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">with_error</span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">kind</span>: <span class="ident">Error</span>) -&gt; <span class="self">Self</span> {
<span class="kw-2">*</span><span class="self">self</span>.<span class="ident">status_code_mut</span>() <span class="op">=</span> <span class="ident">kind</span>.<span class="ident">status_code</span>();
<span class="self">self</span>.<span class="ident">challenge_mut</span>().<span class="ident">error</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">kind</span>);
<span class="self">self</span>
}
<span class="doccomment">/// Extended error customization for HTTP `Bearer` auth.
</span><span class="kw">impl </span>AuthenticationError&lt;bearer::Bearer&gt; {
<span class="doccomment">/// Attach `Error` to the current Authentication error.
///
/// Error status code will be changed to the one provided by the `kind`
/// Error.
</span><span class="kw">pub fn </span>with_error(<span class="kw-2">mut </span><span class="self">self</span>, kind: Error) -&gt; <span class="self">Self </span>{
<span class="kw-2">*</span><span class="self">self</span>.status_code_mut() = kind.status_code();
<span class="self">self</span>.challenge_mut().error = <span class="prelude-val">Some</span>(kind);
<span class="self">self
</span>}
<span class="doccomment">/// Attach error description to the current Authentication error.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">with_error_description</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">desc</span>: <span class="ident">T</span>) -&gt; <span class="self">Self</span>
<span class="kw">where</span>
<span class="ident">T</span>: <span class="ident">Into</span><span class="op">&lt;</span><span class="ident">Cow</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span>, <span class="ident">str</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="doccomment">/// Attach error description to the current Authentication error.
</span><span class="kw">pub fn </span>with_error_description&lt;T&gt;(<span class="kw-2">mut </span><span class="self">self</span>, desc: T) -&gt; <span class="self">Self
</span><span class="kw">where
</span>T: Into&lt;Cow&lt;<span class="lifetime">&#39;static</span>, str&gt;&gt;,
{
<span class="self">self</span>.<span class="ident">challenge_mut</span>().<span class="ident">error_description</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">desc</span>.<span class="ident">into</span>());
<span class="self">self</span>
}
<span class="self">self</span>.challenge_mut().error_description = <span class="prelude-val">Some</span>(desc.into());
<span class="self">self
</span>}
<span class="doccomment">/// Attach error URI to the current Authentication error.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// It is up to implementor to provide properly formed absolute URI.</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">with_error_uri</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">uri</span>: <span class="ident">T</span>) -&gt; <span class="self">Self</span>
<span class="kw">where</span>
<span class="ident">T</span>: <span class="ident">Into</span><span class="op">&lt;</span><span class="ident">Cow</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span>, <span class="ident">str</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="doccomment">/// Attach error URI to the current Authentication error.
///
/// It is up to implementor to provide properly formed absolute URI.
</span><span class="kw">pub fn </span>with_error_uri&lt;T&gt;(<span class="kw-2">mut </span><span class="self">self</span>, uri: T) -&gt; <span class="self">Self
</span><span class="kw">where
</span>T: Into&lt;Cow&lt;<span class="lifetime">&#39;static</span>, str&gt;&gt;,
{
<span class="self">self</span>.<span class="ident">challenge_mut</span>().<span class="ident">error_uri</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">uri</span>.<span class="ident">into</span>());
<span class="self">self</span>
}
<span class="self">self</span>.challenge_mut().error_uri = <span class="prelude-val">Some</span>(uri.into());
<span class="self">self
</span>}
}
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../../" data-current-crate="actix_web_httpauth" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0-nightly (34a6cae28 2022-08-09)" ></div></body></html>
</section></div></main><div id="rustdoc-vars" data-root-path="../../../" data-current-crate="actix_web_httpauth" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0-nightly (060e47f74 2022-08-23)" ></div></body></html>