redirect oauth endpoint

This commit is contained in:
Brandon Thomas committed 2021-11-15 02:36:05 -05:00
1 parent 9b2c0edcc5
commit 75aa1f81aa
4 files changed
+94 -7

No files matched your search

@@ -1,2 +1,3 @@
pub mod oauth_begin;
pub mod oauth_begin_redirect;
pub mod oauth_end;
@@ -3,13 +3,14 @@ use actix_web::{HttpRequest, web, HttpResponse, ResponseError, HttpResponseBuild
use crate::ObsGatewayServerState;
use http_server_common::response::response_error_helpers::to_simple_json_error;
use http_server_common::response::response_success_helpers::simple_json_success;
use http_server_common::response::to_json_success_response::to_json_success_response;
use log::info;
use log::warn;
use std::fmt;
use std::sync::Arc;
use twitch_api2::twitch_oauth2::ClientId;
use twitch_oauth2::tokens::UserTokenBuilder;
use twitch_oauth2::{Scope, ClientSecret};
use twitch_api2::twitch_oauth2::ClientId;
use http_server_common::response::to_json_success_response::to_json_success_response;
#[derive(Serialize)]
pub struct OauthBeginEnrollResult {
@@ -41,10 +42,6 @@ impl ResponseError for OauthBeginEnrollError {
};
to_simple_json_error(&error_reason, self.status_code())
//HttpResponseBuilder::new(self.status_code())
// .set_header(header::CONTENT_TYPE, "application/json")
// .body("TODO")
}
}
@@ -54,7 +51,11 @@ pub async fn oauth_begin_enroll(
) -> Result<HttpResponse, OauthBeginEnrollError> {
let redirect_url =
twitch_oauth2::url::Url::parse(&server_state.twitch_oauth_secrets.redirect_url).unwrap();
twitch_oauth2::url::Url::parse(&server_state.twitch_oauth_secrets.redirect_url)
.map_err(|e| {
warn!("Error parsing url: {:?}", e);
OauthBeginEnrollError::ServerError
})?;
let client_id = ClientId::new(&server_state.twitch_oauth_secrets.client_id);
let client_secret = ClientSecret::new(&server_state.twitch_oauth_secrets.client_secret);
@@ -0,0 +1,80 @@
use actix_http::{StatusCode, header};
use actix_web::{HttpRequest, web, HttpResponse, ResponseError, HttpResponseBuilder};
use crate::ObsGatewayServerState;
use http_server_common::response::response_error_helpers::to_simple_json_error;
use http_server_common::response::response_success_helpers::simple_json_success;
use http_server_common::response::to_json_success_response::to_json_success_response;
use log::info;
use log::warn;
use std::fmt;
use std::sync::Arc;
use twitch_api2::twitch_oauth2::ClientId;
use twitch_oauth2::tokens::UserTokenBuilder;
use twitch_oauth2::{Scope, ClientSecret};
#[derive(Serialize)]
pub struct OauthBeginEnrollResult {
redirect_url: String,
}
#[derive(Debug)]
pub enum OauthBeginEnrollError {
ServerError,
}
// NB: Not using DeriveMore since Clion doesn't understand it.
impl fmt::Display for OauthBeginEnrollError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "OauthBeginEnrollError")
}
}
impl ResponseError for OauthBeginEnrollError {
fn status_code(&self) -> StatusCode {
match *self {
Self::ServerError => StatusCode::INTERNAL_SERVER_ERROR,
}
}
fn error_response(&self) -> HttpResponse {
let error_reason = match self {
Self::ServerError => "server error".to_string(),
};
to_simple_json_error(&error_reason, self.status_code())
}
}
pub async fn oauth_begin_enroll_redirect(
http_request: HttpRequest,
server_state: web::Data<Arc<ObsGatewayServerState>>
) -> Result<HttpResponse, OauthBeginEnrollError> {
let redirect_url =
twitch_oauth2::url::Url::parse(&server_state.twitch_oauth_secrets.redirect_url)
.map_err(|e| {
warn!("Error parsing url: {:?}", e);
OauthBeginEnrollError::ServerError
})?;
let client_id = ClientId::new(&server_state.twitch_oauth_secrets.client_id);
let client_secret = ClientSecret::new(&server_state.twitch_oauth_secrets.client_secret);
// TODO: Not all scopes are needed!
let mut builder = UserTokenBuilder::new(client_id, client_secret, redirect_url)
.set_scopes(Scope::all())
.force_verify(true);
let (url, _csrf_token) = builder.generate_url();
let response = OauthBeginEnrollResult {
redirect_url: url.to_string(),
};
let response = to_json_success_response(&response)
.map_err(|_| OauthBeginEnrollError::ServerError)?;
Ok(HttpResponse::Found()
.append_header((header::LOCATION, url.to_string()))
.finish())
}
+5
View File
@@ -49,6 +49,7 @@ use twitch_api2::pubsub;
use twitch_oauth2::tokens::UserTokenBuilder;
use twitch_oauth2::{AppAccessToken, Scope, TwitchToken, tokens::errors::AppAccessTokenError, ClientId, ClientSecret};
use crate::server_state::{ObsGatewayServerState, EnvConfig, TwitchOauthSecrets};
use crate::endpoints::oauth_begin_redirect::oauth_begin_enroll_redirect;
const DEFAULT_BIND_ADDRESS : &'static str = "0.0.0.0:54321";
@@ -314,6 +315,10 @@ pub async fn serve(server_state: ObsGatewayServerState) -> AnyhowResult<()>
.route(web::get().to(oauth_begin_enroll))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/oauth_enroll_redirect")
.route(web::get().to(oauth_begin_enroll_redirect))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/oauth_redirect")
.route(web::get().to(oauth_begin_enroll))
.route(web::head().to(|| HttpResponse::Ok()))