7 Commits

Author SHA1 Message Date
cff947857b chore(deps): update all dependencies
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-01-23 01:54:52 +00:00
63c29999bf feat: update
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: kjuulh <contact@kjuulh.io>
2024-03-30 22:37:23 +01:00
a470122745 feat: adding drone
Some checks failed
continuous-integration/drone/push Build is failing
Signed-off-by: kjuulh <contact@kjuulh.io>
2024-03-30 22:11:42 +01:00
d32d343695 something 2024-03-30 21:59:02 +01:00
251d3922bf something 2024-03-30 21:58:41 +01:00
1b8924e7f6 feat: will trigger login if no cookie is found
Some checks are pending
ci/woodpecker/push/test Pipeline is pending
Signed-off-by: kjuulh <contact@kjuulh.io>
2023-11-30 10:07:27 +01:00
f586d157b1 Merge pull request 'feat/axum-0.7.x - uses breaking changes from axum 0.7.x' (#4) from feat/axum-0.7.x into main
Some checks are pending
ci/woodpecker/push/test Pipeline is pending
Reviewed-on: https://git.front.kjuulh.io/kjuulh/nefarious-login/pulls/4
2023-11-28 10:46:43 +00:00
5 changed files with 636 additions and 670 deletions

2
.drone.yml Normal file
View File

@@ -0,0 +1,2 @@
kind: template
load: cuddle-rust-lib-plan.yaml

View File

@@ -1,34 +0,0 @@
when:
- event: [pull_request, tag]
- event: push
branch:
- main
variables:
- &rust_image 'rustlang/rust:nightly'
steps:
build:
image: *rust_image
group: ci
commands:
- "cargo build"
test:
image: *rust_image
group: ci
commands:
- "cargo test"
lint:
image: *rust_image
group: ci
commands:
- "cargo clippy"
fmt:
image: *rust_image
group: ci
commands:
- "cargo fmt --all --check"

1193
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,10 +13,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] }
clap = { version = "4", features = ["derive", "env"] }
async-trait = { version = "0.1", features = [] }
axum = { version = "0.7.1", features = [
axum = { version = "0.8.0", features = [
"macros",
] }
axum-extra = { version = "0.9.0", features = [
axum-extra = { version = "0.10.0", features = [
"cookie",
"cookie-private",
"typed-header",
@@ -28,17 +28,17 @@ serde = { version = "1", features = ["derive"] }
serde_json = { version = "1" }
uuid = {version = "1.5.0", features = ["v4"]}
sqlx = { version = "0.7", features = [
sqlx = { version = "0.8", features = [
"runtime-tokio",
"postgres",
"migrate",
] }
zitadel = { version = "3.4", features = ["axum"] }
tower = "0.4"
tower-http = { version = "0.4", features = ["cors", "trace"] }
oauth2 = "4.4.2"
openidconnect = "3.4"
zitadel = { version = "5.0", features = ["axum"] }
tower = "0.5"
tower-http = { version = "0.6", features = ["cors", "trace"] }
oauth2 = "5.0.0"
openidconnect = "4.0"
pretty_assertions = "1.4.0"
sealed_test = "1.0.0"

View File

@@ -2,8 +2,8 @@ use std::fmt::Display;
use axum::extract::{FromRef, FromRequestParts, Query, State};
use axum::http::request::Parts;
use axum::http::StatusCode;
use axum::response::{ErrorResponse, IntoResponse, Redirect};
use axum::http::{HeaderMap, StatusCode, Uri};
use axum::response::{ErrorResponse, IntoResponse, Redirect, Response};
use axum::routing::get;
use axum::{async_trait, Json, RequestPartsExt, Router};
@@ -97,13 +97,21 @@ pub struct UserFromSession {
pub static COOKIE_NAME: &str = "SESSION";
pub struct AuthRedirect((HeaderMap, String));
impl IntoResponse for AuthRedirect {
fn into_response(self) -> Response {
(self.0 .0, Redirect::temporary(&self.0 .1.as_str())).into_response()
}
}
#[async_trait]
impl<S> FromRequestParts<S> for UserFromSession
where
AuthService: FromRef<S>,
S: Send + Sync,
{
type Rejection = (StatusCode, &'static str);
type Rejection = AuthRedirect;
async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
let auth_service = AuthService::from_ref(state);
@@ -114,16 +122,21 @@ where
let basic: Option<TypedHeader<Authorization<Basic>>> = parts.extract().await.unwrap();
if let Some(basic) = basic {
let token = auth_service
let token = match auth_service
.login_token(basic.username(), basic.password())
.await
.into_response()
.map_err(|_| {
(
StatusCode::INTERNAL_SERVER_ERROR,
"could not get token from basic",
)
})?;
{
Ok(login) => login,
Err(e) => {
tracing::info!("did not find a basic login token, will trigger login");
let (headers, url) = auth_service
.login(Some(parts.uri.to_string()))
.await
.expect("to be able to request login");
return Err(AuthRedirect((headers, url.to_string())));
}
};
return Ok(UserFromSession {
user: User {
@@ -134,24 +147,32 @@ where
});
}
return Err(anyhow::anyhow!("No session was found"))
.into_response()
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "did not find a cookie"))?;
tracing::info!("did not find a cookie, will trigger login");
let (headers, url) = auth_service
.login(Some(parts.uri.to_string()))
.await
.expect("to be able to request login");
return Err(AuthRedirect((headers, url.to_string())));
}
let session_cookie = session_cookie.unwrap();
// continue to decode the session cookie
let user = auth_service
let user = match auth_service
.get_user_from_session(session_cookie)
.await
.into_response()
.map_err(|_| {
(
StatusCode::INTERNAL_SERVER_ERROR,
"failed to decode session cookie",
)
})?;
{
Ok(user) => user,
Err(_) => {
tracing::info!("could not get user from session, will trigger login");
let (headers, url) = auth_service
.login(Some(parts.uri.to_string()))
.await
.expect("to be able to request login");
return Err(AuthRedirect((headers, url.to_string())));
}
};
Ok(UserFromSession { user })
}