Skip to main content

auth_oidc/
module.rs

1use crate::migrations::AUTH_OIDC_MIGRATIONS;
2use platform_core::AppContext;
3use platform_http::ApiOpenApiRouter;
4use platform_module::{
5    HostLinkedModule, LinkedBinding, LinkedHttpContribution, Module, ModuleHttpMethod,
6    ModuleHttpRoute, ModuleManifest,
7};
8
9pub const MODULE_NAME: &str = "auth-oidc";
10
11pub fn http_routes() -> Vec<ModuleHttpRoute> {
12    vec![
13        ModuleHttpRoute {
14            method: ModuleHttpMethod::Get,
15            path: "/.well-known/openid-configuration".to_owned(),
16            capability: None,
17            display_name: Some("OIDC Provider Metadata".to_owned()),
18            story_title: Some("OIDC Discovery".to_owned()),
19        },
20        ModuleHttpRoute {
21            method: ModuleHttpMethod::Get,
22            path: "/.well-known/jwks.json".to_owned(),
23            capability: None,
24            display_name: Some("OIDC JSON Web Key Set".to_owned()),
25            story_title: Some("OIDC JWKS".to_owned()),
26        },
27        ModuleHttpRoute {
28            method: ModuleHttpMethod::Get,
29            path: "/oauth/authorize".to_owned(),
30            capability: None,
31            display_name: Some("OIDC Authorization".to_owned()),
32            story_title: Some("OIDC Authorization".to_owned()),
33        },
34        ModuleHttpRoute {
35            method: ModuleHttpMethod::Post,
36            path: "/oauth/token".to_owned(),
37            capability: None,
38            display_name: Some("OIDC Token Exchange".to_owned()),
39            story_title: Some("OIDC Token Exchange".to_owned()),
40        },
41    ]
42}
43
44pub fn manifest() -> ModuleManifest {
45    ModuleManifest::builder(MODULE_NAME)
46        .dependencies(vec![auth::module::MODULE_NAME.to_owned()])
47        .http_routes(http_routes())
48        .build()
49}
50
51pub fn merge_http(base: ApiOpenApiRouter) -> ApiOpenApiRouter {
52    base.merge(crate::routes::router())
53}
54
55pub fn binding() -> LinkedBinding {
56    LinkedBinding::builder()
57        .http(LinkedHttpContribution {
58            public_prefixes: &["/.well-known/", "/oauth/"],
59            merge: merge_http,
60        })
61        .build()
62}
63
64pub fn module(_ctx: &AppContext) -> Module {
65    Module::linked(manifest(), binding())
66}
67
68pub fn linked_module() -> HostLinkedModule {
69    HostLinkedModule::linked(MODULE_NAME, manifest, module, AUTH_OIDC_MIGRATIONS)
70}
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75    use platform_module::{ModuleManifestLintSeverity, ModuleSource, lint_module_manifest};
76
77    #[test]
78    fn manifest_declares_oidc_routes() {
79        let manifest = manifest();
80
81        assert_eq!(manifest.name, MODULE_NAME);
82        assert_eq!(manifest.http_routes, http_routes());
83
84        let lints = lint_module_manifest(ModuleSource::Linked, &manifest);
85        assert!(
86            lints
87                .iter()
88                .all(|lint| lint.severity == ModuleManifestLintSeverity::Ok),
89            "auth-oidc manifest should not have warning/error lints: {lints:?}"
90        );
91    }
92}