diff --git a/src/controllers/openid_controller.rs b/src/controllers/openid_controller.rs index a957844..a22ed00 100644 --- a/src/controllers/openid_controller.rs +++ b/src/controllers/openid_controller.rs @@ -24,13 +24,27 @@ use crate::data::user::User; use crate::utils::string_utils::rand_str; use crate::utils::time::time; -pub async fn get_configuration(app_conf: web::Data) -> impl Responder { +pub async fn get_configuration(req: HttpRequest, app_conf: web::Data) -> impl Responder { + let is_secure_request = req.headers().get("HTTP_X_FORWARDED_PROTO") + .map(|v| v.to_str().unwrap_or_default().to_lowercase().eq("https")) + .unwrap_or(false); + + let host = match req.headers().get("Host") { + None => return HttpResponse::BadRequest().body("Missing Host header!"), + Some(s) => s.to_str().unwrap_or_default(), + }; + + let curr_origin = format!("{}://{}", match is_secure_request { + true => "https", + false => "http" + }, host); + HttpResponse::Ok().json(OpenIDConfig { issuer: app_conf.website_origin.clone(), authorization_endpoint: app_conf.full_url(AUTHORIZE_URI), - token_endpoint: app_conf.full_url(TOKEN_URI), - userinfo_endpoint: app_conf.full_url(USERINFO_URI), - jwks_uri: app_conf.full_url(CERT_URI), + token_endpoint: curr_origin.clone() + TOKEN_URI, + userinfo_endpoint: curr_origin.clone() + USERINFO_URI, + jwks_uri: curr_origin + CERT_URI, scopes_supported: vec!["openid", "profile", "email"], response_types_supported: vec!["code", "id_token", "token id_token"], subject_types_supported: vec!["public"],