MSC4190: Device management for application services (#4190)
Co-authored-by: Tulir Asokan <tulir@maunium.net>pull/3647/merge
parent
2b15b1074b
commit
ebb7d204ec
@ -0,0 +1,124 @@
|
||||
# MSC4190: Device management for application services
|
||||
|
||||
[MSC4326] gives appservices the ability to masquerade devices using the
|
||||
`device_id` query parameter on C-S API requests, which eliminates the need to
|
||||
maintain individual access tokens for each application service user.
|
||||
|
||||
However, application services don't have an endpoint to create devices for their
|
||||
users, which means that, in practice, encrypted application services still use
|
||||
`/login` with the `m.login.application_service` login type to create devices for
|
||||
their users.
|
||||
|
||||
Consequently, such application services leave many unused but active access
|
||||
tokens for those users.
|
||||
|
||||
Furthermore, the `/login` endpoint is no longer available for application services
|
||||
to use on servers that have switched to OAuth2 ([MSC3861]).
|
||||
|
||||
This MSC proposes a dedicated API endpoint for application services to create
|
||||
and delete devices for users, addressing the existing gap to enable encrypted
|
||||
application services without `/login`.
|
||||
|
||||
## Proposal
|
||||
|
||||
This MSC proposes to extend existing endpoints to allow application services to
|
||||
create and delete devices for their users without relying on the `/login` and
|
||||
`/logout` mechanisms.
|
||||
|
||||
As all changes here only apply to application services, guest access is not
|
||||
relevant.
|
||||
|
||||
### [**`PUT /_matrix/client/v3/devices/{deviceId}`**](https://spec.matrix.org/v1.16/client-server-api/#put_matrixclientv3devicesdeviceid)
|
||||
|
||||
This endpoint is updated to allow the creation of a new device for a user, if
|
||||
the device ID does not exist. This behavior is only available to application
|
||||
services.
|
||||
|
||||
This endpoint will use the 201 status code to indicate that a new device was
|
||||
created, in addition to the existing 200 status code for existing devices.
|
||||
|
||||
The endpoint is rate limited. Servers may want to use login rate limits for
|
||||
device creation, although in most cases application services will disable all
|
||||
rate limits anyway.
|
||||
|
||||
### [**`DELETE /_matrix/client/v3/devices/{deviceId}`**](https://spec.matrix.org/v1.16/client-server-api/#delete_matrixclientv3devicesdeviceid)
|
||||
|
||||
This endpoint no longer requires User-Interactive Authentication for application services.
|
||||
|
||||
### [**`POST /_matrix/client/v3/delete_devices`**](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3delete_devices)
|
||||
|
||||
This endpoint no longer requires User-Interactive Authentication for application services.
|
||||
|
||||
### [**`POST /_matrix/client/v3/keys/device_signing/upload`**](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3keysdevice_signingupload)
|
||||
|
||||
This endpoint no longer requires User-Interactive Authentication for application services,
|
||||
even if cross-signing keys already exist.
|
||||
|
||||
This is not technically a part of device management, but appservices will need
|
||||
to be able to verify themselves including generating cross-signing keys for
|
||||
[MSC4153] and replacing cross-signing keys is necessary in some cases (e.g. if
|
||||
the appservice recovery key is misplaced).
|
||||
|
||||
[MSC4153]: https://github.com/matrix-org/matrix-spec-proposals/pull/4153
|
||||
|
||||
### [**`POST /_matrix/client/v3/login`**](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3login)
|
||||
|
||||
Logins with the [`m.login.application_service` type] will return HTTP 400 with a
|
||||
new `M_APPSERVICE_LOGIN_UNSUPPORTED` error code if the homeserver has switched
|
||||
to OAuth2.
|
||||
|
||||
[`m.login.application_service` type]: https://spec.matrix.org/v1.16/client-server-api/#appservice-login
|
||||
|
||||
### [**`POST /_matrix/client/v3/register`**](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3register)
|
||||
|
||||
Currently, the default behavior for `/register` is to create a new device and
|
||||
access token (i.e. login) in addition to creating the user. Similar to `/login`,
|
||||
creating an access token is no longer possible on servers that have switched to
|
||||
OAuth2. However, creating users via the endpoint is still required, so unlike
|
||||
`/login`, `/register` will not be removed entirely.
|
||||
|
||||
Therefore, application services on homeservers that have switched to OAuth2
|
||||
MUST call the endpoint with `"inhibit_login": true`. Calls without the parameter,
|
||||
or with a different value than `true`, will return HTTP 400 with the
|
||||
`M_APPSERVICE_LOGIN_UNSUPPORTED` error code.
|
||||
|
||||
## Potential issues
|
||||
|
||||
The change to `/v3/register` is technically backwards-incompatible, but it will
|
||||
break when switching to next-gen auth in any case, so a new endpoint version
|
||||
would not be useful.
|
||||
|
||||
The endpoint could just stop returning access tokens to avoid breaking existing
|
||||
appservices that don't read that field, but an explicit error was chosen to
|
||||
avoid silent breakage of appservices that do depend on the field.
|
||||
|
||||
The breaking changes to `/login` and `/register` only apply to homeservers which
|
||||
have switched to OAuth2. Homeservers MAY have implementation-specific methods of
|
||||
opting into the breaking changes before switching to OAuth2 entirely to test
|
||||
compatibility.
|
||||
|
||||
## Security considerations
|
||||
|
||||
This MSC lets application services delete devices and replace cross-signing keys
|
||||
without the usual re-authentication requirement. It is considered an acceptable
|
||||
risk, as application services have to be registered by the server admin.
|
||||
|
||||
## Alternatives
|
||||
|
||||
A new set of endpoints dedicated to application services could be added to the
|
||||
specification, like `GET|PUT|DELETE /_matrix/client/v3/appservices/{appId}/devices/{deviceId}`.
|
||||
|
||||
This would have the advantage of not changing the behavior of existing endpoints.
|
||||
|
||||
## Dependencies
|
||||
|
||||
In order to use the devices created using this MSC, appservices need to be able
|
||||
to use device IDs as a part of identity assertion, as defined by [MSC4326].
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
`IO.ELEMENT.MSC4190.M_APPSERVICE_LOGIN_UNSUPPORTED` should be used as the
|
||||
error code instead of `M_APPSERVICE_LOGIN_UNSUPPORTED`.
|
||||
|
||||
[MSC4326]: https://github.com/matrix-org/matrix-spec-proposals/pull/4326
|
||||
[MSC3861]: https://github.com/matrix-org/matrix-spec-proposals/pull/3861
|
||||
Loading…
Reference in New Issue