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}