Add aditional oidc endpoint to get user info
This commit is contained in:
parent
46a833cc1d
commit
1565fc0017
1 changed files with 47 additions and 20 deletions
|
|
@ -9,6 +9,8 @@ use axum::http::Uri;
|
||||||
use axum::response::{IntoResponse, Redirect};
|
use axum::response::{IntoResponse, Redirect};
|
||||||
use axum::routing::get;
|
use axum::routing::get;
|
||||||
use axum::{body::Body, error_handling::HandleErrorLayer, response::Response, Router};
|
use axum::{body::Body, error_handling::HandleErrorLayer, response::Response, Router};
|
||||||
|
#[cfg(feature = "oidc")]
|
||||||
|
use axum_oidc::{EmptyAdditionalClaims, OidcClaims};
|
||||||
use service::ServiceError;
|
use service::ServiceError;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use time::Duration;
|
use time::Duration;
|
||||||
|
|
@ -186,9 +188,50 @@ pub async fn login() -> Redirect {
|
||||||
Redirect::to("/")
|
Redirect::to("/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "oidc")]
|
||||||
|
pub async fn auth_info(claims: Option<OidcClaims<EmptyAdditionalClaims>>) -> Response {
|
||||||
|
if let Some(oidc_claims) = claims {
|
||||||
|
let nickname = oidc_claims
|
||||||
|
.nickname()
|
||||||
|
.map(|s| s.iter().next().map(|s| s.1.as_str().to_string()))
|
||||||
|
.unwrap_or_else(|| Some("NickNotSet".to_string()))
|
||||||
|
.unwrap_or_else(|| "NickEmpty".to_string());
|
||||||
|
let body = format!("Hello, {}! ", nickname);
|
||||||
|
Response::builder()
|
||||||
|
.status(200)
|
||||||
|
.body(Body::new(body))
|
||||||
|
.unwrap()
|
||||||
|
} else {
|
||||||
|
Response::builder().status(401).body(Body::empty()).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn start_server<RestState: RestStateDef>(rest_state: RestState) {
|
pub async fn start_server<RestState: RestStateDef>(rest_state: RestState) {
|
||||||
let app = Router::new();
|
let app = Router::new();
|
||||||
|
|
||||||
|
#[cfg(feature = "oidc")]
|
||||||
|
let app = {
|
||||||
|
use axum_oidc::error::MiddlewareError;
|
||||||
|
use axum_oidc::{EmptyAdditionalClaims, OidcAuthLayer, OidcLoginLayer};
|
||||||
|
|
||||||
|
let oidc_login_service = ServiceBuilder::new()
|
||||||
|
.layer(HandleErrorLayer::new(|e: MiddlewareError| async {
|
||||||
|
e.into_response()
|
||||||
|
}))
|
||||||
|
.layer(OidcLoginLayer::<EmptyAdditionalClaims>::new());
|
||||||
|
|
||||||
|
app.route("/authenticate", get(login))
|
||||||
|
.layer(oidc_login_service)
|
||||||
|
.route("/auth-info", get(auth_info))
|
||||||
|
};
|
||||||
|
|
||||||
|
let app = app
|
||||||
|
.nest("/permission", permission::generate_route())
|
||||||
|
.nest("/slot", slot::generate_route())
|
||||||
|
.nest("/sales-person", sales_person::generate_route())
|
||||||
|
.nest("/booking", booking::generate_route())
|
||||||
|
.with_state(rest_state);
|
||||||
|
|
||||||
#[cfg(feature = "oidc")]
|
#[cfg(feature = "oidc")]
|
||||||
let app = {
|
let app = {
|
||||||
use axum_oidc::error::MiddlewareError;
|
use axum_oidc::error::MiddlewareError;
|
||||||
|
|
@ -197,15 +240,9 @@ pub async fn start_server<RestState: RestStateDef>(rest_state: RestState) {
|
||||||
let oidc_config = oidc_config();
|
let oidc_config = oidc_config();
|
||||||
let session_store = MemoryStore::default();
|
let session_store = MemoryStore::default();
|
||||||
let session_layer = SessionManagerLayer::new(session_store)
|
let session_layer = SessionManagerLayer::new(session_store)
|
||||||
.with_secure(false)
|
.with_secure(true)
|
||||||
.with_same_site(SameSite::Lax)
|
.with_same_site(SameSite::Strict)
|
||||||
.with_expiry(Expiry::OnInactivity(Duration::seconds(120)));
|
.with_expiry(Expiry::OnSessionEnd);
|
||||||
|
|
||||||
let oidc_login_service = ServiceBuilder::new()
|
|
||||||
.layer(HandleErrorLayer::new(|e: MiddlewareError| async {
|
|
||||||
e.into_response()
|
|
||||||
}))
|
|
||||||
.layer(OidcLoginLayer::<EmptyAdditionalClaims>::new());
|
|
||||||
|
|
||||||
let oidc_auth_service = ServiceBuilder::new()
|
let oidc_auth_service = ServiceBuilder::new()
|
||||||
.layer(HandleErrorLayer::new(|e: MiddlewareError| async {
|
.layer(HandleErrorLayer::new(|e: MiddlewareError| async {
|
||||||
|
|
@ -223,19 +260,9 @@ pub async fn start_server<RestState: RestStateDef>(rest_state: RestState) {
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
);
|
);
|
||||||
|
|
||||||
app.layer(oidc_login_service)
|
app.layer(oidc_auth_service).layer(session_layer)
|
||||||
.route("/authenticate", get(login))
|
|
||||||
.layer(oidc_auth_service)
|
|
||||||
.layer(session_layer)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let app = app
|
|
||||||
.nest("/permission", permission::generate_route())
|
|
||||||
.nest("/slot", slot::generate_route())
|
|
||||||
.nest("/sales-person", sales_person::generate_route())
|
|
||||||
.nest("/booking", booking::generate_route())
|
|
||||||
.with_state(rest_state);
|
|
||||||
|
|
||||||
let listener = tokio::net::TcpListener::bind(bind_address().as_ref())
|
let listener = tokio::net::TcpListener::bind(bind_address().as_ref())
|
||||||
.await
|
.await
|
||||||
.expect("Could not bind server");
|
.expect("Could not bind server");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue