//! Providers. use token::{Token, Lifetime, Bearer, Static, Refresh}; /// OAuth 2.0 providers. pub trait Provider { /// The lifetime of tokens issued by the provider. type Lifetime: Lifetime; /// The type of token issued by the provider. type Token: Token; /// The authorization endpoint URI. /// /// See [RFC 6749, section 3.1](http://tools.ietf.org/html/rfc6749#section-3.1). fn auth_uri(&self) -> &str; /// The token endpoint URI. /// /// See [RFC 6749, section 3.2](http://tools.ietf.org/html/rfc6749#section-3.2). fn token_uri(&self) -> &str; /// Provider requires credentials via request body. /// /// Although not recommended by the RFC, some providers require `client_id` and `client_secret` /// as part of the request body. /// /// See [RFC 6749, section 2.3.1](http://tools.ietf.org/html/rfc6749#section-2.3.1). fn credentials_in_body(&self) -> bool { false } } /// Google OAuth 2.0 providers. /// /// See [Using OAuth 2.0 to Access Google /// APIs](https://developers.google.com/identity/protocols/OAuth2). pub mod google { use token::{Bearer, Expiring, Refresh}; use super::Provider; /// Signals the server to return the authorization code by prompting the user to copy and /// paste. /// /// See [Choosing a redirect URI][uri]. /// /// [uri]: https://developers.google.com/identity/protocols/OAuth2InstalledApp#choosingredirecturi pub const REDIRECT_URI_OOB: &'static str = "urn:ietf:wg:oauth:2.0:oob"; /// Signals the server to return the authorization code in the page title. /// /// See [Choosing a redirect URI][uri]. /// /// [uri]: https://developers.google.com/identity/protocols/OAuth2InstalledApp#choosingredirecturi pub const REDIRECT_URI_OOB_AUTO: &'static str = "urn:ietf:wg:oauth:2.0:oob:auto"; /// Google OAuth 2.0 provider for web applications. /// /// See [Using OAuth 2.0 for Web Server /// Applications](https://developers.google.com/identity/protocols/OAuth2WebServer). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Web; impl Provider for Web { type Lifetime = Expiring; type Token = Bearer; fn auth_uri(&self) -> &str { "https://accounts.google.com/o/oauth2/v2/auth" } fn token_uri(&self) -> &str { "https://www.googleapis.com/oauth2/v4/token" } } /// Google OAuth 2.0 provider for installed applications. /// /// See [Using OAuth 2.0 for Installed /// Applications](https://developers.google.com/identity/protocols/OAuth2InstalledApp). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Installed; impl Provider for Installed { type Lifetime = Refresh; type Token = Bearer; fn auth_uri(&self) -> &str { "https://accounts.google.com/o/oauth2/v2/auth" } fn token_uri(&self) -> &str { "https://www.googleapis.com/oauth2/v4/token" } } } /// GitHub OAuth 2.0 provider. /// /// See [OAuth, GitHub Developer Guide](https://developer.github.com/v3/oauth/). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct GitHub; impl Provider for GitHub { type Lifetime = Static; type Token = Bearer; fn auth_uri(&self) -> &str { "https://github.com/login/oauth/authorize" } fn token_uri(&self) -> &str { "https://github.com/login/oauth/access_token" } } /// Imgur OAuth 2.0 provider. /// /// See [OAuth 2.0, Imgur](https://api.imgur.com/oauth2). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Imgur; impl Provider for Imgur { type Lifetime = Refresh; type Token = Bearer; fn auth_uri(&self) -> &str { "https://api.imgur.com/oauth2/authorize" } fn token_uri(&self) -> &str { "https://api.imgur.com/oauth2/token" } }