Skip to content

Instantly share code, notes, and snippets.

@AregevDev
Created July 9, 2019 12:34
Show Gist options
  • Save AregevDev/cc40ac77a28ff090440a43b646bce647 to your computer and use it in GitHub Desktop.
Save AregevDev/cc40ac77a28ff090440a43b646bce647 to your computer and use it in GitHub Desktop.
use oauth2::reqwest::http_client;
use oauth2::{basic::BasicClient, AuthUrl, AuthorizationCode, ClientId, ClientSecret, CsrfToken, Scope, TokenUrl, TokenResponse};
use std::io::{BufRead, BufReader, Write};
use std::net::TcpListener;
use url::Url;
use serenity::http::Http;
fn main() {
let client = BasicClient::new(
ClientId::new("544523578855391241".to_string()),
Some(ClientSecret::new(
"CxfROdNaJr-X7sv5MG_kBGMIDz5pJAgZ".to_string(),
)),
AuthUrl::new(Url::parse("https://discordapp.com/api/oauth2/authorize").unwrap()),
Some(TokenUrl::new(
Url::parse("https://discordapp.com/api/oauth2/token").unwrap(),
)),
);
let (auth_url, csrf_state) = client
.authorize_url(CsrfToken::new_random)
.add_scope(Scope::new("identify".to_string()))
.add_scope(Scope::new("email".to_string()))
.url();
println!("Browse to URL: {}", auth_url);
let code;
let state;
let token;
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
for stream in listener.incoming() {
if let Ok(stream) = stream {
let mut reader = BufReader::new(&stream);
let mut request_line = String::new();
reader.read_line(&mut request_line).unwrap();
let redirect_url = request_line.split_whitespace().nth(1).unwrap();
let url = Url::parse(&("http://localhost".to_string() + redirect_url)).unwrap();
let code_pair = url
.query_pairs()
.find(|pair| {
let &(ref key, _) = pair;
key == "code"
})
.unwrap();
let (_, value) = code_pair;
code = AuthorizationCode::new(value.into_owned());
let state_pair = url
.query_pairs()
.find(|pair| {
let &(ref key, _) = pair;
key == "state"
})
.unwrap();
let (_, value) = state_pair;
state = CsrfToken::new(value.into_owned());
token = client.exchange_code(code).request(http_client).unwrap();
let http = Http::new_with_token(format!("Bearer {}", token.access_token().secret()).as_str());
let name = http.get_current_user().unwrap().name;
let email = http.get_current_user().unwrap().email.unwrap();
let discriminator = http.get_current_user().unwrap().discriminator;
println!("{}#{}", name, discriminator);
println!("{}", email);
}
break;
}
}
@AngelOnFira
Copy link

Thanks for this example!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment