ldap-rest 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +48 -0
  3. package/bin/cleanup-external-users.mjs +219 -0
  4. package/bin/index.mjs +54 -0
  5. package/bin/sync-james.mjs +190 -0
  6. package/dist/abstract/ldapFlat.js +1 -0
  7. package/dist/abstract/plugin.js +1 -0
  8. package/dist/abstract/twakePlugin.js +1 -0
  9. package/dist/bin/index.js +1 -0
  10. package/dist/config/args.js +1 -0
  11. package/dist/lib/auth/base.js +1 -0
  12. package/dist/lib/authz/base.js +1 -0
  13. package/dist/lib/expressFormatedResponses.js +1 -0
  14. package/dist/lib/ldapActions.js +1 -0
  15. package/dist/lib/parseConfig.js +1 -0
  16. package/dist/lib/utils.js +1 -0
  17. package/dist/logger/winston.js +1 -0
  18. package/dist/plugins/auth/authzLinid1.js +1 -0
  19. package/dist/plugins/auth/authzPerBranch.js +1 -0
  20. package/dist/plugins/auth/crowdsec.js +1 -0
  21. package/dist/plugins/auth/llng.js +1 -0
  22. package/dist/plugins/auth/openidconnect.js +1 -0
  23. package/dist/plugins/auth/rateLimit.js +1 -0
  24. package/dist/plugins/auth/token.js +1 -0
  25. package/dist/plugins/configApi.js +1 -0
  26. package/dist/plugins/demo/helloworld.js +1 -0
  27. package/dist/plugins/ldap/bulkImport.js +1 -0
  28. package/dist/plugins/ldap/departmentSync.js +1 -0
  29. package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
  30. package/dist/plugins/ldap/flatGeneric.js +1 -0
  31. package/dist/plugins/ldap/groups.js +1 -0
  32. package/dist/plugins/ldap/onChange.js +1 -0
  33. package/dist/plugins/ldap/organization.js +1 -0
  34. package/dist/plugins/ldap/trash.js +1 -0
  35. package/dist/plugins/priority.json.js +1 -0
  36. package/dist/plugins/static.js +1 -0
  37. package/dist/plugins/twake/calendarResources.js +1 -0
  38. package/dist/plugins/twake/james.js +1 -0
  39. package/dist/plugins/weblogs.js +1 -0
  40. package/dist/src/abstract/ldapFlat.d.ts +94 -0
  41. package/dist/src/abstract/plugin.d.ts +43 -0
  42. package/dist/src/abstract/twakePlugin.d.ts +90 -0
  43. package/dist/src/bin/index.d.ts +43 -0
  44. package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
  45. package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
  46. package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
  47. package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
  48. package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
  49. package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
  50. package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
  51. package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
  52. package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
  53. package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
  54. package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
  55. package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
  56. package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
  57. package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
  58. package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
  59. package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
  60. package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
  61. package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
  62. package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
  63. package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
  64. package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
  65. package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
  66. package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
  67. package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
  68. package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
  69. package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
  70. package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
  71. package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
  72. package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
  73. package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
  74. package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
  75. package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
  76. package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
  77. package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
  78. package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
  79. package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
  80. package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
  81. package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
  82. package/dist/src/browser/shared/components/Modal.d.ts +38 -0
  83. package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
  84. package/dist/src/browser/shared/index.d.ts +10 -0
  85. package/dist/src/browser/shared/types/index.d.ts +65 -0
  86. package/dist/src/browser/shared/utils/dom.d.ts +33 -0
  87. package/dist/src/browser/shared/utils/form.d.ts +28 -0
  88. package/dist/src/browser/shared/utils/schema.d.ts +29 -0
  89. package/dist/src/config/args.d.ts +128 -0
  90. package/dist/src/config/schema.d.ts +18 -0
  91. package/dist/src/hooks.d.ts +76 -0
  92. package/dist/src/lib/auth/base.d.ts +9 -0
  93. package/dist/src/lib/authz/base.d.ts +63 -0
  94. package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
  95. package/dist/src/lib/ldapActions.d.ts +91 -0
  96. package/dist/src/lib/parseConfig.d.ts +23 -0
  97. package/dist/src/lib/utils.d.ts +73 -0
  98. package/dist/src/logger/winston.d.ts +3 -0
  99. package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
  100. package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
  101. package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
  102. package/dist/src/plugins/auth/llng.d.ts +8 -0
  103. package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
  104. package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
  105. package/dist/src/plugins/auth/token.d.ts +17 -0
  106. package/dist/src/plugins/configApi.d.ts +24 -0
  107. package/dist/src/plugins/demo/helloworld.d.ts +12 -0
  108. package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
  109. package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
  110. package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
  111. package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
  112. package/dist/src/plugins/ldap/groups.d.ts +95 -0
  113. package/dist/src/plugins/ldap/onChange.d.ts +32 -0
  114. package/dist/src/plugins/ldap/organization.d.ts +65 -0
  115. package/dist/src/plugins/ldap/trash.d.ts +52 -0
  116. package/dist/src/plugins/static.d.ts +7 -0
  117. package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
  118. package/dist/src/plugins/twake/james.d.ts +83 -0
  119. package/dist/src/plugins/weblogs.d.ts +8 -0
  120. package/docs/DEVELOPER_GUIDE.md +298 -0
  121. package/docs/OPENAPI.md +440 -0
  122. package/docs/PLUGIN_DEPENDENCIES.md +612 -0
  123. package/docs/README.md +466 -0
  124. package/docs/api/REFERENCE.md +983 -0
  125. package/docs/api/REST_API.md +1237 -0
  126. package/docs/authentication.md +469 -0
  127. package/docs/authzLinid1.md +521 -0
  128. package/docs/authzPerBranch.md +596 -0
  129. package/docs/browser/LIBRARIES.md +1196 -0
  130. package/docs/examples/EXAMPLES.md +1659 -0
  131. package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
  132. package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
  133. package/docs/jamesTeamMailboxes.md +343 -0
  134. package/docs/ldapBulkImport.md +722 -0
  135. package/docs/ldapExternalUsersInGroups.md +325 -0
  136. package/docs/ldapFlatGeneric.md +444 -0
  137. package/docs/ldapGroups.md +589 -0
  138. package/docs/ldapOrganizations.md +659 -0
  139. package/docs/ldapTrash.md +260 -0
  140. package/docs/linagora.png +0 -0
  141. package/docs/onChange.md +318 -0
  142. package/docs/plugins/DEVELOPMENT.md +1219 -0
  143. package/docs/presenterm-fr.md +721 -0
  144. package/docs/presenterm.md +721 -0
  145. package/docs/schemas/SCHEMAS.md +1212 -0
  146. package/docs/static.md +410 -0
  147. package/docs/twakeCalendarResources.md +148 -0
  148. package/docs/twakeJames.md +661 -0
  149. package/docs/weblogs.md +399 -0
  150. package/examples/web/ldap-group-editor.html +113 -0
  151. package/examples/web/ldap-tree-viewer.html +368 -0
  152. package/examples/web/ldap-unit-editor.html +108 -0
  153. package/examples/web/ldap-user-editor.html +412 -0
  154. package/package.json +458 -0
  155. package/static/browser/common-demo.css +450 -0
  156. package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
  157. package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
  158. package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
  159. package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
  160. package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
  161. package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
  162. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
  163. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
  164. package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
  165. package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
  166. package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
  167. package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
  168. package/static/browser/ldap-group-editor/index.js +2 -0
  169. package/static/browser/ldap-group-editor/index.js.map +1 -0
  170. package/static/browser/ldap-group-editor/types.js +2 -0
  171. package/static/browser/ldap-group-editor/types.js.map +1 -0
  172. package/static/browser/ldap-group-editor.esm.js +1399 -0
  173. package/static/browser/ldap-group-editor.esm.js.map +1 -0
  174. package/static/browser/ldap-group-editor.js +1407 -0
  175. package/static/browser/ldap-group-editor.js.map +1 -0
  176. package/static/browser/ldap-group-editor.min.js +2 -0
  177. package/static/browser/ldap-group-editor.min.js.map +1 -0
  178. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
  179. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
  180. package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
  181. package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
  182. package/static/browser/ldap-resource-editor/index.js +2 -0
  183. package/static/browser/ldap-resource-editor/index.js.map +1 -0
  184. package/static/browser/ldap-resource-editor/types.js +2 -0
  185. package/static/browser/ldap-resource-editor/types.js.map +1 -0
  186. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
  187. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
  188. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
  189. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
  190. package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
  191. package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
  192. package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
  193. package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
  194. package/static/browser/ldap-tree-viewer/index.js +2 -0
  195. package/static/browser/ldap-tree-viewer/index.js.map +1 -0
  196. package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
  197. package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
  198. package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
  199. package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
  200. package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
  201. package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
  202. package/static/browser/ldap-tree-viewer/types.js +2 -0
  203. package/static/browser/ldap-tree-viewer/types.js.map +1 -0
  204. package/static/browser/ldap-tree-viewer.css +2 -0
  205. package/static/browser/ldap-tree-viewer.css.map +1 -0
  206. package/static/browser/ldap-tree-viewer.esm.js +606 -0
  207. package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
  208. package/static/browser/ldap-tree-viewer.js +614 -0
  209. package/static/browser/ldap-tree-viewer.js.map +1 -0
  210. package/static/browser/ldap-tree-viewer.min.js +2 -0
  211. package/static/browser/ldap-tree-viewer.min.js.map +1 -0
  212. package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
  213. package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
  214. package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
  215. package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
  216. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
  217. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
  218. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
  219. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
  220. package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
  221. package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
  222. package/static/browser/ldap-unit-editor/index.js +2 -0
  223. package/static/browser/ldap-unit-editor/index.js.map +1 -0
  224. package/static/browser/ldap-unit-editor/types.js +2 -0
  225. package/static/browser/ldap-unit-editor/types.js.map +1 -0
  226. package/static/browser/ldap-unit-editor.esm.js +1013 -0
  227. package/static/browser/ldap-unit-editor.esm.js.map +1 -0
  228. package/static/browser/ldap-unit-editor.js +1021 -0
  229. package/static/browser/ldap-unit-editor.js.map +1 -0
  230. package/static/browser/ldap-unit-editor.min.js +2 -0
  231. package/static/browser/ldap-unit-editor.min.js.map +1 -0
  232. package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
  233. package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
  234. package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
  235. package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
  236. package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
  237. package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
  238. package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
  239. package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
  240. package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
  241. package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
  242. package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
  243. package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
  244. package/static/browser/ldap-user-editor/components/UserList.js +181 -0
  245. package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
  246. package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
  247. package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
  248. package/static/browser/ldap-user-editor/index.js +2 -0
  249. package/static/browser/ldap-user-editor/index.js.map +1 -0
  250. package/static/browser/ldap-user-editor/types.js +2 -0
  251. package/static/browser/ldap-user-editor/types.js.map +1 -0
  252. package/static/browser/ldap-user-editor.css +2 -0
  253. package/static/browser/ldap-user-editor.css.map +1 -0
  254. package/static/browser/ldap-user-editor.esm.js +1897 -0
  255. package/static/browser/ldap-user-editor.esm.js.map +1 -0
  256. package/static/browser/ldap-user-editor.js +1905 -0
  257. package/static/browser/ldap-user-editor.js.map +1 -0
  258. package/static/browser/ldap-user-editor.min.js +2 -0
  259. package/static/browser/ldap-user-editor.min.js.map +1 -0
  260. package/static/browser/shared/components/Modal.js +121 -0
  261. package/static/browser/shared/components/Modal.js.map +1 -0
  262. package/static/browser/shared/components/StatusMessage.js +119 -0
  263. package/static/browser/shared/components/StatusMessage.js.map +1 -0
  264. package/static/browser/shared/index.js +7 -0
  265. package/static/browser/shared/index.js.map +1 -0
  266. package/static/browser/shared/types/index.js +37 -0
  267. package/static/browser/shared/types/index.js.map +1 -0
  268. package/static/browser/shared/utils/dom.js +78 -0
  269. package/static/browser/shared/utils/dom.js.map +1 -0
  270. package/static/browser/shared/utils/form.js +234 -0
  271. package/static/browser/shared/utils/form.js.map +1 -0
  272. package/static/browser/shared/utils/schema.js +121 -0
  273. package/static/browser/shared/utils/schema.js.map +1 -0
  274. package/static/browser/shared.esm.js +694 -0
  275. package/static/browser/shared.esm.js.map +1 -0
  276. package/static/browser/shared.js +723 -0
  277. package/static/browser/shared.js.map +1 -0
  278. package/static/browser/shared.min.js +2 -0
  279. package/static/browser/shared.min.js.map +1 -0
  280. package/static/schemas/ad/computers.json +92 -0
  281. package/static/schemas/ad/groups.json +55 -0
  282. package/static/schemas/ad/organizations.json +66 -0
  283. package/static/schemas/ad/users.json +116 -0
  284. package/static/schemas/standard/devices.json +72 -0
  285. package/static/schemas/standard/groups.json +54 -0
  286. package/static/schemas/standard/organizations.json +49 -0
  287. package/static/schemas/standard/users.json +86 -0
  288. package/static/schemas/twake/groups.json +75 -0
  289. package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
  290. package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
  291. package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
  292. package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
  293. package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
  294. package/static/schemas/twake/organizations.json +52 -0
  295. package/static/schemas/twake/positions.json +32 -0
  296. package/static/schemas/twake/users.json +112 -0
