tessera

Turns a confirmed registration into an account.

POST
/api/v1/auth/register/confirm

Why the checks happen here and not when the link was sent

Nothing was reserved while the message sat in an inbox. Reserving the name would make "register and never confirm" a free way to lock every good name away. The price is that the name is checked against today's accounts, so a confirmation can fail here because the name went elsewhere. Rare, and recoverable.

Errors

400 when the link is unknown, spent or expired, 403 when registration was closed while this was waiting, 409 when the name was taken in the meantime, 404 when this instance sends no mail.

application/json
  1. body

Body of POST /auth/register/confirm.

token*string

The token from the link.

Response Body

Account created and signed in

application/json
  1. response

An account, as the API describes it. Never carries a hash.

email*string

Normalised address.

email_verified_at?|

When the address was last proven to reach this user, or null if never.

Set by confirming a registration, by a provider vouching for the address, or by following the link from POST /account/email/verification. Cleared when the address changes.

Formatdate-time
has_password*boolean

Whether the account has a password.

An account created through GitHub, Discord or OIDC has none. It confirms changes by having signed in within the last few minutes instead of by typing one, so a client shows a password field only when this is true; see reauthentication_required.

id*string

Stable identifier.

is_admin*boolean

Whether the account holds the seeded administrator role.

Kept because clients read it, but derived and not stored, and narrower than permissions. An account in a role granting users:read and nothing else is not an administrator, yet reaches one administrative endpoint. New clients should read permissions.

must_change_password*boolean

Whether the account must set a new password before doing anything else.

Set on the administrator generated at first run. A client seeing this should send the user to a change-password screen and nowhere else.

permissions*array<string>

Everything this account is allowed to do.

resource:verb strings, and what a client should decide from. A screen guessing from is_admin is wrong for every role between "member" and "everything".

quota_bytes?|

A storage quota set on this one account, overriding its role's.

null means the role's applies; 0 means this account has no ceiling of its own. What is actually left is storage_remaining_bytes on /capabilities, which accounts for what has been used.

Formatint64
Range0 <= value
roles*array<string>

The roles it is in, by name.

username*string

Normalised account name.

curl -X POST 'https://example.com/api/v1/auth/register/confirm' \  -H 'Content-Type: application/json' \  -d '{  "token": "string"}'
{  "email": "string",  "email_verified_at": "2019-08-24T14:15:22Z",  "has_password": true,  "id": "string",  "is_admin": true,  "must_change_password": true,  "permissions": [    "string"  ],  "quota_bytes": 0,  "roles": [    "string"  ],  "username": "string"}