summaryrefslogtreecommitdiff
path: root/docs/api/authentication.md
blob: 7e05443f5f87aef747c93414c2a15cf94c8099ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 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 `200 Okay` when successful. The body of the response will be a JSON object describing the authenticated login:

```json
{
	"id": "Labcd1234",
	"name": "Andrea"
}
```

The response will include the following fields:

| Field       | Type   | Description |
|:------------|:-------|:--|
| `id`        | string | The authenticated login's ID. |
| `name`      | string | The authenticated login's name. |

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.