Add force_login to the params sent to the /oauth/authorize endpoint
This commit is contained in:
+51
-11
@@ -22,6 +22,7 @@ pub struct Registration<'a, H: HttpSend = HttpSender> {
|
||||
base: String,
|
||||
client: Client,
|
||||
app_builder: AppBuilder<'a>,
|
||||
force_login: bool,
|
||||
http_sender: H,
|
||||
}
|
||||
|
||||
@@ -54,6 +55,7 @@ impl<'a> Registration<'a, HttpSender> {
|
||||
base: base.into(),
|
||||
client: Client::new(),
|
||||
app_builder: AppBuilder::new(),
|
||||
force_login: false,
|
||||
http_sender: HttpSender,
|
||||
}
|
||||
}
|
||||
@@ -66,6 +68,7 @@ impl<'a, H: HttpSend> Registration<'a, H> {
|
||||
base: base.into(),
|
||||
client: Client::new(),
|
||||
app_builder: AppBuilder::new(),
|
||||
force_login: false,
|
||||
http_sender,
|
||||
}
|
||||
}
|
||||
@@ -99,6 +102,13 @@ impl<'a, H: HttpSend> Registration<'a, H> {
|
||||
self
|
||||
}
|
||||
|
||||
/// Forces the user to re-login (useful if you need to re-auth as a
|
||||
/// different user on the same instance
|
||||
pub fn force_login(&mut self, force_login: bool) -> &mut Self {
|
||||
self.force_login = force_login;
|
||||
self
|
||||
}
|
||||
|
||||
fn send(&self, req: RequestBuilder) -> Result<Response> {
|
||||
Ok(self.http_sender.send(&self.client, req)?)
|
||||
}
|
||||
@@ -138,6 +148,7 @@ impl<'a, H: HttpSend> Registration<'a, H> {
|
||||
client_secret: oauth.client_secret,
|
||||
redirect: oauth.redirect_uri,
|
||||
scopes: app.scopes().clone(),
|
||||
force_login: self.force_login,
|
||||
http_sender: self.http_sender.clone(),
|
||||
})
|
||||
}
|
||||
@@ -173,6 +184,7 @@ impl<'a, H: HttpSend> Registration<'a, H> {
|
||||
client_secret: oauth.client_secret,
|
||||
redirect: oauth.redirect_uri,
|
||||
scopes: app.scopes().clone(),
|
||||
force_login: self.force_login,
|
||||
http_sender: self.http_sender.clone(),
|
||||
})
|
||||
}
|
||||
@@ -200,6 +212,7 @@ impl Registered<HttpSender> {
|
||||
/// "the-client-secret",
|
||||
/// "https://example.com/redirect",
|
||||
/// Scopes::read_all(),
|
||||
/// false,
|
||||
/// );
|
||||
/// let url = registration.authorize_url()?;
|
||||
/// // Here you now need to open the url in the browser
|
||||
@@ -217,6 +230,7 @@ impl Registered<HttpSender> {
|
||||
client_secret: &str,
|
||||
redirect: &str,
|
||||
scopes: Scopes,
|
||||
force_login: bool,
|
||||
) -> Registered<HttpSender> {
|
||||
Registered {
|
||||
base: base.to_string(),
|
||||
@@ -225,6 +239,7 @@ impl Registered<HttpSender> {
|
||||
client_secret: client_secret.to_string(),
|
||||
redirect: redirect.to_string(),
|
||||
scopes,
|
||||
force_login,
|
||||
http_sender: HttpSender,
|
||||
}
|
||||
}
|
||||
@@ -245,25 +260,41 @@ impl<H: HttpSend> Registered<H> {
|
||||
/// use elefren::{prelude::*, registration::Registered};
|
||||
/// # fn main() -> Result<(), Box<std::error::Error>> {
|
||||
///
|
||||
/// let origbase = "https://example.social";
|
||||
/// let origclient_id = "some-client_id";
|
||||
/// let origclient_secret = "some-client-secret";
|
||||
/// let origredirect = "https://example.social/redirect";
|
||||
/// let origscopes = Scopes::all();
|
||||
/// let origforce_login = false;
|
||||
///
|
||||
/// let registered = Registered::from_parts(
|
||||
/// "https://example.social",
|
||||
/// "some-client-id",
|
||||
/// "some-client-secret",
|
||||
/// "https://example.social/redirect",
|
||||
/// Scopes::all(),
|
||||
/// origbase,
|
||||
/// origclient_id,
|
||||
/// origclient_secret,
|
||||
/// origredirect,
|
||||
/// origscopes.clone(),
|
||||
/// origforce_login,
|
||||
/// );
|
||||
///
|
||||
/// let (base, client_id, client_secret, redirect, scopes) = registered.into_parts();
|
||||
/// let (base, client_id, client_secret, redirect, scopes, force_login) = registered.into_parts();
|
||||
///
|
||||
/// assert_eq!(origbase, &base);
|
||||
/// assert_eq!(origclient_id, &client_id);
|
||||
/// assert_eq!(origclient_secret, &client_secret);
|
||||
/// assert_eq!(origredirect, &redirect);
|
||||
/// assert_eq!(origscopes, scopes);
|
||||
/// assert_eq!(origforce_login, force_login);
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn into_parts(self) -> (String, String, String, String, Scopes) {
|
||||
pub fn into_parts(self) -> (String, String, String, String, Scopes, bool) {
|
||||
(
|
||||
self.base,
|
||||
self.client_id,
|
||||
self.client_secret,
|
||||
self.redirect,
|
||||
self.scopes,
|
||||
self.force_login,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -272,10 +303,18 @@ impl<H: HttpSend> Registered<H> {
|
||||
pub fn authorize_url(&self) -> Result<String> {
|
||||
let scopes = format!("{}", self.scopes);
|
||||
let scopes: String = utf8_percent_encode(&scopes, DEFAULT_ENCODE_SET).collect();
|
||||
let url = format!(
|
||||
"{}/oauth/authorize?client_id={}&redirect_uri={}&scope={}&response_type=code",
|
||||
self.base, self.client_id, self.redirect, scopes,
|
||||
);
|
||||
let url = if self.force_login {
|
||||
format!(
|
||||
"{}/oauth/authorize?client_id={}&redirect_uri={}&scope={}&force_login=true&\
|
||||
response_type=code",
|
||||
self.base, self.client_id, self.redirect, scopes,
|
||||
)
|
||||
} else {
|
||||
format!(
|
||||
"{}/oauth/authorize?client_id={}&redirect_uri={}&scope={}&response_type=code",
|
||||
self.base, self.client_id, self.redirect, scopes,
|
||||
)
|
||||
};
|
||||
|
||||
Ok(url)
|
||||
}
|
||||
@@ -315,6 +354,7 @@ pub struct Registered<H: HttpSend> {
|
||||
client_secret: String,
|
||||
redirect: String,
|
||||
scopes: Scopes,
|
||||
force_login: bool,
|
||||
http_sender: H,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user