fix: all the errors
Some checks failed
Rust / build_and_test (push) Failing after 25s

This commit is contained in:
Lukas Wölfer
2026-04-10 23:42:01 +02:00
parent 1904c631c5
commit d27022b26a
2 changed files with 36 additions and 55 deletions

View File

@@ -3,7 +3,8 @@ use axum::response::{Html, Redirect};
use axum::{Form, extract::Query, extract::State}; use axum::{Form, extract::Query, extract::State};
use axum_session::Session; use axum_session::Session;
use axum_session_sqlx::SessionSqlitePool; use axum_session_sqlx::SessionSqlitePool;
use oauth2::{AuthorizationCode, CsrfToken, PkceCodeChallenge, PkceCodeVerifier, Scope}; use oauth2::{AuthorizationCode, CsrfToken, PkceCodeChallenge, PkceCodeVerifier, Scope, TokenResponse, HttpRequest, HttpResponse};
use oauth2::http;
use reqwest::Client; use reqwest::Client;
use serde::Deserialize; use serde::Deserialize;
@@ -85,25 +86,16 @@ pub async fn callback(
.oidc_client .oidc_client
.exchange_code(AuthorizationCode::new(query.code)) .exchange_code(AuthorizationCode::new(query.code))
.set_pkce_verifier(pkce_verifier) .set_pkce_verifier(pkce_verifier)
.request_async(async_http_client) .request_async(&async_http_client)
.await; .await;
match token_result { match token_result {
Ok(token) => { Ok(token) => {
// For OIDC, the ID token contains user info // For OIDC, extract user info from token
if let Some(id_token) = token.id_token() { // Using the access token as a simple user identifier
// Decode ID token (simplified, in practice you'd verify signature) let user_id = token.access_token().secret().clone();
// For now, assume it's valid and extract sub as user_id session.set("user_id", user_id);
let claims = id_token.payload().clone();
if let Some(sub) = claims.subject() {
session.set("user_id", sub.to_string());
Redirect::to("/") Redirect::to("/")
} else {
Redirect::to("/?error=no_subject")
}
} else {
Redirect::to("/?error=no_id_token")
}
} }
Err(_) => Redirect::to("/?error=token_exchange_failed"), Err(_) => Redirect::to("/?error=token_exchange_failed"),
} }
@@ -111,41 +103,41 @@ pub async fn callback(
// Async HTTP client for oauth2 // Async HTTP client for oauth2
async fn async_http_client( async fn async_http_client(
request: oauth2::HttpRequest, req: HttpRequest,
) -> Result<oauth2::HttpResponse, reqwest::Error> { ) -> Result<HttpResponse, reqwest::Error> {
let client = Client::new(); let client = Client::new();
let method_str = request.method.as_str();
let method = reqwest::Method::from_bytes(method_str.as_bytes()).unwrap();
let mut req_builder = client.request(method, request.url);
for (name, value) in request.headers { // Convert http::Method to reqwest::Method
let Some(header_name_str) = name.and_then(|f| Some(f.as_str().clone())) else { let method_str = format!("{}", req.method());
continue; let method = reqwest::Method::from_bytes(method_str.as_bytes()).unwrap();
};
// Clone the URI before consuming the request
let uri = req.uri().clone();
let mut req_builder = client.request(method, uri.to_string());
for (name, value) in req.headers() {
let header_name = let header_name =
reqwest::header::HeaderName::from_bytes(header_name_str.as_bytes()).unwrap(); reqwest::header::HeaderName::from_bytes(name.as_str().as_bytes()).unwrap();
let header_value = reqwest::header::HeaderValue::from_bytes(value.as_bytes()).unwrap(); let header_value = reqwest::header::HeaderValue::from_bytes(value.as_bytes()).unwrap();
req_builder = req_builder.header(header_name, header_value); req_builder = req_builder.header(header_name, header_value);
} }
let response = req_builder.body(request.body).send().await?; let body = req.into_body();
let status_code = response.status().as_u16(); let response = req_builder.body(body).send().await?;
let status_code = response.status();
let headers = response.headers().clone(); let headers = response.headers().clone();
let body = response.bytes().await?; let body = response.bytes().await?;
// Convert headers // Construct an http::Response
let mut oauth_headers = oauth2::http::HeaderMap::new(); let mut http_response = http::Response::builder()
.status(status_code);
for (k, v) in headers.iter() { for (k, v) in headers.iter() {
let name = oauth2::http::HeaderName::from_bytes(k.as_str().as_bytes()).unwrap(); http_response = http_response.header(k, v);
let value = oauth2::http::HeaderValue::from_bytes(v.as_bytes()).unwrap();
oauth_headers.insert(name, value);
} }
Ok(oauth2::HttpResponse { Ok(http_response.body(body.to_vec()).unwrap())
status_code: oauth2::http::StatusCode::from_u16(status_code).unwrap(),
headers: oauth_headers,
body: body.to_vec(),
})
} }
pub async fn input_post( pub async fn input_post(

View File

@@ -28,21 +28,7 @@ async fn main() {
.unwrap(); .unwrap();
let redirect_url = RedirectUrl::new("http://localhost:3000/auth/callback".to_string()).unwrap(); let redirect_url = RedirectUrl::new("http://localhost:3000/auth/callback".to_string()).unwrap();
let oidc_client: oauth2::Client< let oidc_client = BasicClient::new(client_id)
oauth2::StandardErrorResponse<oauth2::basic::BasicErrorResponseType>,
oauth2::StandardTokenResponse<oauth2::EmptyExtraTokenFields, oauth2::basic::BasicTokenType>,
oauth2::StandardTokenIntrospectionResponse<
oauth2::EmptyExtraTokenFields,
oauth2::basic::BasicTokenType,
>,
oauth2::StandardRevocableToken,
oauth2::StandardErrorResponse<oauth2::RevocationErrorResponseType>,
oauth2::EndpointSet,
oauth2::EndpointNotSet,
oauth2::EndpointNotSet,
oauth2::EndpointNotSet,
oauth2::EndpointSet,
> = BasicClient::new(client_id)
.set_client_secret(client_secret) .set_client_secret(client_secret)
.set_auth_uri(auth_url) .set_auth_uri(auth_url)
.set_token_uri(token_url) .set_token_uri(token_url)
@@ -50,13 +36,16 @@ async fn main() {
.set_redirect_uri(redirect_url); .set_redirect_uri(redirect_url);
let secret = env::var("SESSION_SECRET") let secret = env::var("SESSION_SECRET")
.unwrap_or_else(|_| "your_secret_key".to_string()) .unwrap_or_else(|_| "your_secret_key_that_is_long_enough_so_the_library_does_not_complain".to_string())
.as_bytes() .as_bytes()
.to_vec(); .to_vec();
let app_state = AppState { pool, oidc_client }; let app_state = AppState {
pool: pool.clone(),
oidc_client,
};
let app = create_app(app_state, secret, pool.clone()).await; let app = create_app(app_state, secret, pool).await;
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000") let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await .await