Struct DeviceUserTokenBuilder

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

Builder for OAuth device code flow

§Examples

let client = reqwest::Client::builder()
    .redirect(reqwest::redirect::Policy::none())
    .build()?;
let mut builder = DeviceUserTokenBuilder::new("myclientid", vec![Scope::ChatRead, Scope::ChatEdit]);
let code = builder.start(&client).await?;
println!("Please go to {}", code.verification_uri);
let token = builder.wait_for_code(&client, tokio::time::sleep).await?;
println!("Token: {:?}", token);

Implementations§

Source§

impl DeviceUserTokenBuilder

Source

pub fn new(client_id: impl Into<ClientId>, scopes: Vec<Scope>) -> Self

Source

pub fn set_secret(&mut self, secret: Option<ClientSecret>)

Set the client secret, only necessary if you have one

Source

pub fn get_exchange_device_code_request(&self) -> Request<Vec<u8>>

Get the request for getting a DeviceCodeResponse

Source

pub fn parse_exchange_device_code_response( &mut self, response: Response<Vec<u8>>, ) -> Result<&DeviceCodeResponse, RequestParseError>

Parse the response from the device code request

Source

pub async fn start<'a, 's, C>( &'s mut self, http_client: &'a C, ) -> Result<&'s DeviceCodeResponse, DeviceUserTokenExchangeError<C::Error>>
where C: Client,

Available on crate feature client only.

Start the device code flow

§Notes

Use DeviceCodeResponse::verification_uri to get the URL the user needs to visit.

Source

pub fn get_user_token_request(&self) -> Option<Request<Vec<u8>>>

Get the request for getting a TwitchTokenResponse, to be used in UserToken::from_response.

Returns None if there is no device_code

Source

pub async fn wait_for_code<'a, C, Fut>( &mut self, client: &'a C, wait_fn: impl Fn(Duration) -> Fut, ) -> Result<UserToken, DeviceUserTokenExchangeError<C::Error>>
where C: Client, Fut: Future<Output = ()>,

Available on crate feature client only.

Finish the device code flow by waiting for the user to authorize, granting you a token if the user has authorized the app.

Will return DeviceUserTokenExchangeError::Expired if the user has not authorized the app within the expires_in time.

§Examples
let client = reqwest::Client::builder()
    .redirect(reqwest::redirect::Policy::none())
    .build()?;
let mut builder = DeviceUserTokenBuilder::new("myclientid", vec![Scope::ChatRead, Scope::ChatEdit]);
let code = builder.start(&client).await?;
println!("Please go to {}", code.verification_uri);
let token = builder.wait_for_code(&client, tokio::time::sleep).await?;
println!("Token: {:?}", token);
Source

pub async fn try_finish<'a, C>( &self, http_client: &'a C, ) -> Result<UserToken, DeviceUserTokenExchangeError<C::Error>>
where C: Client,

Available on crate feature client only.

Finish the device code flow, granting you a token if the user has authorized the app. Consider using the wait_for_code method instead.

§Notes

Must be called after start and will return an error if not. The error could be that the user has not authorized the app yet, in which case you should wait for interval seconds and try again. To check for this condition, use the is_pending method.

§Examples
let client = reqwest::Client::builder()
    .redirect(reqwest::redirect::Policy::none())
    .build()?;
let code = builder.start(&client).await?;
println!("Please go to {}", code.verification_uri);
let mut interval = tokio::time::interval(std::time::Duration::from_secs(code.interval));
let mut finish = builder.try_finish(&client).await;
while finish.as_ref().is_err_and(|e| e.is_pending()) {
    // wait a bit
    interval.tick().await;
    finish = builder.try_finish(&client).await;
}
let token: UserToken = finish?;

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> 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> 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,

Source§

impl<T> MaybeSendSync for T