summaryrefslogtreecommitdiff
path: root/docs/api/authentication.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/api/authentication.md')
-rw-r--r--docs/api/authentication.md86
1 files changed, 86 insertions, 0 deletions
diff --git a/docs/api/authentication.md b/docs/api/authentication.md
new file mode 100644
index 0000000..d4c1f70
--- /dev/null
+++ b/docs/api/authentication.md
@@ -0,0 +1,86 @@
+# Authentication
+
+```mermaid
+---
+Authentication states
+---
+stateDiagram-v2
+ [*] --> Unauthenticated
+ Unauthenticated --> Authenticated : /api/auth/login
+ Authenticated --> Unauthenticated : /api/auth/logout
+ Authenticated --> Unauthenticated : Token expired
+```
+
+Authentication associates each authenticated request with a login.
+
+
+## Identity tokens
+
+A login is primarily authenticated using its username and password. However, passwords are a sensitive, long-lived credential, and are also operationally expensive to verify; for routine access, requests are authenticated using an identity token, instead.
+
+Tokens are issued by logging into the service, using the `/api/auth/login` endpoint. The `/api/auth/logout` endpoint immediately invalidates the token used to make a request to it. Tokens are also invalidated after seven days of inactivity.
+
+To authenticate a request, include `cookie: identity=TOKEN SECRET` header in the request. For browser-based clients, this may happen automatically.
+
+
+## Authentication failures
+
+Unless the endpoint's documentation says otherwise, all endpoints require authentication. Making a request to any endpoint that requires authentication, either without a token, or with a token that is not valid or that has expired, causes the service to return a `401 Unauthorized` response, instead of the responses documented for the endpoint the request was intended for. The API will not take action on requests that fail authentication in this way.
+
+
+## `POST /api/auth/login`
+
+Authenticates the user using their login name and password. The login must exist before calling this endpoint.
+
+To create logins, see [initial setup](./initial-setup.md) and [invitations](./invitations.md).
+
+**This endpoint does not require an `identity` cookie.**
+
+### Request
+
+```json
+{
+ "name": "example username",
+ "password": "the plaintext password",
+}
+```
+
+The request must have the following fields:
+
+| Field | Type | Description |
+|:-----------|:-------|:--|
+| `name` | string | The login's name. |
+| `password` | string | The login's password, in plain text. |
+
+### Success
+
+<!-- This prose is duplicated by 03-initial-setup.md and in 04-invitations.md, with small changes for context. If you edit it here, edit it there, too. -->
+
+This endpoint will respond with a status of `204 No Content` when successful.
+
+The response will include a `Set-Cookie` header for the `identity` cookie, providing the client with a newly-minted identity token associated with the login identified in the request. This token's value must be kept confidential.
+
+The cookie will expire if it is not used regularly.
+
+### Authentication failure
+
+This endpoint will respond with a status of `401 Unauthorized` if the login name and password do not correspond to an existing login.
+
+
+## `POST /api/auth/logout`
+
+Invalidates the identity token used to make the request, logging the user out.
+
+### Request
+
+```json
+{}
+```
+
+The request must be an empty JSON object.
+
+### Success
+
+This endpoint will respond with a status of `204 No Content` when successful.
+
+The response will include a `Set-Cookie` header that clears the `identity` cookie. Regardless of whether the client clears the cookie, the service also invalidates the token.