OAuthCbClient

Struct OAuthCbClient 

Source
pub struct OAuthCbClient { /* private fields */ }
Expand description

A simple client to manage OAuth2 access tokens and permissions

Implementations§

Source§

impl OAuthCbClient

Source

pub fn new(client_id: &str, client_secret: &str, redirect_url: &str) -> Self

Instantiate a new OAuthCbClient

let client_id = "my_secret_client_id_provided_by_coinbase";
let client_secret = "my_client_secret_provided_by_coinbase";
let redirect_url = "http://localhost:3001";
let oauth_cb_client = OAuthCbClient::new(client_id, client_secret, redirect_url);
  • client_id and client secret are given to you by the API service provider. Store them in a safe place. For instance hardcodding them in the source code is a bad idea.
  • redirect_url is the url you will be asked to access to authenticate. Make sure it is accessible to you.
Examples found in repository?
examples/get_accounts.rs (line 9)
7async fn main() {
8    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
9    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
10        .add_scope("wallet:accounts:read")
11        .authorize_once()
12        .await;
13
14    let cb_client = CbClient::new(&oauth_cb_client);
15    run_list_get_accounts(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
More examples
Hide additional examples
examples/get_fees.rs (line 7)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:transactions:read")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    run_get_transactions_summary(&cb_client).await;
14
15    oauth_cb_client.revoke_access().await;
16}
examples/post_orders.rs (line 7)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:buys:create")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    // run_order_and_cancel(&cb_client).await;
14
15    run_cancel_nonexistent_order(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
examples/get_orders.rs (line 11)
9async fn main() {
10    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
11    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
12        .add_scope("wallet:transactions:read") // NOT wallet:orders:read as CB's doc says.
13        .authorize_once()
14        .await;
15
16    let cb_client = CbClient::new(&oauth_cb_client);
17    run_list_orders(&cb_client).await;
18    run_list_fills(&cb_client).await;
19
20    oauth_cb_client.revoke_access().await;
21}
examples/get_products.rs (line 16)
14async fn main() {
15    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
16    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
17        .add_scope("wallet:user:read")
18        .authorize_once()
19        .await;
20
21    let cb_client = CbClient::new(&oauth_cb_client);
22
23    run_get_bid_ask(&cb_client).await;
24    run_get_product_book(&cb_client).await;
25    run_list_products(&cb_client).await;
26    run_get_product(&cb_client).await;
27    run_get_product_candles(&cb_client).await;
28    run_get_market_trades(&cb_client).await;
29
30    oauth_cb_client.revoke_access().await;
31}
examples/run_all_examples.rs (line 19)
17async fn main() {
18    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
19    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
20        .add_scope("wallet:accounts:read")
21        .add_scope("wallet:transactions:read")
22        .add_scope("wallet:user:read")
23        .authorize_once()
24        .await;
25
26    let cb_client = CbClient::new(&oauth_cb_client);
27
28    run_list_get_accounts(&cb_client).await;
29
30    run_list_orders(&cb_client).await;
31    run_list_fills(&cb_client).await;
32
33    run_get_bid_ask(&cb_client).await;
34    run_get_product_book(&cb_client).await;
35    run_list_products(&cb_client).await;
36    run_get_product(&cb_client).await;
37    run_get_product_candles(&cb_client).await;
38    run_get_market_trades(&cb_client).await;
39    run_get_transactions_summary(&cb_client).await;
40
41    oauth_cb_client.revoke_access().await;
42}
Source

pub fn add_scope(self, scope_description: &str) -> Self

AccessToken are only valid for predifnied scopes.

To add one scope, for instance

oauth_cb_client.add_scope("wallet:transactions:read");

It can be called multiple times to add mutliple scopes. Refer to Coinbase’s documentation for adding the appropriate scopes. As it can be confusing, you may refer to the examples of the current package to find out which ones are needed.

Examples found in repository?
examples/get_accounts.rs (line 10)
7async fn main() {
8    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
9    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
10        .add_scope("wallet:accounts:read")
11        .authorize_once()
12        .await;
13
14    let cb_client = CbClient::new(&oauth_cb_client);
15    run_list_get_accounts(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
More examples
Hide additional examples
examples/get_fees.rs (line 8)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:transactions:read")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    run_get_transactions_summary(&cb_client).await;
14
15    oauth_cb_client.revoke_access().await;
16}
examples/post_orders.rs (line 8)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:buys:create")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    // run_order_and_cancel(&cb_client).await;
14
15    run_cancel_nonexistent_order(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
examples/get_orders.rs (line 12)
9async fn main() {
10    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
11    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
12        .add_scope("wallet:transactions:read") // NOT wallet:orders:read as CB's doc says.
13        .authorize_once()
14        .await;
15
16    let cb_client = CbClient::new(&oauth_cb_client);
17    run_list_orders(&cb_client).await;
18    run_list_fills(&cb_client).await;
19
20    oauth_cb_client.revoke_access().await;
21}
examples/get_products.rs (line 17)
14async fn main() {
15    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
16    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
17        .add_scope("wallet:user:read")
18        .authorize_once()
19        .await;
20
21    let cb_client = CbClient::new(&oauth_cb_client);
22
23    run_get_bid_ask(&cb_client).await;
24    run_get_product_book(&cb_client).await;
25    run_list_products(&cb_client).await;
26    run_get_product(&cb_client).await;
27    run_get_product_candles(&cb_client).await;
28    run_get_market_trades(&cb_client).await;
29
30    oauth_cb_client.revoke_access().await;
31}
examples/run_all_examples.rs (line 20)
17async fn main() {
18    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
19    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
20        .add_scope("wallet:accounts:read")
21        .add_scope("wallet:transactions:read")
22        .add_scope("wallet:user:read")
23        .authorize_once()
24        .await;
25
26    let cb_client = CbClient::new(&oauth_cb_client);
27
28    run_list_get_accounts(&cb_client).await;
29
30    run_list_orders(&cb_client).await;
31    run_list_fills(&cb_client).await;
32
33    run_get_bid_ask(&cb_client).await;
34    run_get_product_book(&cb_client).await;
35    run_list_products(&cb_client).await;
36    run_get_product(&cb_client).await;
37    run_get_product_candles(&cb_client).await;
38    run_get_market_trades(&cb_client).await;
39    run_get_transactions_summary(&cb_client).await;
40
41    oauth_cb_client.revoke_access().await;
42}
Source

pub async fn authorize_once(self) -> Self

Get Tokens from the issuing authority. Returns once it has stored them. Otherwise crashes.

oauth_cb_client.add_scope("wallet:transactions:read")
            .authorize_once().await;

Once, because it does not instantiate a mechanism to renew tokens. So after 2 hours, the tokens will be invalid.

Examples found in repository?
examples/get_accounts.rs (line 11)
7async fn main() {
8    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
9    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
10        .add_scope("wallet:accounts:read")
11        .authorize_once()
12        .await;
13
14    let cb_client = CbClient::new(&oauth_cb_client);
15    run_list_get_accounts(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
More examples
Hide additional examples
examples/get_fees.rs (line 9)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:transactions:read")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    run_get_transactions_summary(&cb_client).await;
14
15    oauth_cb_client.revoke_access().await;
16}
examples/post_orders.rs (line 9)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:buys:create")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    // run_order_and_cancel(&cb_client).await;
14
15    run_cancel_nonexistent_order(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
examples/get_orders.rs (line 13)
9async fn main() {
10    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
11    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
12        .add_scope("wallet:transactions:read") // NOT wallet:orders:read as CB's doc says.
13        .authorize_once()
14        .await;
15
16    let cb_client = CbClient::new(&oauth_cb_client);
17    run_list_orders(&cb_client).await;
18    run_list_fills(&cb_client).await;
19
20    oauth_cb_client.revoke_access().await;
21}
examples/get_products.rs (line 18)
14async fn main() {
15    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
16    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
17        .add_scope("wallet:user:read")
18        .authorize_once()
19        .await;
20
21    let cb_client = CbClient::new(&oauth_cb_client);
22
23    run_get_bid_ask(&cb_client).await;
24    run_get_product_book(&cb_client).await;
25    run_list_products(&cb_client).await;
26    run_get_product(&cb_client).await;
27    run_get_product_candles(&cb_client).await;
28    run_get_market_trades(&cb_client).await;
29
30    oauth_cb_client.revoke_access().await;
31}
examples/run_all_examples.rs (line 23)
17async fn main() {
18    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
19    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
20        .add_scope("wallet:accounts:read")
21        .add_scope("wallet:transactions:read")
22        .add_scope("wallet:user:read")
23        .authorize_once()
24        .await;
25
26    let cb_client = CbClient::new(&oauth_cb_client);
27
28    run_list_get_accounts(&cb_client).await;
29
30    run_list_orders(&cb_client).await;
31    run_list_fills(&cb_client).await;
32
33    run_get_bid_ask(&cb_client).await;
34    run_get_product_book(&cb_client).await;
35    run_list_products(&cb_client).await;
36    run_get_product(&cb_client).await;
37    run_get_product_candles(&cb_client).await;
38    run_get_market_trades(&cb_client).await;
39    run_get_transactions_summary(&cb_client).await;
40
41    oauth_cb_client.revoke_access().await;
42}
Source

pub async fn revoke_access(&self)

Revoke the obtained token

Just to make sure no one can use it afterwards. Note that without calling this function, Coinbase tokens normally expire after 2 hours.

Examples found in repository?
examples/get_accounts.rs (line 17)
7async fn main() {
8    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
9    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
10        .add_scope("wallet:accounts:read")
11        .authorize_once()
12        .await;
13
14    let cb_client = CbClient::new(&oauth_cb_client);
15    run_list_get_accounts(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
More examples
Hide additional examples
examples/get_fees.rs (line 15)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:transactions:read")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    run_get_transactions_summary(&cb_client).await;
14
15    oauth_cb_client.revoke_access().await;
16}
examples/post_orders.rs (line 17)
5async fn main() {
6    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
7    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
8        .add_scope("wallet:buys:create")
9        .authorize_once()
10        .await;
11
12    let cb_client = CbClient::new(&oauth_cb_client);
13    // run_order_and_cancel(&cb_client).await;
14
15    run_cancel_nonexistent_order(&cb_client).await;
16
17    oauth_cb_client.revoke_access().await;
18}
examples/get_orders.rs (line 20)
9async fn main() {
10    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
11    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
12        .add_scope("wallet:transactions:read") // NOT wallet:orders:read as CB's doc says.
13        .authorize_once()
14        .await;
15
16    let cb_client = CbClient::new(&oauth_cb_client);
17    run_list_orders(&cb_client).await;
18    run_list_fills(&cb_client).await;
19
20    oauth_cb_client.revoke_access().await;
21}
examples/get_products.rs (line 30)
14async fn main() {
15    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
16    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
17        .add_scope("wallet:user:read")
18        .authorize_once()
19        .await;
20
21    let cb_client = CbClient::new(&oauth_cb_client);
22
23    run_get_bid_ask(&cb_client).await;
24    run_get_product_book(&cb_client).await;
25    run_list_products(&cb_client).await;
26    run_get_product(&cb_client).await;
27    run_get_product_candles(&cb_client).await;
28    run_get_market_trades(&cb_client).await;
29
30    oauth_cb_client.revoke_access().await;
31}
examples/run_all_examples.rs (line 41)
17async fn main() {
18    let (client_id, client_secret, redirect_url) = utils::get_env_variables();
19    let oauth_cb_client = OAuthCbClient::new(&client_id, &client_secret, &redirect_url)
20        .add_scope("wallet:accounts:read")
21        .add_scope("wallet:transactions:read")
22        .add_scope("wallet:user:read")
23        .authorize_once()
24        .await;
25
26    let cb_client = CbClient::new(&oauth_cb_client);
27
28    run_list_get_accounts(&cb_client).await;
29
30    run_list_orders(&cb_client).await;
31    run_list_fills(&cb_client).await;
32
33    run_get_bid_ask(&cb_client).await;
34    run_get_product_book(&cb_client).await;
35    run_list_products(&cb_client).await;
36    run_get_product(&cb_client).await;
37    run_get_product_candles(&cb_client).await;
38    run_get_market_trades(&cb_client).await;
39    run_get_transactions_summary(&cb_client).await;
40
41    oauth_cb_client.revoke_access().await;
42}

Trait Implementations§

Source§

impl AccessTokenProvider for OAuthCbClient

Returning the access token stored by the OAuthCbClient.

Note that the token might be expired and invalid.

Source§

fn access_token(&self) -> AccessToken

Should return a valid oauth2::AccessToken().

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,