From 64ed9cdfe7b4ba18d81a8733a14c7305e3672de4 Mon Sep 17 00:00:00 2001 From: Denys Konovalov Date: Mon, 9 Aug 2021 21:57:41 +0200 Subject: [PATCH] - fixed wrong Rocket.toml release adress - added userinfo endpoint --- Rocket.toml | 2 +- src/main.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Rocket.toml b/Rocket.toml index 0a3d71a..a054bb3 100644 --- a/Rocket.toml +++ b/Rocket.toml @@ -5,7 +5,7 @@ port = 3000 timetable = { url = "postgres://meincantor:meincantor_password@localhost/meincantor_db" } [release] -address = "192.168.0.12" +address = "localhost" port = 3000 [release.databases] diff --git a/src/main.rs b/src/main.rs index ccc0431..100e0ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,8 @@ use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation} use keycloak::KeycloakError; use rocket::fs::{relative, FileServer}; use rocket::http::Status; +use rocket::response::status; +use rocket::http; use rocket::request::{FromRequest, Outcome, Request}; use std::error::Error; use std::time::{Duration, SystemTime, UNIX_EPOCH}; @@ -234,6 +236,55 @@ async fn get_keycloak_userinfo(token: String) -> Result) -> Result, status::Unauthorized<()>> { + let credentials = credentials.into_inner(); + let keycloak_resp = get_keycloak_token( + credentials.user.clone(), + credentials.password.clone(), + credentials.otp.clone(), + ) + .await; + let mut token = match keycloak_resp { + Ok(token) => Token { + outcome: TokenOutcome { + status: TokenStatus::Success, + info: String::new(), + }, + token: token.access_token, + }, + Err(e) => { + let outcome = match e { + KeycloakError::ReqwestFailure(f) => TokenOutcome { + status: TokenStatus::HttpError, + info: f.to_string(), + }, + KeycloakError::HttpFailure { + status: _s, + body: _b, + text: t, + } => TokenOutcome { + status: TokenStatus::KeycloakError, + info: String::from( + serde_json::from_str(&t[..]) + .unwrap_or_else(|_| json![{"error_description": "No error description"}]) + ["error_description"] + .as_str() + .unwrap(), + ), + }, + }; + Token { + outcome, + token: String::new(), + } + } + }; + + Ok(Json(get_keycloak_userinfo(token.token.clone()).await.unwrap())) +} + + #[post("/", data = "")] async fn login(credentials: Json) -> Json { let credentials = credentials.into_inner(); @@ -491,4 +542,5 @@ fn rocket() -> _ { routes![get_timetable, get_class_timetable], ) .mount("/api/classes", routes![get_classes]) + .mount("/api/userinfo", routes![get_userinfo]) }