-
Notifications
You must be signed in to change notification settings - Fork 114
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
It doesn't yet work on nightly due to a panic in https://goo.gl/RyM4GT Might have something to do with me being on nightly, and some cargo-related hickoup.
- Loading branch information
Showing
4 changed files
with
132 additions
and
86 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#[cfg(feature = "with_syntex")] | ||
mod inner { | ||
extern crate syntex; | ||
extern crate serde_codegen; | ||
|
||
use std::env; | ||
use std::path::Path; | ||
|
||
pub fn main() { | ||
let out_dir = env::var_os("OUT_DIR").unwrap(); | ||
|
||
let src = Path::new("src/lib.rs.in"); | ||
let dst = Path::new(&out_dir).join("lib.rs"); | ||
|
||
let mut registry = syntex::Registry::new(); | ||
serde_codegen::register(&mut registry); | ||
registry.expand("yup-oauth2", &src, &dst).unwrap(); | ||
} | ||
} | ||
|
||
#[cfg(not(feature = "with_syntex"))] | ||
mod inner { | ||
pub fn main() {} | ||
} | ||
|
||
pub fn main() { | ||
inner::main() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,10 @@ | ||
//! This library can be used to acquire oauth2.0 authentication for services. | ||
//! At the time of writing, only one way of doing so is implemented, the [device flow](https://developers.google.com/youtube/v3/guides/authentication#devices), along with a flow | ||
//! for [refreshing tokens](https://developers.google.com/youtube/v3/guides/authentication#devices) | ||
//! | ||
//! For your application to use this library, you will have to obtain an application | ||
//! id and secret by [following this guide](https://developers.google.com/youtube/registering_an_application). | ||
//! | ||
//! # Device Flow Usage | ||
//! As the `DeviceFlow` involves polling, the `DeviceFlowHelper` should be used | ||
//! as means to adhere to the protocol, and remain resilient to all kinds of errors | ||
//! that can occour on the way. | ||
//! | ||
//! The returned `Token` should be stored permanently to authorize future API requests. | ||
//! | ||
//! ```test_harness,no_run | ||
//! #![feature(custom_derive, plugin)] | ||
//! #![plugin(serde_macros)] | ||
//! extern crate hyper; | ||
//! extern crate yup_oauth2 as oauth2; | ||
//! extern crate serde; | ||
//! | ||
//! use oauth2::{Authenticator, DefaultAuthenticatorDelegate, PollInformation, ConsoleApplicationSecret, MemoryStorage, GetToken}; | ||
//! use serde::json; | ||
//! use std::default::Default; | ||
//! # const SECRET: &'static str = "{\"installed\":{\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"client_secret\":\"UqkDJd5RFwnHoiG5x5Rub8SI\",\"token_uri\":\"https://accounts.google.com/o/oauth2/token\",\"client_email\":\"\",\"redirect_uris\":[\"urn:ietf:wg:oauth:2.0:oob\",\"oob\"],\"client_x509_cert_url\":\"\",\"client_id\":\"14070749909-vgip2f1okm7bkvajhi9jugan6126io9v.apps.googleusercontent.com\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\"}}"; | ||
//! | ||
//! # #[test] fn device() { | ||
//! let secret = json::from_str::<ConsoleApplicationSecret>(SECRET).unwrap().installed.unwrap(); | ||
//! let res = Authenticator::new(&secret, DefaultAuthenticatorDelegate, | ||
//! hyper::Client::new(), | ||
//! <MemoryStorage as Default>::default(), None) | ||
//! .token(&["https://www.googleapis.com/auth/youtube.upload"]); | ||
//! match res { | ||
//! Ok(t) => { | ||
//! // now you can use t.access_token to authenticate API calls within your | ||
//! // given scopes. It will not be valid forever, which is when you have to | ||
//! // refresh it using the `RefreshFlow` | ||
//! }, | ||
//! Err(err) => println!("Failed to acquire token: {}", err), | ||
//! } | ||
//! # } | ||
//! ``` | ||
//! | ||
//! # Refresh Flow Usage | ||
//! As the `Token` you retrieved previously will only be valid for a certain time, you will have | ||
//! to use the information from the `Token.refresh_token` field to get a new `access_token`. | ||
//! | ||
//! ```test_harness,no_run | ||
//! extern crate hyper; | ||
//! extern crate yup_oauth2 as oauth2; | ||
//! use oauth2::{RefreshFlow, FlowType, RefreshResult}; | ||
//! | ||
//! # #[test] fn refresh() { | ||
//! let mut f = RefreshFlow::new(hyper::Client::new()); | ||
//! let new_token = match *f.refresh_token(FlowType::Device, | ||
//! "my_client_id", "my_secret", | ||
//! "my_refresh_token") { | ||
//! RefreshResult::Success(ref t) => t, | ||
//! _ => panic!("bad luck ;)") | ||
//! }; | ||
//! # } | ||
//! ``` | ||
#![feature(custom_derive, plugin)] | ||
#![plugin(serde_macros)] | ||
extern crate chrono; | ||
#[cfg_attr(feature = "nightly", feature(plugin))] | ||
#[cfg_attr(feature = "nightly", plugin(serde_macros))] | ||
|
||
#[macro_use] | ||
extern crate hyper; | ||
#[macro_use] | ||
extern crate log; | ||
#[cfg(test)] #[macro_use] | ||
extern crate yup_hyper_mock as hyper_mock; | ||
extern crate mime; | ||
extern crate url; | ||
extern crate time; | ||
extern crate itertools; | ||
extern crate serde; | ||
|
||
#[cfg(feature = "nightly")] | ||
include!("lib.rs.in"); | ||
|
||
mod device; | ||
mod refresh; | ||
mod common; | ||
mod helper; | ||
|
||
pub use device::{DeviceFlow, PollInformation, PollError}; | ||
pub use refresh::{RefreshFlow, RefreshResult}; | ||
pub use common::{Token, FlowType, ApplicationSecret, ConsoleApplicationSecret, Scheme, TokenType}; | ||
pub use helper::{TokenStorage, NullStorage, MemoryStorage, Authenticator, | ||
AuthenticatorDelegate, Retry, DefaultAuthenticatorDelegate, GetToken}; | ||
#[cfg(feature = "with_syntex")] | ||
include!(concat!(env!("OUT_DIR"), "/lib.rs")); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
//! This library can be used to acquire oauth2.0 authentication for services. | ||
//! At the time of writing, only one way of doing so is implemented, the [device flow](https://developers.google.com/youtube/v3/guides/authentication#devices), along with a flow | ||
//! for [refreshing tokens](https://developers.google.com/youtube/v3/guides/authentication#devices) | ||
//! | ||
//! For your application to use this library, you will have to obtain an application | ||
//! id and secret by [following this guide](https://developers.google.com/youtube/registering_an_application). | ||
//! | ||
//! # Device Flow Usage | ||
//! As the `DeviceFlow` involves polling, the `DeviceFlowHelper` should be used | ||
//! as means to adhere to the protocol, and remain resilient to all kinds of errors | ||
//! that can occour on the way. | ||
//! | ||
//! The returned `Token` should be stored permanently to authorize future API requests. | ||
//! | ||
//! ```test_harness,no_run | ||
//! #![feature(custom_derive, plugin)] | ||
//! #![plugin(serde_macros)] | ||
//! extern crate hyper; | ||
//! extern crate yup_oauth2 as oauth2; | ||
//! extern crate serde; | ||
//! | ||
//! use oauth2::{Authenticator, DefaultAuthenticatorDelegate, PollInformation, ConsoleApplicationSecret, MemoryStorage, GetToken}; | ||
//! use serde::json; | ||
//! use std::default::Default; | ||
//! # const SECRET: &'static str = "{\"installed\":{\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"client_secret\":\"UqkDJd5RFwnHoiG5x5Rub8SI\",\"token_uri\":\"https://accounts.google.com/o/oauth2/token\",\"client_email\":\"\",\"redirect_uris\":[\"urn:ietf:wg:oauth:2.0:oob\",\"oob\"],\"client_x509_cert_url\":\"\",\"client_id\":\"14070749909-vgip2f1okm7bkvajhi9jugan6126io9v.apps.googleusercontent.com\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\"}}"; | ||
//! | ||
//! # #[test] fn device() { | ||
//! let secret = json::from_str::<ConsoleApplicationSecret>(SECRET).unwrap().installed.unwrap(); | ||
//! let res = Authenticator::new(&secret, DefaultAuthenticatorDelegate, | ||
//! hyper::Client::new(), | ||
//! <MemoryStorage as Default>::default(), None) | ||
//! .token(&["https://www.googleapis.com/auth/youtube.upload"]); | ||
//! match res { | ||
//! Ok(t) => { | ||
//! // now you can use t.access_token to authenticate API calls within your | ||
//! // given scopes. It will not be valid forever, which is when you have to | ||
//! // refresh it using the `RefreshFlow` | ||
//! }, | ||
//! Err(err) => println!("Failed to acquire token: {}", err), | ||
//! } | ||
//! # } | ||
//! ``` | ||
//! | ||
//! # Refresh Flow Usage | ||
//! As the `Token` you retrieved previously will only be valid for a certain time, you will have | ||
//! to use the information from the `Token.refresh_token` field to get a new `access_token`. | ||
//! | ||
//! ```test_harness,no_run | ||
//! extern crate hyper; | ||
//! extern crate yup_oauth2 as oauth2; | ||
//! use oauth2::{RefreshFlow, FlowType, RefreshResult}; | ||
//! | ||
//! # #[test] fn refresh() { | ||
//! let mut f = RefreshFlow::new(hyper::Client::new()); | ||
//! let new_token = match *f.refresh_token(FlowType::Device, | ||
//! "my_client_id", "my_secret", | ||
//! "my_refresh_token") { | ||
//! RefreshResult::Success(ref t) => t, | ||
//! _ => panic!("bad luck ;)") | ||
//! }; | ||
//! # } | ||
//! ``` | ||
extern crate chrono; | ||
|
||
#[macro_use] | ||
extern crate hyper; | ||
#[macro_use] | ||
extern crate log; | ||
#[cfg(test)] #[macro_use] | ||
extern crate yup_hyper_mock as hyper_mock; | ||
extern crate mime; | ||
extern crate url; | ||
extern crate time; | ||
extern crate itertools; | ||
extern crate serde; | ||
|
||
|
||
mod device; | ||
mod refresh; | ||
mod common; | ||
mod helper; | ||
|
||
pub use device::{DeviceFlow, PollInformation, PollError}; | ||
pub use refresh::{RefreshFlow, RefreshResult}; | ||
pub use common::{Token, FlowType, ApplicationSecret, ConsoleApplicationSecret, Scheme, TokenType}; | ||
pub use helper::{TokenStorage, NullStorage, MemoryStorage, Authenticator, | ||
AuthenticatorDelegate, Retry, DefaultAuthenticatorDelegate, GetToken}; |