@@ -0,0 +1,469 @@
1
+ # Authentication Plugins
2
+
3
+ LDAP-Rest provides multiple authentication plugins to secure API access. These plugins can be used individually or combined depending on your infrastructure requirements.
4
+
5
+ ## Available Authentication Methods
6
+
7
+ 1. **Token Authentication** (`core/auth/token`) - Simple bearer token authentication
8
+ 2. **LemonLDAP::NG** (`core/auth/llng`) - Integration with LemonLDAP::NG SSO
9
+ 3. **OpenID Connect** (`core/auth/openidconnect`) - OAuth 2.0 / OpenID Connect authentication
10
+ 4. **Authorization Per Branch** (`core/auth/authzPerBranch`) - Branch-level access control (see [authzPerBranch.md](authzPerBranch.md))
11
+
12
+ ## Token Authentication
13
+
14
+ Simple stateless authentication using bearer tokens.
15
+
16
+ ### Configuration
17
+
18
+ #### Basic Configuration
19
+
20
+ ```bash
21
+ --plugin core/auth/token \
22
+ --auth-token "secret-token-1" \
23
+ --auth-token "secret-token-2" \
24
+ --auth-token "secret-token-3"
25
+ ```
26
+
27
+ **Environment Variable:**
28
+
29
+ ```bash
30
+ DM_AUTH_TOKENS="token1,token2,token3"
31
+ ```
32
+
33
+ #### Named Tokens (Recommended)
34
+
35
+ Associate a descriptive name with each token for better logging and audit trails:
36
+
37
+ ```bash
38
+ --plugin core/auth/token \
39
+ --auth-token "9f8e7d6c5b4a:web-application" \
40
+ --auth-token "1a2b3c4d5e6f:monitoring-service" \
41
+ --auth-token "f1e2d3c4b5a6:backup-scripts"
42
+ ```
43
+
44
+ **Environment Variable:**
45
+
46
+ ```bash
47
+ DM_AUTH_TOKENS="9f8e7d6c5b4a:web-application,1a2b3c4d5e6f:monitoring-service,f1e2d3c4b5a6:backup-scripts"
48
+ ```
49
+
50
+ **Syntax:** `token:name`
51
+
52
+ - Token value comes first (the secret)
53
+ - Colon `:` separator
54
+ - Name comes second (descriptive identifier)
55
+
56
+ ### Usage
57
+
58
+ Include the token in the `Authorization` header:
59
+
60
+ ```bash
61
+ curl -H "Authorization: Bearer 9f8e7d6c5b4a" \
62
+ http://localhost:8081/api/v1/ldap/users
63
+ ```
64
+
65
+ ### How It Works
66
+
67
+ 1. Extracts token from `Authorization: Bearer <token>` header
68
+ 2. Validates token against configured list
69
+ 3. Sets `req.user` to the token's name (e.g., `"web-application"`) or `"token {index}"` for unnamed tokens
70
+ 4. Returns 401 Unauthorized if token is missing or invalid
71
+
72
+ **Named tokens in logs:**
73
+
74
+ ```
75
+ INFO: Request from user: web-application
76
+ INFO: Request from user: monitoring-service
77
+ ```
78
+
79
+ **Unnamed tokens in logs (backward compatible):**
80
+
81
+ ```
82
+ INFO: Request from user: token 0
83
+ INFO: Request from user: token 1
84
+ ```
85
+
86
+ ### Use Cases
87
+
88
+ - **Development/Testing**: Quick authentication without complex setup
89
+ - **Service-to-Service**: API access for backend services
90
+ - **CI/CD Pipelines**: Automated scripts and deployments
91
+ - **Simple Deployments**: Small teams without SSO infrastructure
92
+
93
+ ### Security Considerations
94
+
95
+ - Tokens are static and shared (not user-specific)
96
+ - Use HTTPS in production to protect tokens in transit
97
+ - Rotate tokens regularly
98
+ - Limit token count to necessary services only
99
+ - Consider combining with IP whitelisting
100
+
101
+ ### Example: Multiple Services with Named Tokens
102
+
103
+ ```bash
104
+ # API server configuration with named tokens
105
+ npx ldap-rest \
106
+ --plugin core/auth/token \
107
+ --auth-token "a1b2c3d4e5f6:production-web-app" \
108
+ --auth-token "f6e5d4c3b2a1:prometheus-monitoring" \
109
+ --auth-token "1234567890ab:nightly-backup" \
110
+ --ldap-url ldap://localhost:389 \
111
+ ...
112
+ ```
113
+
114
+ ```bash
115
+ # Web application (logs will show: user: production-web-app)
116
+ curl -H "Authorization: Bearer a1b2c3d4e5f6" \
117
+ http://api/v1/ldap/users
118
+
119
+ # Monitoring system (logs will show: user: prometheus-monitoring)
120
+ curl -H "Authorization: Bearer f6e5d4c3b2a1" \
121
+ http://api/v1/ldap/groups
122
+
123
+ # Backup script (logs will show: user: nightly-backup)
124
+ curl -H "Authorization: Bearer 1234567890ab" \
125
+ http://api/v1/ldap/organizations/top
126
+ ```
127
+
128
+ ### Example: Mixed Named and Unnamed Tokens
129
+
130
+ You can mix named and unnamed tokens for backward compatibility:
131
+
132
+ ```bash
133
+ --auth-token "abc123:production-api" \
134
+ --auth-token "def456" # Unnamed, will be "token 1" in logs \
135
+ --auth-token "ghi789:staging-app"
136
+ ```
137
+
138
+ ## LemonLDAP::NG Authentication
139
+
140
+ Integration with [LemonLDAP::NG](https://lemonldap-ng.org/) (LLNG) Web SSO solution.
141
+
142
+ ### Configuration
143
+
144
+ ```bash
145
+ --plugin core/auth/llng \
146
+ --llng-ini /etc/lemonldap-ng/lemonldap-ng.ini
147
+ ```
148
+
149
+ **Environment Variable:**
150
+
151
+ ```bash
152
+ DM_LLNG_INI="/etc/lemonldap-ng/lemonldap-ng.ini"
153
+ ```
154
+
155
+ ### Prerequisites
156
+
157
+ 1. **LemonLDAP::NG Handler**: The `lemonldap-ng-handler` npm package (optional dependency)
158
+ 2. **LLNG Configuration**: Valid `lemonldap-ng.ini` file
159
+ 3. **Virtual Host Configuration**: LDAP-Rest must be configured as a protected application in LLNG
160
+
161
+ ### How It Works
162
+
163
+ 1. Uses the LemonLDAP::NG Handler to validate requests
164
+ 2. Extracts user identity from `Lm-Remote-User` header
165
+ 3. Sets `req.user` to authenticated username
166
+ 4. Inherits all LLNG authorization rules and features
167
+
168
+ ### Installation
169
+
170
+ Install the optional dependency:
171
+
172
+ ```bash
173
+ npm install lemonldap-ng-handler
174
+ ```
175
+
176
+ ### LLNG Configuration
177
+
178
+ Configure LDAP-Rest as a protected virtual host in LemonLDAP::NG:
179
+
180
+ ```apache
181
+ # In LLNG Manager: Virtual Hosts > api.example.com
182
+ <VirtualHost *:443>
183
+ ServerName api.example.com
184
+
185
+ # LemonLDAP::NG Handler
186
+ PerlHeaderParserHandler Lemonldap::NG::Handler::ApacheMP2
187
+
188
+ # Proxy to LDAP-Rest
189
+ ProxyPass / http://localhost:8081/
190
+ ProxyPassReverse / http://localhost:8081/
191
+ </VirtualHost>
192
+ ```
193
+
194
+ ### Use Cases
195
+
196
+ - **Enterprise SSO**: Centralized authentication for multiple applications
197
+ - **Advanced Authorization**: Fine-grained access control using LLNG rules
198
+ - **Session Management**: Centralized session handling
199
+ - **Multi-Factor Authentication**: MFA support through LLNG
200
+
201
+ ### Example: LLNG Authorization Rules
202
+
203
+ Configure access rules in LLNG Manager:
204
+
205
+ ```perl
206
+ # Allow only HR group to access users endpoint
207
+ $groups =~ /\bhr\b/ and $uri =~ m#^/api/v1/ldap/users#
208
+
209
+ # Allow admins full access
210
+ $groups =~ /\badmins\b/
211
+
212
+ # Allow specific users to manage groups
213
+ $uid eq "groupmanager" and $uri =~ m#^/api/v1/ldap/groups#
214
+ ```
215
+
216
+ ## OpenID Connect Authentication
217
+
218
+ OAuth 2.0 / OpenID Connect authentication for modern identity providers.
219
+
220
+ ### Configuration
221
+
222
+ ```bash
223
+ --plugin core/auth/openidconnect \
224
+ --oidc-server "https://auth.example.com" \
225
+ --oidc-client-id "ldap-rest-client" \
226
+ --oidc-client-secret "client-secret-here" \
227
+ --base-url "https://api.example.com"
228
+ ```
229
+
230
+ **Environment Variables:**
231
+
232
+ ```bash
233
+ DM_OIDC_SERVER="https://auth.example.com"
234
+ DM_OIDC_CLIENT_ID="ldap-rest-client"
235
+ DM_OIDC_CLIENT_SECRET="client-secret-here"
236
+ DM_BASE_URL="https://api.example.com"
237
+ ```
238
+
239
+ ### Prerequisites
240
+
241
+ 1. **OpenID Provider**: [Lemonldap-NG](https://lemonldap-ng.org), Keycloak, Auth0, Okta, Azure AD, etc.
242
+ 2. **Client Registration**: LDAP-Rest registered as OAuth2/OIDC client
243
+ 3. **Optional Dependency**: The `express-openid-connect` npm package
244
+
245
+ ### Installation
246
+
247
+ Install the optional dependency:
248
+
249
+ ```bash
250
+ npm install express-openid-connect
251
+ ```
252
+
253
+ ### How It Works
254
+
255
+ 1. Uses `express-openid-connect` for OAuth2/OIDC flow
256
+ 2. Handles authorization code flow automatically
257
+ 3. Extracts user identity from `sub` claim
258
+ 4. Sets `req.user` to user's subject identifier
259
+ 5. Provides `beforeAuth` and `afterAuth` hooks for customization
260
+
261
+ ### Provider Configuration
262
+
263
+ #### Keycloak
264
+
265
+ ```bash
266
+ --oidc-server "https://keycloak.example.com/realms/master" \
267
+ --oidc-client-id "ldap-rest" \
268
+ --oidc-client-secret "abc123..." \
269
+ --base-url "https://api.example.com"
270
+ ```
271
+
272
+ **Client Settings:**
273
+
274
+ - Access Type: `confidential`
275
+ - Valid Redirect URIs: `https://api.example.com/callback`
276
+ - Standard Flow Enabled: `ON`
277
+
278
+ #### Auth0
279
+
280
+ ```bash
281
+ --oidc-server "https://tenant.auth0.com" \
282
+ --oidc-client-id "your-client-id" \
283
+ --oidc-client-secret "your-client-secret" \
284
+ --base-url "https://api.example.com"
285
+ ```
286
+
287
+ #### Azure AD
288
+
289
+ ```bash
290
+ --oidc-server "https://login.microsoftonline.com/{tenant-id}/v2.0" \
291
+ --oidc-client-id "application-id" \
292
+ --oidc-client-secret "client-secret" \
293
+ --base-url "https://api.example.com"
294
+ ```
295
+
296
+ ### Scopes
297
+
298
+ Default scopes requested:
299
+
300
+ - `openid` - Basic OpenID Connect
301
+ - `profile` - User profile information
302
+ - `email` - User email address
303
+
304
+ ### Hooks
305
+
306
+ The OpenID Connect plugin supports custom hooks:
307
+
308
+ #### beforeAuth Hook
309
+
310
+ Called before authentication processing:
311
+
312
+ ```javascript
313
+ hooks: {
314
+ beforeAuth: async ([req, res]) => {
315
+ // Custom pre-authentication logic
316
+ console.log('Authentication attempt from:', req.ip);
317
+ return [req, res];
318
+ };
319
+ }
320
+ ```
321
+
322
+ #### afterAuth Hook
323
+
324
+ Called after successful authentication:
325
+
326
+ ```javascript
327
+ hooks: {
328
+ afterAuth: async ([req, res]) => {
329
+ // Access OIDC user data
330
+ const user = req.oidc.user;
331
+ console.log('User authenticated:', user.email);
332
+
333
+ // Add custom user properties
334
+ req.customData = {
335
+ email: user.email,
336
+ name: user.name,
337
+ };
338
+
339
+ return [req, res];
340
+ };
341
+ }
342
+ ```
343
+
344
+ ### Use Cases
345
+
346
+ - **Modern Identity Providers**: Integration with cloud identity services
347
+ - **Social Login**: Google, Microsoft, GitHub authentication
348
+ - **Multi-Tenant Applications**: Different OIDC providers per tenant
349
+ - **Standards-Based**: Portable across OIDC-compliant providers
350
+
351
+ ## Choosing an Authentication Method
352
+
353
+ | Feature | Token | LemonLDAP::NG | OpenID Connect |
354
+ | ---------------------- | ------------- | --------------------- | -------------------------------- |
355
+ | **Setup Complexity** | Simple | Medium | Medium |
356
+ | **User Management** | None | External (LLNG) | External (Provider) |
357
+ | **SSO Support** | No | Yes | Yes |
358
+ | **MFA Support** | No | Yes (via LLNG) | Yes (via Provider) |
359
+ | **Session Management** | Stateless | LLNG Sessions | OIDC Sessions |
360
+ | **Best For** | APIs, Scripts | Enterprises with LLNG | Cloud/SaaS, Enterprises with SSO |
361
+ | **Dependencies** | None | lemonldap-ng-handler | express-openid-connect |
362
+
363
+ ## Combining with Authorization
364
+
365
+ All authentication plugins set `req.user` to the authenticated identity. You can use hooks to implement custom authorization:
366
+
367
+ ```javascript
368
+ hooks: {
369
+ afterAuth: async ([req, res]) => {
370
+ // Check if user can access this endpoint
371
+ if (req.path.startsWith('/api/v1/ldap/users') && !isAdmin(req.user)) {
372
+ throw new Error('Forbidden: Admin access required');
373
+ }
374
+ return [req, res];
375
+ };
376
+ }
377
+ ```
378
+
379
+ ## Testing Authentication
380
+
381
+ ### Token Authentication
382
+
383
+ ```bash
384
+ # Valid request
385
+ curl -H "Authorization: Bearer valid-token" \
386
+ http://localhost:8081/api/v1/ldap/users
387
+
388
+ # Invalid token
389
+ curl -H "Authorization: Bearer invalid-token" \
390
+ http://localhost:8081/api/v1/ldap/users
391
+ # Returns: 401 Unauthorized
392
+
393
+ # Missing header
394
+ curl http://localhost:8081/api/v1/ldap/users
395
+ # Returns: 401 Unauthorized
396
+ ```
397
+
398
+ ### LemonLDAP::NG
399
+
400
+ Access through LLNG portal - authentication is handled by LLNG infrastructure.
401
+
402
+ ### OpenID Connect
403
+
404
+ Navigate to API in browser - will redirect to OIDC provider login page, then return with authenticated session.
405
+
406
+ ## Troubleshooting
407
+
408
+ ### Token Authentication
409
+
410
+ **Problem:** 401 Unauthorized despite correct token
411
+
412
+ **Solutions:**
413
+
414
+ 1. Ensure `Authorization: Bearer {token}` format (not just the token)
415
+ 2. Check token is in configured list
416
+ 3. Verify no whitespace in token
417
+ 4. Check server logs for token mismatch
418
+
419
+ ### LemonLDAP::NG
420
+
421
+ **Problem:** Handler not found
422
+
423
+ **Solution:** Install optional dependency:
424
+
425
+ ```bash
426
+ npm install lemonldap-ng-handler
427
+ ```
428
+
429
+ **Problem:** authentication refused
430
+
431
+ **Solutions:**
432
+
433
+ 1. Verify LLNG handler is configured correctly
434
+ 2. Check virtual host configuration
435
+ 3. Review LLNG access logs
436
+
437
+ ### OpenID Connect
438
+
439
+ **Problem:** express-openid-connect not found
440
+
441
+ **Solution:** Install optional dependency:
442
+
443
+ ```bash
444
+ npm install express-openid-connect
445
+ ```
446
+
447
+ **Problem:** Missing config parameter
448
+
449
+ **Solution:** Ensure all required parameters are set:
450
+
451
+ - `--oidc-server`
452
+ - `--oidc-client-id`
453
+ - `--oidc-client-secret`
454
+ - `--base-url`
455
+
456
+ **Problem:** Redirect loop
457
+
458
+ **Solutions:**
459
+
460
+ 1. Set a long secret, shorts are refused by `openid-client`
461
+ 2. Verify `--base-url` matches actual public URL
462
+ 3. Check redirect URI in provider matches `{base-url}/callback`
463
+ 4. Ensure HTTPS in production (many providers require it)
464
+
465
+ ## See Also
466
+
467
+ - [LemonLDAP::NG Documentation](https://lemonldap-ng.org/documentation)
468
+ - [OpenID Connect Specification](https://openid.net/connect/)
469
+ - [express-openid-connect](https://github.com/auth0/express-openid-connect)