MSC4326: Device masquerading for appservices (#4326)
Co-authored-by: Tulir Asokan <tulir@maunium.net>anoa/tweak_msc_checklist
parent
130da801e3
commit
2b15b1074b
@ -0,0 +1,117 @@
|
|||||||
|
# MSC4326: Device masquerading for appservices
|
||||||
|
|
||||||
|
*History*: This proposal is split off from [MSC3202: Encrypted Appservices](https://github.com/matrix-org/matrix-spec-proposals/pull/3202).
|
||||||
|
|
||||||
|
Appservices today can make requests as any (local) user in their namespace through [identity assertion](https://spec.matrix.org/v1.15/application-service-api/#identity-assertion).
|
||||||
|
To support end-to-end encryption and other similar device-centric functionality, appservices need to
|
||||||
|
be able to also pick the device ID they are speaking as.
|
||||||
|
|
||||||
|
This proposal adds device ID to the identity assertion appservices can already perform, leaving other
|
||||||
|
aspects of end-to-end encryption support to other MSCs like MSC3202 (mentioned above).
|
||||||
|
|
||||||
|
|
||||||
|
## Proposal
|
||||||
|
|
||||||
|
To complement the (optional) `user_id` query string parameter during identity assertion, an also-optional
|
||||||
|
`device_id` parameter is also supported. The new `device_id` parameter is only available when `user_id`
|
||||||
|
is available to the caller - when authenticating using an `as_token`.
|
||||||
|
|
||||||
|
When both a `user_id` and `device_id` are provided, and both are known/registered, the server uses those
|
||||||
|
details for the remainder of the request. For many endpoints this means updating the "last seen IP"
|
||||||
|
and "last seen timestamp" for the device, though for some endpoints it may mean interacting with the
|
||||||
|
device specifically (such as when uploading one-time keys).
|
||||||
|
|
||||||
|
If the `device_id` does not already exist on the `user_id`, the server returns a `400 M_UNKNOWN_DEVICE`
|
||||||
|
standard error response.
|
||||||
|
|
||||||
|
If the `device_id` is present without a `user_id`, the `user_id` is assumed to be the appservice's
|
||||||
|
default sender (the user implied by `sender_localpart` in its registration). This is the same behaviour
|
||||||
|
as today when the appservice makes such requests.
|
||||||
|
|
||||||
|
If the `device_id` is present and the requester is not able to use identity assertion, the request
|
||||||
|
continues as though the `device_id` parameter was never present. This copies the behaviour of `user_id`.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
*All examples assume the `user_id` is within the appservice's scope.*
|
||||||
|
|
||||||
|
User ID asserted, but not device ID:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GET /_matrix/client/v3/account/whoami?user_id=@alice:example.org
|
||||||
|
Authorization: Bearer as_token_here
|
||||||
|
|
||||||
|
{
|
||||||
|
"user_id": "@alice:example.org",
|
||||||
|
"is_guest": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
User ID and device ID asserted:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GET /_matrix/client/v3/account/whoami?user_id=@alice:example.org&device_id=ABC123
|
||||||
|
Authorization: Bearer as_token_here
|
||||||
|
|
||||||
|
{
|
||||||
|
"user_id": "@alice:example.org",
|
||||||
|
"is_guest": false,
|
||||||
|
"device_id": "ABC123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Just device ID asserted:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GET /_matrix/client/v3/account/whoami?device_id=ABC123
|
||||||
|
Authorization: Bearer as_token_here
|
||||||
|
|
||||||
|
{
|
||||||
|
"user_id": "@the_appservice_sender:example.org",
|
||||||
|
"is_guest": false,
|
||||||
|
"device_id": "ABC123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Nothing asserted:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GET /_matrix/client/v3/account/whoami
|
||||||
|
Authorization: Bearer as_token_here
|
||||||
|
|
||||||
|
{
|
||||||
|
"user_id": "@the_appservice_sender:example.org",
|
||||||
|
"is_guest": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Potential issues
|
||||||
|
|
||||||
|
Appservices will need to create and manage their users' devices using another proposal or system. An
|
||||||
|
example is [MSC4190](https://github.com/matrix-org/matrix-spec-proposals/pull/4190).
|
||||||
|
|
||||||
|
|
||||||
|
## Alternatives
|
||||||
|
|
||||||
|
None relevant.
|
||||||
|
|
||||||
|
|
||||||
|
## Security considerations
|
||||||
|
|
||||||
|
The behaviour of `device_id` is largely copied from `user_id`, so should not increase or decrease an
|
||||||
|
appservice's capabilities beyond what it could already do. This is especially true for appservices
|
||||||
|
which cover "real" users in their namespaces: while they couldn't (and still can't) access data encrypted
|
||||||
|
before using something like [MSC3202](https://github.com/matrix-org/matrix-spec-proposals/pull/3202),
|
||||||
|
they could log out whatever devices they don't want and register new ones accordingly.
|
||||||
|
|
||||||
|
|
||||||
|
## Unstable prefix
|
||||||
|
|
||||||
|
For historical reasons, unstable implementations of this proposal should use `org.matrix.msc3202.device_id`
|
||||||
|
instead of `device_id`.
|
||||||
|
|
||||||
|
`ORG.MATRIX.MSC4326.M_UNKNOWN_DEVICE` is used as the error code instead of `M_UNKNOWN_DEVICE`.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
None relevant. Some MSCs depend on this MSC's functionality, however.
|
||||||
Loading…
Reference in New Issue