use oauth2_client::{
re_exports::{ClientId, ClientSecret, RedirectUri, Url, UrlParseError},
Provider, ProviderExtAuthorizationCodeGrant,
};
use crate::{FacebookScope, AUTHORIZATION_URL, TOKEN_URL};
#[derive(Debug, Clone)]
pub struct FacebookProviderForWebApp {
client_id: ClientId,
client_secret: ClientSecret,
redirect_uri: RedirectUri,
token_endpoint_url: Url,
authorization_endpoint_url: Url,
}
impl FacebookProviderForWebApp {
pub fn new(
app_id: ClientId,
app_secret: ClientSecret,
redirect_uri: RedirectUri,
) -> Result<Self, UrlParseError> {
Ok(Self {
client_id: app_id,
client_secret: app_secret,
redirect_uri,
token_endpoint_url: TOKEN_URL.parse()?,
authorization_endpoint_url: AUTHORIZATION_URL.parse()?,
})
}
}
impl Provider for FacebookProviderForWebApp {
type Scope = FacebookScope;
fn client_id(&self) -> Option<&ClientId> {
Some(&self.client_id)
}
fn client_secret(&self) -> Option<&ClientSecret> {
Some(&self.client_secret)
}
fn token_endpoint_url(&self) -> &Url {
&self.token_endpoint_url
}
}
impl ProviderExtAuthorizationCodeGrant for FacebookProviderForWebApp {
fn redirect_uri(&self) -> Option<&RedirectUri> {
Some(&self.redirect_uri)
}
fn scopes_default(&self) -> Option<Vec<<Self as Provider>::Scope>> {
Some(vec![FacebookScope::Email, FacebookScope::PublicProfile])
}
fn authorization_endpoint_url(&self) -> &Url {
&self.authorization_endpoint_url
}
}