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:
@@ -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 "Bearer" HTTP Authentication Scheme.</span>
|
||||
</pre><pre class="rust"><code><span class="doccomment">//! Extractor for the "Bearer" 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 `"scope"` 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"><</span><span class="ident">T</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Cow</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="ident">str</span><span class="op">></span><span class="op">></span><span class="op">></span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">value</span>: <span class="ident">T</span>) -> <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 `"scope"` 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<T: Into<Cow<<span class="lifetime">'static</span>, str>>>(<span class="kw-2">mut </span><span class="self">self</span>, value: T) -> 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 "realm" 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"><</span><span class="ident">T</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Cow</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="ident">str</span><span class="op">></span><span class="op">></span><span class="op">></span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">value</span>: <span class="ident">T</span>) -> <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 "realm" 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<T: Into<Cow<<span class="lifetime">'static</span>, str>>>(<span class="kw-2">mut </span><span class="self">self</span>, value: T) -> 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<bearer::Bearer> <span class="kw">for </span>Config {
|
||||
<span class="kw">fn </span>as_ref(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>bearer::Bearer {
|
||||
<span class="kw-2">&</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>) -> <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) -> String {
|
||||
/// format!("Hello, user with token {}!", 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) -> String {
|
||||
/// format!("Hello, {}!", auth.token())
|
||||
/// }
|
||||
///
|
||||
/// App::new()
|
||||
/// .app_data(
|
||||
/// bearer::Config::default()
|
||||
/// .realm("Restricted area")
|
||||
/// .scope("email photo"),
|
||||
/// )
|
||||
/// .service(web::resource("/index.html").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">&</span><span class="self">self</span>) -> <span class="kw-2">&</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"><</span><span class="ident">bearer::Bearer</span><span class="op">></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">&</span><span class="self">self</span>) -> <span class="kw-2">&</span><span class="ident">bearer::Bearer</span> {
|
||||
<span class="kw-2">&</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<<span class="prelude-ty">Result</span><<span class="self">Self</span>, <span class="self">Self</span>::Error>>;
|
||||
<span class="kw">type </span>Error = AuthenticationError<bearer::Bearer>;
|
||||
|
||||
<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">&</span>HttpRequest, _payload: <span class="kw-2">&mut </span>Payload) -> <<span class="self">Self </span><span class="kw">as </span>FromRequest>::Future {
|
||||
ready(
|
||||
authorization::Authorization::<authorization::Bearer>::parse(req)
|
||||
.map(|auth| BearerAuth(auth.into_scheme()))
|
||||
.map_err(|<span class="kw">_</span>| {
|
||||
<span class="kw">let </span>bearer = req
|
||||
.app_data::<Config>()
|
||||
.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>) -> <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) -> String {</span>
|
||||
<span class="doccomment">/// format!("Hello, user with token {}!", 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) -> String {</span>
|
||||
<span class="doccomment">/// format!("Hello, {}!", 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("Restricted area")</span>
|
||||
<span class="doccomment">/// .scope("email photo"),</span>
|
||||
<span class="doccomment">/// )</span>
|
||||
<span class="doccomment">/// .service(web::resource("/index.html").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">&</span><span class="self">self</span>) -> <span class="kw-2">&</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"><</span><span class="prelude-ty">Result</span><span class="op"><</span><span class="self">Self</span>, <span class="ident"><span class="self">Self</span>::Error</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="kw">type</span> <span class="ident">Error</span> <span class="op">=</span> <span class="ident">AuthenticationError</span><span class="op"><</span><span class="ident">bearer::Bearer</span><span class="op">></span>;
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">from_request</span>(<span class="ident">req</span>: <span class="kw-2">&</span><span class="ident">HttpRequest</span>, <span class="ident">_payload</span>: <span class="kw-2">&mut</span> <span class="ident">Payload</span>) -> <span class="op"><</span><span class="self">Self</span> <span class="kw">as</span> <span class="ident">FromRequest</span><span class="op">></span><span class="ident">::Future</span> {
|
||||
<span class="ident">ready</span>(
|
||||
<span class="ident">authorization::Authorization</span>::<span class="op"><</span><span class="ident">authorization::Bearer</span><span class="op">></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"><</span><span class="ident">Config</span><span class="op">></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"><</span><span class="ident">bearer::Bearer</span><span class="op">></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>) -> <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<bearer::Bearer> {
|
||||
<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) -> <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"><</span><span class="ident">T</span><span class="op">></span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">desc</span>: <span class="ident">T</span>) -> <span class="self">Self</span>
|
||||
<span class="kw">where</span>
|
||||
<span class="ident">T</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Cow</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="ident">str</span><span class="op">></span><span class="op">></span>,
|
||||
<span class="doccomment">/// Attach error description to the current Authentication error.
|
||||
</span><span class="kw">pub fn </span>with_error_description<T>(<span class="kw-2">mut </span><span class="self">self</span>, desc: T) -> <span class="self">Self
|
||||
</span><span class="kw">where
|
||||
</span>T: Into<Cow<<span class="lifetime">'static</span>, str>>,
|
||||
{
|
||||
<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"><</span><span class="ident">T</span><span class="op">></span>(<span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">uri</span>: <span class="ident">T</span>) -> <span class="self">Self</span>
|
||||
<span class="kw">where</span>
|
||||
<span class="ident">T</span>: <span class="ident">Into</span><span class="op"><</span><span class="ident">Cow</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="ident">str</span><span class="op">></span><span class="op">></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<T>(<span class="kw-2">mut </span><span class="self">self</span>, uri: T) -> <span class="self">Self
|
||||
</span><span class="kw">where
|
||||
</span>T: Into<Cow<<span class="lifetime">'static</span>, str>>,
|
||||
{
|
||||
<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>
|
Reference in New Issue
Block a user