From 2593606f1638c2708a9c7db08b0190391ad125c2 Mon Sep 17 00:00:00 2001 From: Valentin Tolmer Date: Wed, 1 Mar 2023 17:25:01 +0100 Subject: [PATCH] docs: add docs about scripting --- README.md | 37 ++++++++++++------- docs/cookie.png | Bin 0 -> 62063 bytes docs/scripting.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 docs/cookie.png create mode 100644 docs/scripting.md diff --git a/README.md b/README.md index 55ad2ad..a660011 100644 --- a/README.md +++ b/README.md @@ -269,26 +269,27 @@ folder for help with: ### vs OpenLDAP -OpenLDAP is a monster of a service that implements all of LDAP and all of its -extensions, plus some of its own. That said, if you need all that flexibility, -it might be what you need! Note that installation can be a bit painful -(figuring out how to use `slapd`) and people have mixed experiences following -tutorials online. If you don't configure it properly, you might end up storing -passwords in clear, so a breach of your server would reveal all the stored -passwords! +[OpenLDAP](https://www.openldap.org) is a monster of a service that implements +all of LDAP and all of its extensions, plus some of its own. That said, if you +need all that flexibility, it might be what you need! Note that installation +can be a bit painful (figuring out how to use `slapd`) and people have mixed +experiences following tutorials online. If you don't configure it properly, you +might end up storing passwords in clear, so a breach of your server would +reveal all the stored passwords! OpenLDAP doesn't come with a UI: if you want a web interface, you'll have to -install one (not that many that look nice) and configure it. +install one (not that many look nice) and configure it. LLDAP is much simpler to setup, has a much smaller image (10x smaller, 20x if you add PhpLdapAdmin), and comes packed with its own purpose-built web UI. +However, it's not as flexible as OpenLDAP. ### vs FreeIPA -FreeIPA is the one-stop shop for identity management: LDAP, Kerberos, NTP, DNS, -Samba, you name it, it has it. In addition to user management, it also does -security policies, single sign-on, certificate management, linux account -management and so on. +[FreeIPA](http://www.freeipa.org) is the one-stop shop for identity management: +LDAP, Kerberos, NTP, DNS, Samba, you name it, it has it. In addition to user +management, it also does security policies, single sign-on, certificate +management, linux account management and so on. If you need all of that, go for it! Keep in mind that a more complex system is more complex to maintain, though. @@ -297,6 +298,18 @@ LLDAP is much lighter to run (<10 MB RAM including the DB), easier to configure (no messing around with DNS or security policies) and simpler to use. It also comes conveniently packed in a docker container. +### vs Kanidm + +[Kanidm](https://kanidm.com) is an up-and-coming Rust identity management +platform, covering all your bases: OAuth, Linux accounts, SSH keys, Radius, +WebAuthn. It comes with a (read-only) LDAPS server. + +It's fairly easy to install and does much more; but their LDAP server is +read-only, and by having more moving parts it is inherently more complex. If +you don't need to modify the users through LDAP and you're planning on +installing something like [KeyCloak](https://www.keycloak.org) to provide +modern identity protocols, check out Kanidm. + ## I can't log in! If you just set up the server, can get to the login page but the password you diff --git a/docs/cookie.png b/docs/cookie.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1ae544870aeff31a5f96a83778360cf6f49ee6 GIT binary patch literal 62063 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 literal 0 HcmV?d00001 diff --git a/docs/scripting.md b/docs/scripting.md new file mode 100644 index 0000000..af81c2b --- /dev/null +++ b/docs/scripting.md @@ -0,0 +1,90 @@ +# Scripting + +Programmatically accessing LLDAP can be done either through the LDAP protocol, +or via the GraphQL API. + +## LDAP + +Most _read-only_ queries about users and groups are supported. Anything not +supported would be considered a missing feature or a bug. + +Most _modification_ queries are not supported, except for creating users and +changing the password (through the extended password operation). Those could be +added in the future, on a case-by-case basis. + +Most _meta_-queries about the LDAP server itself are not supported and are out +of scope. That includes anything that touches the schema, for instance. LLDAP +still supports basic RootDSE queries. + +Anonymous bind is not supported. + +## GraphQL + +The best way to interact with LLDAP programmatically is via the GraphQL +interface. You can use any language that has a GraphQL library (most of them +do), and use the [GraphQL Schema](../schema.graphql) to guide your queries. + +### Getting a token + +You'll need a JWT (authentication token) to issue GraphQL queries. Your view of +the system will be limited by the rights of your user. In particular, regular +users can only see themselves and the groups they belong to (but not other +members of these groups, for instance). + +#### Manually + +Log in to the web front-end of LLDAP. Then open the developer tools (F12), find +the "Storage > Cookies", and you'll find the "token" cookie with your JWT. + +![Cookies menu with a JWT](cookie.png) + +#### Automatically + +The easiest way is to send a json POST request to `/auth/simple/login` with +`{"username": "john", "password": "1234"}` in the body. +Then you'll receive a JSON response with: + +``` +{ + "token": "eYbat...", + "refreshToken": "3bCka...", +} +``` + +### Using the token + +You can use the token directly, either as a cookie, or as a bearer auth token +(add an "Authorization" header with contents `"Bearer "`). + +The JWT is valid for 1 day (unless you log out explicitly). +You can use the refresh token to query `/auth/refresh` and get another JWT. The +refresh token is valid for 30 days. + +### Testing your GraphQL queries + +You can go to `/api/graphql/playground` to test your queries and explore the +data in the playground. You'll need to provide the JWT in the headers: + +``` +{ "Authorization": "Bearer abcdef123..." } +``` + +Then you can enter your query, for instance: + +```graphql +{ + user(userId:"admin") { + displayName + } + groups { + id + displayName + users { + id + email + } + } +} +``` + +The schema is on the right, along with some basic docs.