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.
- package/LICENSE +661 -0
- package/README.md +48 -0
- package/bin/cleanup-external-users.mjs +219 -0
- package/bin/index.mjs +54 -0
- package/bin/sync-james.mjs +190 -0
- package/dist/abstract/ldapFlat.js +1 -0
- package/dist/abstract/plugin.js +1 -0
- package/dist/abstract/twakePlugin.js +1 -0
- package/dist/bin/index.js +1 -0
- package/dist/config/args.js +1 -0
- package/dist/lib/auth/base.js +1 -0
- package/dist/lib/authz/base.js +1 -0
- package/dist/lib/expressFormatedResponses.js +1 -0
- package/dist/lib/ldapActions.js +1 -0
- package/dist/lib/parseConfig.js +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/logger/winston.js +1 -0
- package/dist/plugins/auth/authzLinid1.js +1 -0
- package/dist/plugins/auth/authzPerBranch.js +1 -0
- package/dist/plugins/auth/crowdsec.js +1 -0
- package/dist/plugins/auth/llng.js +1 -0
- package/dist/plugins/auth/openidconnect.js +1 -0
- package/dist/plugins/auth/rateLimit.js +1 -0
- package/dist/plugins/auth/token.js +1 -0
- package/dist/plugins/configApi.js +1 -0
- package/dist/plugins/demo/helloworld.js +1 -0
- package/dist/plugins/ldap/bulkImport.js +1 -0
- package/dist/plugins/ldap/departmentSync.js +1 -0
- package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
- package/dist/plugins/ldap/flatGeneric.js +1 -0
- package/dist/plugins/ldap/groups.js +1 -0
- package/dist/plugins/ldap/onChange.js +1 -0
- package/dist/plugins/ldap/organization.js +1 -0
- package/dist/plugins/ldap/trash.js +1 -0
- package/dist/plugins/priority.json.js +1 -0
- package/dist/plugins/static.js +1 -0
- package/dist/plugins/twake/calendarResources.js +1 -0
- package/dist/plugins/twake/james.js +1 -0
- package/dist/plugins/weblogs.js +1 -0
- package/dist/src/abstract/ldapFlat.d.ts +94 -0
- package/dist/src/abstract/plugin.d.ts +43 -0
- package/dist/src/abstract/twakePlugin.d.ts +90 -0
- package/dist/src/bin/index.d.ts +43 -0
- package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
- package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
- package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
- package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
- package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
- package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
- package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
- package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
- package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
- package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
- package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
- package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
- package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
- package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
- package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
- package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
- package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
- package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
- package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
- package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
- package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
- package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
- package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
- package/dist/src/browser/shared/components/Modal.d.ts +38 -0
- package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
- package/dist/src/browser/shared/index.d.ts +10 -0
- package/dist/src/browser/shared/types/index.d.ts +65 -0
- package/dist/src/browser/shared/utils/dom.d.ts +33 -0
- package/dist/src/browser/shared/utils/form.d.ts +28 -0
- package/dist/src/browser/shared/utils/schema.d.ts +29 -0
- package/dist/src/config/args.d.ts +128 -0
- package/dist/src/config/schema.d.ts +18 -0
- package/dist/src/hooks.d.ts +76 -0
- package/dist/src/lib/auth/base.d.ts +9 -0
- package/dist/src/lib/authz/base.d.ts +63 -0
- package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
- package/dist/src/lib/ldapActions.d.ts +91 -0
- package/dist/src/lib/parseConfig.d.ts +23 -0
- package/dist/src/lib/utils.d.ts +73 -0
- package/dist/src/logger/winston.d.ts +3 -0
- package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
- package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
- package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
- package/dist/src/plugins/auth/llng.d.ts +8 -0
- package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
- package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
- package/dist/src/plugins/auth/token.d.ts +17 -0
- package/dist/src/plugins/configApi.d.ts +24 -0
- package/dist/src/plugins/demo/helloworld.d.ts +12 -0
- package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
- package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
- package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
- package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
- package/dist/src/plugins/ldap/groups.d.ts +95 -0
- package/dist/src/plugins/ldap/onChange.d.ts +32 -0
- package/dist/src/plugins/ldap/organization.d.ts +65 -0
- package/dist/src/plugins/ldap/trash.d.ts +52 -0
- package/dist/src/plugins/static.d.ts +7 -0
- package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
- package/dist/src/plugins/twake/james.d.ts +83 -0
- package/dist/src/plugins/weblogs.d.ts +8 -0
- package/docs/DEVELOPER_GUIDE.md +298 -0
- package/docs/OPENAPI.md +440 -0
- package/docs/PLUGIN_DEPENDENCIES.md +612 -0
- package/docs/README.md +466 -0
- package/docs/api/REFERENCE.md +983 -0
- package/docs/api/REST_API.md +1237 -0
- package/docs/authentication.md +469 -0
- package/docs/authzLinid1.md +521 -0
- package/docs/authzPerBranch.md +596 -0
- package/docs/browser/LIBRARIES.md +1196 -0
- package/docs/examples/EXAMPLES.md +1659 -0
- package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
- package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
- package/docs/jamesTeamMailboxes.md +343 -0
- package/docs/ldapBulkImport.md +722 -0
- package/docs/ldapExternalUsersInGroups.md +325 -0
- package/docs/ldapFlatGeneric.md +444 -0
- package/docs/ldapGroups.md +589 -0
- package/docs/ldapOrganizations.md +659 -0
- package/docs/ldapTrash.md +260 -0
- package/docs/linagora.png +0 -0
- package/docs/onChange.md +318 -0
- package/docs/plugins/DEVELOPMENT.md +1219 -0
- package/docs/presenterm-fr.md +721 -0
- package/docs/presenterm.md +721 -0
- package/docs/schemas/SCHEMAS.md +1212 -0
- package/docs/static.md +410 -0
- package/docs/twakeCalendarResources.md +148 -0
- package/docs/twakeJames.md +661 -0
- package/docs/weblogs.md +399 -0
- package/examples/web/ldap-group-editor.html +113 -0
- package/examples/web/ldap-tree-viewer.html +368 -0
- package/examples/web/ldap-unit-editor.html +108 -0
- package/examples/web/ldap-user-editor.html +412 -0
- package/package.json +458 -0
- package/static/browser/common-demo.css +450 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/index.js +2 -0
- package/static/browser/ldap-group-editor/index.js.map +1 -0
- package/static/browser/ldap-group-editor/types.js +2 -0
- package/static/browser/ldap-group-editor/types.js.map +1 -0
- package/static/browser/ldap-group-editor.esm.js +1399 -0
- package/static/browser/ldap-group-editor.esm.js.map +1 -0
- package/static/browser/ldap-group-editor.js +1407 -0
- package/static/browser/ldap-group-editor.js.map +1 -0
- package/static/browser/ldap-group-editor.min.js +2 -0
- package/static/browser/ldap-group-editor.min.js.map +1 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-resource-editor/index.js +2 -0
- package/static/browser/ldap-resource-editor/index.js.map +1 -0
- package/static/browser/ldap-resource-editor/types.js +2 -0
- package/static/browser/ldap-resource-editor/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
- package/static/browser/ldap-tree-viewer/index.js +2 -0
- package/static/browser/ldap-tree-viewer/index.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
- package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
- package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
- package/static/browser/ldap-tree-viewer/types.js +2 -0
- package/static/browser/ldap-tree-viewer/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer.css +2 -0
- package/static/browser/ldap-tree-viewer.css.map +1 -0
- package/static/browser/ldap-tree-viewer.esm.js +606 -0
- package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
- package/static/browser/ldap-tree-viewer.js +614 -0
- package/static/browser/ldap-tree-viewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer.min.js +2 -0
- package/static/browser/ldap-tree-viewer.min.js.map +1 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
- package/static/browser/ldap-unit-editor/index.js +2 -0
- package/static/browser/ldap-unit-editor/index.js.map +1 -0
- package/static/browser/ldap-unit-editor/types.js +2 -0
- package/static/browser/ldap-unit-editor/types.js.map +1 -0
- package/static/browser/ldap-unit-editor.esm.js +1013 -0
- package/static/browser/ldap-unit-editor.esm.js.map +1 -0
- package/static/browser/ldap-unit-editor.js +1021 -0
- package/static/browser/ldap-unit-editor.js.map +1 -0
- package/static/browser/ldap-unit-editor.min.js +2 -0
- package/static/browser/ldap-unit-editor.min.js.map +1 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
- package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
- package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserList.js +181 -0
- package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
- package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
- package/static/browser/ldap-user-editor/index.js +2 -0
- package/static/browser/ldap-user-editor/index.js.map +1 -0
- package/static/browser/ldap-user-editor/types.js +2 -0
- package/static/browser/ldap-user-editor/types.js.map +1 -0
- package/static/browser/ldap-user-editor.css +2 -0
- package/static/browser/ldap-user-editor.css.map +1 -0
- package/static/browser/ldap-user-editor.esm.js +1897 -0
- package/static/browser/ldap-user-editor.esm.js.map +1 -0
- package/static/browser/ldap-user-editor.js +1905 -0
- package/static/browser/ldap-user-editor.js.map +1 -0
- package/static/browser/ldap-user-editor.min.js +2 -0
- package/static/browser/ldap-user-editor.min.js.map +1 -0
- package/static/browser/shared/components/Modal.js +121 -0
- package/static/browser/shared/components/Modal.js.map +1 -0
- package/static/browser/shared/components/StatusMessage.js +119 -0
- package/static/browser/shared/components/StatusMessage.js.map +1 -0
- package/static/browser/shared/index.js +7 -0
- package/static/browser/shared/index.js.map +1 -0
- package/static/browser/shared/types/index.js +37 -0
- package/static/browser/shared/types/index.js.map +1 -0
- package/static/browser/shared/utils/dom.js +78 -0
- package/static/browser/shared/utils/dom.js.map +1 -0
- package/static/browser/shared/utils/form.js +234 -0
- package/static/browser/shared/utils/form.js.map +1 -0
- package/static/browser/shared/utils/schema.js +121 -0
- package/static/browser/shared/utils/schema.js.map +1 -0
- package/static/browser/shared.esm.js +694 -0
- package/static/browser/shared.esm.js.map +1 -0
- package/static/browser/shared.js +723 -0
- package/static/browser/shared.js.map +1 -0
- package/static/browser/shared.min.js +2 -0
- package/static/browser/shared.min.js.map +1 -0
- package/static/schemas/ad/computers.json +92 -0
- package/static/schemas/ad/groups.json +55 -0
- package/static/schemas/ad/organizations.json +66 -0
- package/static/schemas/ad/users.json +116 -0
- package/static/schemas/standard/devices.json +72 -0
- package/static/schemas/standard/groups.json +54 -0
- package/static/schemas/standard/organizations.json +49 -0
- package/static/schemas/standard/users.json +86 -0
- package/static/schemas/twake/groups.json +75 -0
- package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
- package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
- package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
- package/static/schemas/twake/organizations.json +52 -0
- package/static/schemas/twake/positions.json +32 -0
- 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)
|