twapi_ureq/
oauth.rs

1use std::collections::HashMap;
2use twapi_oauth::calc_oauth_header;
3use ureq::{Error, Response};
4
5pub fn get_bearer_token_response(
6    consumer_key: &str,
7    consumer_secret: &str,
8) -> Result<Response, Error> {
9    let key = base64::encode(&format!("{}:{}", consumer_key, consumer_secret));
10    ureq::post("https://api.twitter.com/oauth2/token")
11        .set(
12            "Content-Type",
13            "application/x-www-form-urlencoded;charset=UTF-8",
14        )
15        .set("Authorization", &format!("Basic {}", key))
16        .send_string("grant_type=client_credentials")
17}
18
19pub fn get_bearer_token(consumer_key: &str, consumer_secret: &str) -> Option<String> {
20    match get_bearer_token_response(consumer_key, consumer_secret) {
21        Ok(response) => match response.into_json::<serde_json::Value>() {
22            Ok(json) => match json["access_token"].as_str() {
23                Some(access_token) => Some(access_token.to_string()),
24                None => None,
25            },
26            Err(_) => None,
27        },
28        Err(_) => None,
29    }
30}
31
32pub fn request_token_response(
33    consumer_key: &str,
34    consumer_secret: &str,
35    oauth_callback: &str,
36    x_auth_access_type: Option<&str>,
37) -> Result<Response, Error> {
38    let uri = "https://api.twitter.com/oauth/request_token";
39    let mut header_options = vec![("oauth_callback", oauth_callback)];
40    if let Some(x_auth_access_type) = x_auth_access_type {
41        header_options.push(("x_auth_access_type", x_auth_access_type));
42    }
43    let signed = calc_oauth_header(
44        &format!("{}&", consumer_secret),
45        consumer_key,
46        &header_options,
47        "POST",
48        uri,
49        &vec![],
50    );
51    ureq::post(uri)
52        .set("Authorization", &format!("OAuth {}", signed))
53        .call()
54}
55
56pub fn request_token(
57    consumer_key: &str,
58    consumer_secret: &str,
59    oauth_callback: &str,
60    x_auth_access_type: Option<&str>,
61) -> Result<HashMap<String, String>, Error> {
62    let response = request_token_response(
63        consumer_key,
64        consumer_secret,
65        oauth_callback,
66        x_auth_access_type,
67    )?;
68    Ok(parse_oauth_body(response))
69}
70
71pub fn access_token_response(
72    consumer_key: &str,
73    consumer_secret: &str,
74    oauth_token: &str,
75    oauth_token_secret: &str,
76    oauth_verifier: &str,
77) -> Result<Response, Error> {
78    let uri = "https://api.twitter.com/oauth/access_token";
79    let signed = calc_oauth_header(
80        &format!("{}&{}", consumer_secret, oauth_token_secret),
81        consumer_key,
82        &vec![
83            ("oauth_token", oauth_token),
84            ("oauth_verifier", oauth_verifier),
85        ],
86        "POST",
87        uri,
88        &vec![],
89    );
90    ureq::post(uri)
91        .set("Authorization", &format!("OAuth {}", signed))
92        .call()
93}
94
95pub fn access_token(
96    consumer_key: &str,
97    consumer_secret: &str,
98    oauth_token: &str,
99    oauth_token_secret: &str,
100    oauth_verifier: &str,
101) -> Result<HashMap<String, String>, Error> {
102    let response = access_token_response(
103        consumer_key,
104        consumer_secret,
105        oauth_token,
106        oauth_token_secret,
107        oauth_verifier,
108    )?;
109    Ok(parse_oauth_body(response))
110}
111
112fn parse_oauth_body(response: Response) -> HashMap<String, String> {
113    let mut result = HashMap::new();
114    match response.into_string() {
115        Ok(body) => {
116            for item in body.split("&") {
117                let mut pair = item.split("=");
118                result.insert(
119                    pair.next().unwrap().to_string(),
120                    pair.next().unwrap().to_string(),
121                );
122            }
123        }
124        Err(_) => {}
125    }
126    result
127}