Skip to main content

neuron_auth_oidc/
lib.rs

1#![deny(missing_docs)]
2//! Stub OIDC client credentials / token exchange auth provider.
3//!
4//! This crate provides the correct trait impl shape for an OIDC auth provider.
5//! The actual OIDC integration is not implemented — all provide calls return
6//! `AuthError::BackendError`.
7
8use async_trait::async_trait;
9use neuron_auth::{AuthError, AuthProvider, AuthRequest, AuthToken};
10
11/// Stub for OIDC client credentials / token exchange.
12pub struct OidcAuthProvider {
13    _issuer_url: String,
14}
15
16impl OidcAuthProvider {
17    /// Create a new OIDC auth provider (stub).
18    pub fn new(issuer_url: impl Into<String>) -> Self {
19        Self {
20            _issuer_url: issuer_url.into(),
21        }
22    }
23}
24
25#[async_trait]
26impl AuthProvider for OidcAuthProvider {
27    async fn provide(&self, _request: &AuthRequest) -> Result<AuthToken, AuthError> {
28        Err(AuthError::BackendError("OidcAuthProvider is a stub".into()))
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    use std::sync::Arc;
36
37    fn _assert_send_sync<T: Send + Sync>() {}
38
39    #[test]
40    fn object_safety() {
41        _assert_send_sync::<Box<dyn AuthProvider>>();
42        _assert_send_sync::<Arc<dyn AuthProvider>>();
43        let _: Arc<dyn AuthProvider> =
44            Arc::new(OidcAuthProvider::new("https://issuer.example.com"));
45    }
46
47    #[tokio::test]
48    async fn returns_stub_error() {
49        let provider = OidcAuthProvider::new("https://issuer.example.com");
50        let err = provider.provide(&AuthRequest::new()).await.unwrap_err();
51        assert!(matches!(err, AuthError::BackendError(_)));
52        assert!(err.to_string().contains("stub"));
53    }
54}