use axess_factors::oauth::OAuthProviderConfig;
pub fn oauth_discovery_document(issuer: &str) -> serde_json::Value {
serde_json::json!({
"issuer": issuer,
"authorization_endpoint": format!("{issuer}/authorize"),
"token_endpoint": format!("{issuer}/token"),
"jwks_uri": format!("{issuer}/jwks"),
"userinfo_endpoint": format!("{issuer}/userinfo"),
"response_types_supported": ["code"],
"subject_types_supported": ["public"],
"id_token_signing_alg_values_supported": ["RS256"],
"scopes_supported": ["openid", "email", "profile"],
"token_endpoint_auth_methods_supported": ["client_secret_basic", "client_secret_post"],
"claims_supported": ["sub", "email", "name", "iss", "aud", "exp", "iat", "nonce"],
})
}
pub fn oauth_generate_rsa_keypair() -> (Vec<u8>, serde_json::Value, String) {
use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD};
use rsa::{RsaPrivateKey, pkcs1::EncodeRsaPrivateKey, traits::PublicKeyParts};
let mut rng = rsa::rand_core::OsRng;
let private_key = RsaPrivateKey::new(&mut rng, 2048).unwrap();
let public_key = private_key.to_public_key();
let kid = "test-key-1".to_string();
let private_der = private_key.to_pkcs1_der().unwrap().as_bytes().to_vec();
let jwk = serde_json::json!({
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"kid": kid,
"n": URL_SAFE_NO_PAD.encode(public_key.n().to_bytes_be()),
"e": URL_SAFE_NO_PAD.encode(public_key.e().to_bytes_be()),
});
(private_der, jwk, kid)
}
pub async fn oauth_mount_oidc_endpoints(server: &wiremock::MockServer, jwk: &serde_json::Value) {
use wiremock::{
Mock, ResponseTemplate,
matchers::{method, path},
};
let issuer = server.uri();
Mock::given(method("GET"))
.and(path("/.well-known/openid-configuration"))
.respond_with(ResponseTemplate::new(200).set_body_json(oauth_discovery_document(&issuer)))
.mount(server)
.await;
Mock::given(method("GET"))
.and(path("/jwks"))
.respond_with(
ResponseTemplate::new(200).set_body_json(serde_json::json!({ "keys": [jwk] })),
)
.mount(server)
.await;
}
pub async fn oauth_setup_provider(server: &wiremock::MockServer) -> OAuthProviderConfig {
OAuthProviderConfig::discover(
"test",
&server.uri(),
"test-client-id",
"test-secret",
"http://localhost:3000/callback",
)
.await
.expect("OIDC discovery should succeed")
}