Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fca79b8ee | ||
|
|
3d51aa1e6a |
Generated
+1
-1
@@ -2948,7 +2948,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portal"
|
name = "portal"
|
||||||
version = "0.3.19"
|
version = "0.3.20"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "portal"
|
name = "portal"
|
||||||
version = "0.3.19"
|
version = "0.3.20"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|||||||
+26
-4
@@ -33,6 +33,13 @@ type OidcClient = CoreClient<
|
|||||||
>;
|
>;
|
||||||
|
|
||||||
pub struct Oidc {
|
pub struct Oidc {
|
||||||
|
/// `None` when `KANIDM_URL` is unset: a content-only instance with
|
||||||
|
/// sign-in disabled - auth routes answer 503, everything public
|
||||||
|
/// renders as usual.
|
||||||
|
inner: Option<OidcInner>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OidcInner {
|
||||||
client: OidcClient,
|
client: OidcClient,
|
||||||
http: openidconnect::reqwest::Client,
|
http: openidconnect::reqwest::Client,
|
||||||
}
|
}
|
||||||
@@ -45,7 +52,13 @@ const REDIRECT_KEY: &str = "oidc_post_login_redirect";
|
|||||||
impl Oidc {
|
impl Oidc {
|
||||||
/// Discovers the provider and builds the client from environment:
|
/// Discovers the provider and builds the client from environment:
|
||||||
/// `KANIDM_URL`, `OAUTH2_CLIENT_ID`, `OAUTH2_CLIENT_SECRET`, `PUBLIC_URL`.
|
/// `KANIDM_URL`, `OAUTH2_CLIENT_ID`, `OAUTH2_CLIENT_SECRET`, `PUBLIC_URL`.
|
||||||
|
/// With `KANIDM_URL` unset, sign-in is disabled instead of fatal -
|
||||||
|
/// the shape of a public content instance without a review desk.
|
||||||
pub async fn from_env() -> anyhow::Result<Self> {
|
pub async fn from_env() -> anyhow::Result<Self> {
|
||||||
|
if std::env::var("KANIDM_URL").is_err() {
|
||||||
|
tracing::warn!("KANIDM_URL not set - sign-in disabled on this instance");
|
||||||
|
return Ok(Self { inner: None });
|
||||||
|
}
|
||||||
let kanidm_url = require_env("KANIDM_URL")?;
|
let kanidm_url = require_env("KANIDM_URL")?;
|
||||||
let client_id = require_env("OAUTH2_CLIENT_ID")?;
|
let client_id = require_env("OAUTH2_CLIENT_ID")?;
|
||||||
let client_secret = require_env("OAUTH2_CLIENT_SECRET")?;
|
let client_secret = require_env("OAUTH2_CLIENT_SECRET")?;
|
||||||
@@ -75,7 +88,16 @@ impl Oidc {
|
|||||||
)
|
)
|
||||||
.set_redirect_uri(redirect);
|
.set_redirect_uri(redirect);
|
||||||
|
|
||||||
Ok(Self { client, http })
|
Ok(Self {
|
||||||
|
inner: Some(OidcInner { client, http }),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn configured(&self) -> Result<&OidcInner, HandlerError> {
|
||||||
|
self.inner.as_ref().ok_or((
|
||||||
|
StatusCode::SERVICE_UNAVAILABLE,
|
||||||
|
"sign-in is not configured on this instance".to_string(),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,10 +140,10 @@ pub async fn login(
|
|||||||
session.insert(REDIRECT_KEY, redirect).await.map_err(internal)?;
|
session.insert(REDIRECT_KEY, redirect).await.map_err(internal)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let oidc = state.oidc.configured()?;
|
||||||
let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
|
let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
|
||||||
|
|
||||||
let (auth_url, csrf_state, nonce) = state
|
let (auth_url, csrf_state, nonce) = oidc
|
||||||
.oidc
|
|
||||||
.client
|
.client
|
||||||
.authorize_url(
|
.authorize_url(
|
||||||
CoreAuthenticationFlow::AuthorizationCode,
|
CoreAuthenticationFlow::AuthorizationCode,
|
||||||
@@ -182,7 +204,7 @@ pub async fn callback(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let oidc = &state.oidc;
|
let oidc = state.oidc.configured()?;
|
||||||
let token_response = oidc
|
let token_response = oidc
|
||||||
.client
|
.client
|
||||||
.exchange_code(AuthorizationCode::new(params.code))
|
.exchange_code(AuthorizationCode::new(params.code))
|
||||||
|
|||||||
Reference in New Issue
Block a user