mirror of
https://github.com/matrix-org/matrix-spec
synced 2026-04-29 13:54:10 +02:00
Compare commits
36 commits
580c6ae1fd
...
6398357862
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6398357862 | ||
|
|
9244c84a32 | ||
|
|
6646146f8c | ||
|
|
6183f2410f | ||
|
|
dd4ea948b6 | ||
|
|
50eab3501e | ||
|
|
37b1362bc1 | ||
|
|
d8cc250d20 | ||
|
|
b5e2edf2e5 | ||
|
|
7ef1d9d0ec | ||
|
|
3a5e5555fa | ||
|
|
9889fe3584 | ||
|
|
013502b0c0 | ||
|
|
9859e20927 | ||
|
|
7a3b0c0804 | ||
|
|
0b0942d192 | ||
|
|
1cc93ec951 | ||
|
|
79af78022e | ||
|
|
17af55ddce | ||
|
|
79a1cded02 | ||
|
|
76b48e25d0 | ||
|
|
5d5b561140 | ||
|
|
9327793007 | ||
|
|
f3c269d951 | ||
|
|
3311b084bf | ||
|
|
992cf9dc35 | ||
|
|
4f8999be0a | ||
|
|
82adcec491 | ||
|
|
41c64c877b | ||
|
|
8e9874ad22 | ||
|
|
ee9b5ddcca | ||
|
|
59d2c62d2d | ||
|
|
b2e122f308 | ||
|
|
1fc01189f3 | ||
|
|
212377e393 | ||
|
|
fdc012ac01 |
1
changelogs/client_server/newsfragments/2071.feature
Normal file
1
changelogs/client_server/newsfragments/2071.feature
Normal file
|
|
@ -0,0 +1 @@
|
|||
Feature: Update profile endpoints to become generic to support [MSC4133](https://github.com/matrix-org/matrix-spec-proposals/pull/4133) extended fields. Extended profile fields are now supported via the new `m.profile_fields` capability, which deprecates the previous `m.set_avatar_url` and `m.set_displayname` capabilities. Stabilised keys are explicitly enumerated, and custom keys must conform to the Common Namespaced Identifier Grammar.
|
||||
1
changelogs/client_server/newsfragments/2148.feature
Normal file
1
changelogs/client_server/newsfragments/2148.feature
Normal file
|
|
@ -0,0 +1 @@
|
|||
Add the OAuth 2.0 based authentication API, as per [MSC3861](https://github.com/matrix-org/matrix-spec-proposals/pull/3861) and its sub-proposals.
|
||||
|
|
@ -1485,6 +1485,209 @@ MAY reject weak passwords with an error code `M_WEAK_PASSWORD`.
|
|||
|
||||
{{% http-api spec="client-server" api="oauth_server_metadata" %}}
|
||||
|
||||
#### Client registration
|
||||
|
||||
Before being able to use the authorization flow to obtain an access token, a
|
||||
client needs to obtain a `client_id` by registering itself with the server.
|
||||
|
||||
This should be done via OAuth 2.0 Dynamic Client Registration as defined in
|
||||
[RFC 7591](https://datatracker.ietf.org/doc/html/rfc7591).
|
||||
|
||||
##### Client metadata
|
||||
|
||||
In OAuth 2.0, clients register a set of metadata values with the authorization
|
||||
server, which associates it with a newly generated `client_id`. These values are
|
||||
used to describe the client to the user and define how the client interacts with
|
||||
the server.
|
||||
|
||||
{{% definition path="schemas/oauth2-client-metadata" %}}
|
||||
|
||||
###### Metadata localization
|
||||
|
||||
As per [RFC 7591 section 2.2](https://tools.ietf.org/html/rfc7591#section-2.2),
|
||||
all the human-readable metadata values MAY be localized.
|
||||
|
||||
The human-readable values include:
|
||||
- `client_name`
|
||||
- `logo_uri`
|
||||
- `tos_uri`
|
||||
- `policy-uri`
|
||||
|
||||
For example:
|
||||
|
||||
```json
|
||||
{
|
||||
"client_name": "Digital mailbox",
|
||||
"client_name#en-US": "Digital mailbox",
|
||||
"client_name#en-GB": "Digital postbox",
|
||||
"client_name#fr": "Boîte aux lettres numérique",
|
||||
"tos_uri": "https://example.com/tos.html",
|
||||
"tos_uri#fr": "https://example.com/fr/tos.html",
|
||||
"policy_uri": "https://example.com/policy.html",
|
||||
"policy_uri#fr": "https://example.com/fr/policy.html"
|
||||
}
|
||||
```
|
||||
|
||||
###### Redirect URI validation
|
||||
|
||||
The redirect URI plays a critical role in validating the authenticity of the
|
||||
client. The client "proves" its identity by demonstrating that it controls the
|
||||
redirect URI. This is why it is critical to have strict validation of the
|
||||
redirect URI.
|
||||
|
||||
The `application_type` metadata is used to determine the type of client.
|
||||
|
||||
In all cases, the redirect URI MUST NOT have a fragment component.
|
||||
|
||||
**Web clients**
|
||||
|
||||
`web` clients can use redirect URIs that:
|
||||
|
||||
- MUST use the `https` scheme.
|
||||
- MUST NOT use a user or password in the authority component of the URI.
|
||||
- MUST use the client URI as a common base for the authority component, as
|
||||
defined previously.
|
||||
- MAY include an `application/x-www-form-urlencoded` formatted query component.
|
||||
|
||||
For example, with `https://example.com/` as the client URI, the following are
|
||||
valid redirect URIs:
|
||||
- `https://example.com/callback`
|
||||
- `https://app.example.com/callback`
|
||||
- `https://example.com:5173/?query=value`
|
||||
|
||||
With the same client URI, the following are invalid redirect URIs:
|
||||
- `https://example.com/callback#fragment`
|
||||
- `http://example.com/callback`
|
||||
- `http://localhost/`
|
||||
|
||||
**Native clients**
|
||||
|
||||
`native` clients can use three types of redirect URIs:
|
||||
|
||||
1. **Private-Use URI Scheme**
|
||||
- The scheme MUST be prefixed with the client URI hostname in reverse-DNS
|
||||
notation. For example, if the client URI is `https://example.com/`, then a
|
||||
valid custom URI scheme would be `com.example.app:/`.
|
||||
- There MUST NOT be an authority component. This means that the URI MUST have
|
||||
either a single slash or none immediately following the scheme, with no
|
||||
hostname, username, or port.
|
||||
2. **`http` URI on the loopback interface**
|
||||
- The scheme MUST be `http`.
|
||||
- The host part MUST be `localhost`, `127.0.0.1`, or `[::1]`.
|
||||
- There MUST NOT be a port. The homeserver MUST then accept any port number
|
||||
during the authorization flow.
|
||||
3. **Claimed `https` Scheme URI**
|
||||
|
||||
Some operating systems allow apps to claim `https` scheme URIs in the
|
||||
domains they control. When the browser encounters a claimed URI, instead of
|
||||
the page being loaded in the browser, the native app is launched with the
|
||||
URI supplied as a launch parameter. The same rules as for `web` clients
|
||||
apply.
|
||||
|
||||
These restrictions are the same as defined by [RFC 8252 section 7](https://tools.ietf.org/html/rfc8252#section-7).
|
||||
|
||||
For example, with `https://example.com/` as the client URI,
|
||||
|
||||
These are valid redirect URIs:
|
||||
- `com.example.app:/callback`
|
||||
- `com.example:/`
|
||||
- `com.example:callback`
|
||||
- `http://localhost/callback`
|
||||
- `http://127.0.0.1/callback`
|
||||
- `http://[::1]/callback`
|
||||
|
||||
These are invalid redirect URIs:
|
||||
- `example:/callback`
|
||||
- `com.example.app://callback`
|
||||
- `https://localhost/callback`
|
||||
- `http://localhost:1234/callback`
|
||||
|
||||
##### Dynamic client registration flow
|
||||
|
||||
To register, the client sends an HTTP `POST` request to the
|
||||
`registration_endpoint`, which can be found in the [server metadata](#server-metadata-discovery).
|
||||
The body of the request is the JSON-encoded [`OAuthClientMetadata`](#client-metadata).
|
||||
|
||||
For example, the client could send the following registration request:
|
||||
|
||||
```http
|
||||
POST /register HTTP/1.1
|
||||
Content-Type: application/json
|
||||
Accept: application/json
|
||||
Server: auth.example.com
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"client_name": "My App",
|
||||
"client_name#fr": "Mon application",
|
||||
"client_uri": "https://example.com/",
|
||||
"logo_uri": "https://example.com/logo.png",
|
||||
"tos_uri": "https://example.com/tos.html",
|
||||
"tos_uri#fr": "https://example.com/fr/tos.html",
|
||||
"policy_uri": "https://example.com/policy.html",
|
||||
"policy_uri#fr": "https://example.com/fr/policy.html",
|
||||
"redirect_uris": ["https://app.example.com/callback"],
|
||||
"token_endpoint_auth_method": "none",
|
||||
"response_types": ["code"],
|
||||
"grant_types": [
|
||||
"authorization_code",
|
||||
"refresh_token",
|
||||
"urn:ietf:params:oauth:grant-type:token-exchange"
|
||||
],
|
||||
"application_type": "web"
|
||||
}
|
||||
```
|
||||
|
||||
Upon successful registration, the server replies with an `HTTP 201 Created`
|
||||
response, with a JSON object containing the allocated `client_id` and all the
|
||||
registered metadata values.
|
||||
|
||||
With the registration request above, the server might reply with:
|
||||
|
||||
```json
|
||||
{
|
||||
"client_id": "s6BhdRkqt3",
|
||||
"client_name": "My App",
|
||||
"client_uri": "https://example.com/",
|
||||
"logo_uri": "https://example.com/logo.png",
|
||||
"tos_uri": "https://example.com/tos.html",
|
||||
"policy_uri": "https://example.com/policy.html",
|
||||
"redirect_uris": ["https://app.example.com/callback"],
|
||||
"token_endpoint_auth_method": "none",
|
||||
"response_types": ["code"],
|
||||
"grant_types": ["authorization_code", "refresh_token"],
|
||||
"application_type": "web"
|
||||
}
|
||||
```
|
||||
|
||||
In this example, the server has not registered the locale-specific values for
|
||||
`client_name`, `tos_uri`, and `policy_uri`, which is why they are not present in
|
||||
the response. The server also does not support the
|
||||
`urn:ietf:params:oauth:grant-type:token-exchange` grant type, which is why it is
|
||||
not present in the response.
|
||||
|
||||
The client MUST store the `client_id` for future use.
|
||||
|
||||
To avoid the number of client registrations growing over time, the server MAY
|
||||
choose to delete client registrations that don't have an active session. The
|
||||
server MUST NOT delete client registrations that have an active session.
|
||||
|
||||
Clients MUST perform a new client registration at the start of each
|
||||
authorization flow.
|
||||
|
||||
{{% boxes/note %}}
|
||||
Because each client on each user device will do its own registration, they may
|
||||
all have different `client_id`s. This means that the server may store the same
|
||||
client registration multiple times, which could lead to a large number of client
|
||||
registrations.
|
||||
|
||||
This can be mitigated by de-duplicating client registrations that have identical
|
||||
metadata. By doing so, different users on different devices using the same
|
||||
client can share a single `client_id`, reducing the overall number of
|
||||
registrations.
|
||||
{{% /boxes/note %}}
|
||||
|
||||
#### Scope
|
||||
|
||||
The client requests a scope in the OAuth 2.0 authorization flow, which is then
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ for sending events:
|
|||
The following API endpoints are allowed to be accessed by guest accounts
|
||||
for their own account maintenance:
|
||||
|
||||
* [PUT /profile/{userId}/displayname](#put_matrixclientv3profileuseriddisplayname)
|
||||
* [PUT /profile/{userId}/{keyName}](#put_matrixclientv3profileuseridkeyname)
|
||||
* [GET /devices](#get_matrixclientv3devices)
|
||||
* [GET /devices/{deviceId}](#get_matrixclientv3devicesdeviceid)
|
||||
* [PUT /devices/{deviceId}](#put_matrixclientv3devicesdeviceid)
|
||||
|
|
|
|||
|
|
@ -73,11 +73,17 @@ paths:
|
|||
- default
|
||||
- available
|
||||
m.set_displayname:
|
||||
deprecated: true
|
||||
$ref: '#/components/schemas/booleanCapability'
|
||||
description: Capability to indicate if the user can change their display name.
|
||||
description: |
|
||||
**Deprecated:** Capability to indicate if the user can change their display name.
|
||||
Refer to `m.profile_fields` for extended profile management.
|
||||
m.set_avatar_url:
|
||||
deprecated: true
|
||||
$ref: '#/components/schemas/booleanCapability'
|
||||
description: Capability to indicate if the user can change their avatar.
|
||||
description: |
|
||||
**Deprecated:** Capability to indicate if the user can change their avatar.
|
||||
Refer to `m.profile_fields` for extended profile management.
|
||||
m.3pid_changes:
|
||||
$ref: '#/components/schemas/booleanCapability'
|
||||
description: Capability to indicate if the user can change 3PID associations
|
||||
|
|
@ -86,6 +92,40 @@ paths:
|
|||
$ref: '#/components/schemas/booleanCapability'
|
||||
description: Capability to indicate if the user can generate tokens to log further
|
||||
clients into their account.
|
||||
m.profile_fields:
|
||||
x-addedInMatrixVersion: "1.14"
|
||||
type: object
|
||||
title: ProfileFieldsCapability
|
||||
description: Capability to indicate if the user can set or modify extended profile fields via
|
||||
[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`](/client-server-api/#put_matrixclientv3profileuseridkeyname).
|
||||
If absent, clients should assume custom profile fields are supported, provided the
|
||||
response from [`/versions`](/client-server-api/#get_matrixclientversions) indicates
|
||||
support for a sufficiently recent spec version.
|
||||
properties:
|
||||
allowed:
|
||||
type: array
|
||||
description: List of allowed additional custom profile field keys. A `*` can be used as a
|
||||
wildcard to match any sequence of characters. This list takes precedence over the
|
||||
disallowed list if both are provided.
|
||||
items:
|
||||
type: string
|
||||
example:
|
||||
- "m.example_field"
|
||||
- "org.example/job_title"
|
||||
disallowed:
|
||||
type: array
|
||||
description: List of disallowed additional custom profile field keys. A `*` can be used as
|
||||
a wildcard to match any sequence of characters. Ignored if an allowed list is provided.
|
||||
items:
|
||||
type: string
|
||||
example:
|
||||
- "org.example.secret_field"
|
||||
enabled:
|
||||
type: boolean
|
||||
description: `true` if the user can set or modify any extended profile fields, `false` otherwise.
|
||||
example: true
|
||||
required:
|
||||
- enabled
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
|
|
|
|||
|
|
@ -16,48 +16,105 @@ info:
|
|||
title: Matrix Client-Server Profile API
|
||||
version: 1.0.0
|
||||
paths:
|
||||
"/profile/{userId}/displayname":
|
||||
"/profile/{userId}/{keyName}":
|
||||
put:
|
||||
summary: Set the user's display name.
|
||||
x-changedInMatrixVersion:
|
||||
"1.14": Endpoint now accepts variable `keyName` parameter.
|
||||
summary: Set a profile field for a user.
|
||||
description: |-
|
||||
This API sets the given user's display name. You must have permission to
|
||||
set this user's display name, e.g. you need to have their `access_token`.
|
||||
operationId: setDisplayName
|
||||
Set or update a profile field for a user. Must be authenticated with an
|
||||
access token authorised to make changes. Servers MAY impose size limits
|
||||
on individual fields, and the total profile MUST be under 64 KiB.
|
||||
|
||||
**Note**: Setting a field to `null` keeps the key but with a `null` value,
|
||||
which some servers may reject. To remove a field completely, use the
|
||||
`DELETE` endpoint instead.
|
||||
operationId: setProfileField
|
||||
security:
|
||||
- accessTokenQuery: []
|
||||
- accessTokenBearer: []
|
||||
parameters:
|
||||
- in: path
|
||||
name: userId
|
||||
description: The user whose display name to set.
|
||||
description: The user whose profile field should be set.
|
||||
required: true
|
||||
example: "@alice:example.com"
|
||||
schema:
|
||||
type: string
|
||||
- in: path
|
||||
name: keyName
|
||||
description: The profile field key name to set. It must be either
|
||||
`avatar_url`, `displayname`, or a custom field following the
|
||||
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
|
||||
required: true
|
||||
example: "displayname"
|
||||
schema:
|
||||
type: string
|
||||
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
|
||||
requestBody:
|
||||
description: A JSON object containing the property whose name matches
|
||||
the `keyName` specified in the URL. See `additionalProperties` for
|
||||
further details.
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
example: {
|
||||
"displayname": "Alice Margatroid"
|
||||
}
|
||||
properties:
|
||||
displayname:
|
||||
type: string
|
||||
description: The new display name for this user.
|
||||
description: The new display name information.
|
||||
required: true
|
||||
minProperties: 1
|
||||
additionalProperties:
|
||||
description: The JSON object must include a property whose key
|
||||
matches the `keyName` specified in the URL. For `avatar_url`,
|
||||
the value must be an MXC URI string. For `displayname`, the value
|
||||
must be a string. For custom keys, any JSON type is allowed -
|
||||
servers may not validate these values, but clients should follow
|
||||
the format defined for that key.
|
||||
example: { "displayname": "Alice Wonderland" }
|
||||
responses:
|
||||
"200":
|
||||
description: The display name was set.
|
||||
description: The profile field was set.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object # empty json object
|
||||
type: object # empty JSON object
|
||||
examples:
|
||||
response:
|
||||
value: {}
|
||||
"400":
|
||||
description: The request is malformed, contains invalid JSON, missing
|
||||
a required parameter, specifies an invalid key, or exceeds allowed
|
||||
size limits.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
bad_json:
|
||||
value:
|
||||
{
|
||||
"errcode": "M_BAD_JSON",
|
||||
"error": "Malformed JSON payload.",
|
||||
}
|
||||
invalid_key:
|
||||
value:
|
||||
{
|
||||
"errcode": "M_INVALID_PARAM",
|
||||
"error": "Invalid profile key.",
|
||||
}
|
||||
"403":
|
||||
description: The server is unwilling to perform the operation, either
|
||||
due to insufficient permissions or because profile modifications
|
||||
are disabled.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
forbidden:
|
||||
value:
|
||||
{
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile modification is not permitted.",
|
||||
}
|
||||
"429":
|
||||
description: This request was rate-limited.
|
||||
content:
|
||||
|
|
@ -67,98 +124,133 @@ paths:
|
|||
tags:
|
||||
- User data
|
||||
get:
|
||||
summary: Get the user's display name.
|
||||
description: |-
|
||||
Get the user's display name. This API may be used to fetch the user's
|
||||
own displayname or to query the name of other users; either locally or
|
||||
on remote homeservers.
|
||||
operationId: getDisplayName
|
||||
x-changedInMatrixVersion:
|
||||
"1.14": Endpoint now accepts variable `keyName` parameter.
|
||||
summary: Get a profile field for a user.
|
||||
description: Get the value of a profile field for a user. Any individual
|
||||
field must be within the total profile limit of 64 KiB.
|
||||
operationId: getProfileField
|
||||
parameters:
|
||||
- in: path
|
||||
name: userId
|
||||
description: The user whose display name to get.
|
||||
description: The user whose profile field should be returned.
|
||||
required: true
|
||||
example: "@alice:example.com"
|
||||
schema:
|
||||
type: string
|
||||
- in: path
|
||||
name: keyName
|
||||
description: The profile field key name to retrieve. It must be either
|
||||
`avatar_url`, `displayname`, or a custom field following the
|
||||
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
|
||||
required: true
|
||||
example: "displayname"
|
||||
schema:
|
||||
type: string
|
||||
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
|
||||
responses:
|
||||
"200":
|
||||
description: The display name for this user.
|
||||
description: The profile field value was retrieved.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
displayname:
|
||||
type: string
|
||||
description: The user's display name if they have set one, otherwise not
|
||||
present.
|
||||
minProperties: 1
|
||||
additionalProperties:
|
||||
description: The JSON response includes a property whose key
|
||||
matches the `keyName` specified in the URL. For `avatar_url`,
|
||||
the value will be an MXC URI string. For `displayname`, the
|
||||
value will be a string. For custom keys, any JSON type is
|
||||
possible - clients should expect the format defined for that key.
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"displayname": "Alice Margatroid"
|
||||
}
|
||||
value: { "displayname": "Alice" }
|
||||
"403":
|
||||
x-addedInMatrixVersion: "1.12"
|
||||
description: The server is unwilling to disclose whether the user exists and/or
|
||||
has a display name.
|
||||
description: The server is unwilling to disclose whether the user
|
||||
exists and/or has the specified profile field.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile lookup is disabled on this homeserver"
|
||||
}
|
||||
value:
|
||||
{
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile lookup is disabled on this homeserver",
|
||||
}
|
||||
"404":
|
||||
description: There is no display name for this user or this user does not exist.
|
||||
description: There is no profile field with this key for this user, or
|
||||
the user does not exist.
|
||||
tags:
|
||||
- User data
|
||||
"/profile/{userId}/avatar_url":
|
||||
put:
|
||||
summary: Set the user's avatar URL.
|
||||
description: |-
|
||||
This API sets the given user's avatar URL. You must have permission to
|
||||
set this user's avatar URL, e.g. you need to have their `access_token`.
|
||||
operationId: setAvatarUrl
|
||||
delete:
|
||||
x-addedInMatrixVersion: "1.14"
|
||||
summary: Remove a profile field from a user.
|
||||
description: Remove a specific field from a user's profile.
|
||||
operationId: deleteProfileField
|
||||
security:
|
||||
- accessTokenQuery: []
|
||||
- accessTokenBearer: []
|
||||
parameters:
|
||||
- in: path
|
||||
name: userId
|
||||
description: The user whose avatar URL to set.
|
||||
description: The user whose profile field should be deleted.
|
||||
required: true
|
||||
example: "@alice:example.com"
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
example: {
|
||||
"avatar_url": "mxc://matrix.org/wefh34uihSDRGhw34"
|
||||
}
|
||||
properties:
|
||||
avatar_url:
|
||||
type: string
|
||||
format: uri
|
||||
description: The new avatar URL for this user.
|
||||
description: The new avatar information.
|
||||
required: true
|
||||
- in: path
|
||||
name: keyName
|
||||
description: The key name of the profile field to delete. It must be either
|
||||
`avatar_url`, `displayname`, or a custom field following the
|
||||
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
|
||||
required: true
|
||||
example: "displayname"
|
||||
schema:
|
||||
type: string
|
||||
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
|
||||
responses:
|
||||
"200":
|
||||
description: The avatar URL was set.
|
||||
description: The profile field was deleted.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object # empty json object
|
||||
type: object
|
||||
examples:
|
||||
response:
|
||||
value: {}
|
||||
"400":
|
||||
description: The request is malformed, contains invalid JSON, or
|
||||
specifies an invalid key.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
bad_json:
|
||||
value:
|
||||
{ "errcode": "M_BAD_JSON", "error": "Malformed request." }
|
||||
invalid_key:
|
||||
value:
|
||||
{
|
||||
"errcode": "M_INVALID_PARAM",
|
||||
"error": "Invalid profile key.",
|
||||
}
|
||||
"403":
|
||||
description: The user is not authorised to delete this profile field.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
forbidden:
|
||||
value:
|
||||
{
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile deletion is not permitted.",
|
||||
}
|
||||
"429":
|
||||
description: This request was rate-limited.
|
||||
content:
|
||||
|
|
@ -167,63 +259,15 @@ paths:
|
|||
$ref: definitions/errors/rate_limited.yaml
|
||||
tags:
|
||||
- User data
|
||||
get:
|
||||
summary: Get the user's avatar URL.
|
||||
description: |-
|
||||
Get the user's avatar URL. This API may be used to fetch the user's
|
||||
own avatar URL or to query the URL of other users; either locally or
|
||||
on remote homeservers.
|
||||
operationId: getAvatarUrl
|
||||
parameters:
|
||||
- in: path
|
||||
name: userId
|
||||
description: The user whose avatar URL to get.
|
||||
required: true
|
||||
example: "@alice:example.com"
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
"200":
|
||||
description: The avatar URL for this user.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
avatar_url:
|
||||
type: string
|
||||
format: uri
|
||||
description: The user's avatar URL if they have set one, otherwise not present.
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"avatar_url": "mxc://matrix.org/SDGdghriugerRg"
|
||||
}
|
||||
"403":
|
||||
x-addedInMatrixVersion: "1.12"
|
||||
description: The server is unwilling to disclose whether the user exists and/or
|
||||
has an avatar URL.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile lookup is disabled on this homeserver"
|
||||
}
|
||||
"404":
|
||||
description: There is no avatar URL for this user or this user does not exist.
|
||||
tags:
|
||||
- User data
|
||||
"/profile/{userId}":
|
||||
get:
|
||||
summary: Get this user's profile information.
|
||||
summary: Get all profile information for a user.
|
||||
description: |-
|
||||
Get the combined profile information for this user. This API may be used
|
||||
to fetch the user's own profile information or other users; either
|
||||
locally or on remote homeservers.
|
||||
Get the complete profile for a user. The response includes `avatar_url`
|
||||
and `displayname` (unless set to `null`, as they can only be strings)
|
||||
plus any custom profile fields.
|
||||
|
||||
**Note**: The complete profile must be under 64 KiB.
|
||||
operationId: getUserProfile
|
||||
parameters:
|
||||
- in: path
|
||||
|
|
@ -243,45 +287,49 @@ paths:
|
|||
properties:
|
||||
avatar_url:
|
||||
type: string
|
||||
format: uri
|
||||
description: The user's avatar URL if they have set one, otherwise not present.
|
||||
format: mx-mxc-uri
|
||||
description: "Avatar URL value (MXC URI format)."
|
||||
displayname:
|
||||
type: string
|
||||
description: The user's display name if they have set one, otherwise not
|
||||
present.
|
||||
additionalProperties:
|
||||
x-addedInMatrixVersion: "1.14"
|
||||
description: Any additional profile field value; may be any
|
||||
valid JSON type, with keys following the
|
||||
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"avatar_url": "mxc://matrix.org/SDGdghriugerRg",
|
||||
"displayname": "Alice Margatroid"
|
||||
}
|
||||
value:
|
||||
{
|
||||
"avatar_url": "mxc://matrix.org/SDGdghriugerRg",
|
||||
"displayname": "Alice Margatroid",
|
||||
"m.example_field": "custom_value",
|
||||
}
|
||||
"403":
|
||||
x-addedInMatrixVersion: "1.2"
|
||||
description: The server is unwilling to disclose whether the user exists and/or
|
||||
has profile information.
|
||||
description: The server is unwilling to disclose whether the user
|
||||
exists and/or has profile information.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile lookup is disabled on this homeserver"
|
||||
}
|
||||
value:
|
||||
{
|
||||
"errcode": "M_FORBIDDEN",
|
||||
"error": "Profile lookup is disabled on this homeserver",
|
||||
}
|
||||
"404":
|
||||
description: There is no profile information for this user or this user does not
|
||||
exist.
|
||||
description: There is no profile information for this user or this
|
||||
user does not exist.
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: definitions/errors/error.yaml
|
||||
examples:
|
||||
response:
|
||||
value: {
|
||||
"errcode": "M_NOT_FOUND",
|
||||
"error": "Profile not found"
|
||||
}
|
||||
value:
|
||||
{ "errcode": "M_NOT_FOUND", "error": "Profile not found" }
|
||||
tags:
|
||||
- User data
|
||||
servers:
|
||||
|
|
|
|||
140
data/schemas/oauth2-client-metadata.yaml
Normal file
140
data/schemas/oauth2-client-metadata.yaml
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
# Copyright 2025 The Matrix.org Foundation C.I.C.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
title: OAuthClientMetadata
|
||||
type: object
|
||||
description: |-
|
||||
This definition of the metadata specifies only the fields that are meaningful
|
||||
in the context of the Matrix specification. All the possible values are
|
||||
registered in the [OAuth Dynamic Client Registration Metadata registry](https://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml#client-metadata),
|
||||
and normative definitions of them are available in their respective RFCs.
|
||||
properties:
|
||||
client_uri:
|
||||
type: string
|
||||
format: uri
|
||||
description: |-
|
||||
A URL to a valid web page that SHOULD give the user more information about
|
||||
the client.
|
||||
|
||||
This URL MUST use the `https` scheme and SHOULD NOT require authentication
|
||||
to access. It MUST NOT use a user or password in the authority component
|
||||
of the URI.
|
||||
|
||||
The server MAY reject client registrations if this field is invalid or
|
||||
missing.
|
||||
|
||||
This URI is a common base for all the other URIs in the metadata: those
|
||||
MUST be either on the same host or on a subdomain of the host of the
|
||||
`client_uri`. The port number, path and query components MAY be different.
|
||||
|
||||
For example, if the `client_uri` is `https://example.com/`, then one of
|
||||
the `redirect_uris` can be `https://example.com/callback` or
|
||||
`https://app.example.com/callback`, but not `https://app.com/callback`.
|
||||
client_name:
|
||||
type: string
|
||||
description: |-
|
||||
Human-readable name of the client to be presented to the user.
|
||||
|
||||
This field can be [localized](/client-server-api/#metadata-localization).
|
||||
logo_uri:
|
||||
type: string
|
||||
format: uri
|
||||
description: |-
|
||||
URL that references a logo for the client.
|
||||
|
||||
This URL MUST use the `https` scheme.
|
||||
|
||||
This field can be [localized](/client-server-api/#metadata-localization).
|
||||
tos_uri:
|
||||
type: string
|
||||
format: uri
|
||||
description: |-
|
||||
URL that points to a human-readable terms of service document for the
|
||||
client.
|
||||
|
||||
This URL MUST use the `https` scheme and SHOULD NOT require authentication
|
||||
to access. It MUST NOT use a user or password in the authority component
|
||||
of the URI.
|
||||
|
||||
If this field is set, the server SHOULD show or link to this URL.
|
||||
|
||||
This field can be [localized](/client-server-api/#metadata-localization).
|
||||
policy_uri:
|
||||
type: string
|
||||
format: uri
|
||||
description: |-
|
||||
URL that points to a human-readable policy document for the client.
|
||||
|
||||
This URL MUST use the `https` scheme and SHOULD NOT require authentication
|
||||
to access. It MUST NOT use a user or password in the authority component
|
||||
of the URI.
|
||||
|
||||
If this field is set, the server SHOULD show or link to this URL.
|
||||
|
||||
This field can be [localized](/client-server-api/#metadata-localization).
|
||||
redirect_uris:
|
||||
type: array
|
||||
description: |-
|
||||
Array of redirection URIs for use in redirect-based flows.
|
||||
|
||||
At least one URI is required to use the authorization code grant.
|
||||
|
||||
The server MUST perform [validation on redirect URIs](/client-server-api/#redirect-uri-validation).
|
||||
items:
|
||||
type: string
|
||||
format: uri
|
||||
description: A redirection URI.
|
||||
response_types:
|
||||
type: array
|
||||
description: |-
|
||||
Array of the OAuth 2.0 response types that the client may use.
|
||||
|
||||
This MUST include the `code` value to use the authorization code grant.
|
||||
|
||||
The server MUST ignore values that it does not understand.
|
||||
items:
|
||||
type: string
|
||||
description: A response type that the client may use.
|
||||
grant_types:
|
||||
type: array
|
||||
description: |-
|
||||
Array of the OAuth 2.0 grant types that the client may use.
|
||||
|
||||
This MUST include:
|
||||
- the `authorization_code` value to use the authorization code grant,
|
||||
- the `refresh_token` value to use the refresh token grant.
|
||||
|
||||
The server MUST ignore values that it does not understand.
|
||||
items:
|
||||
type: string
|
||||
description: A grant type that the client may use.
|
||||
token_endpoint_auth_method:
|
||||
type: string
|
||||
description: |-
|
||||
String indicator of the requested authentication method for the token
|
||||
endpoint.
|
||||
|
||||
The homeserver MUST support the `none` value, as most Matrix clients are
|
||||
client-side only, do not have a server component, and therefore are public
|
||||
clients.
|
||||
application_type:
|
||||
type: string
|
||||
description: |-
|
||||
Kind of the application.
|
||||
|
||||
The homeserver MUST support the `web` and `native` values to be able to
|
||||
perform [redirect URI validation](/client-server-api/#redirect-uri-validation).
|
||||
|
||||
Defaults to `web` if omitted.
|
||||
required:
|
||||
- client_uri
|
||||
Loading…
Reference in a new issue