Add support for Profile feature in REST Identity store (Fix #91)
This commit is contained in:
@@ -3,38 +3,45 @@ The REST backend allows you to query identity data in existing webapps, like:
|
||||
- Forums (phpBB, Discourse, etc.)
|
||||
- Custom Identity stores (Keycloak, ...)
|
||||
- CRMs (Wordpress, ...)
|
||||
- self-hosted clouds (Nextcloud, ownCloud, ...)
|
||||
- Self-hosted clouds (Nextcloud, ownCloud, ...)
|
||||
|
||||
To integrate this backend with your webapp, you will need to implement three specific REST endpoints detailed below.
|
||||
To integrate this backend with your webapp, you will need to implement the REST endpoints described below.
|
||||
|
||||
## Features
|
||||
| Name | Supported? |
|
||||
|----------------|------------|
|
||||
| Authentication | Yes |
|
||||
| Directory | Yes |
|
||||
| Identity | Yes |
|
||||
| Profile | No |
|
||||
| Name | Supported? |
|
||||
|-------------------------------------------------|------------|
|
||||
| [Authentication](../features/authentication.md) | Yes |
|
||||
| [Directory](../features/directory.md) | Yes |
|
||||
| [Identity](../features/identity.md) | Yes |
|
||||
| [Profile](../features/profile.md) | Yes |
|
||||
|
||||
## Configuration
|
||||
| Key | Default | Description |
|
||||
|----------------------------------|------------------------------------------------|------------------------------------------------------|
|
||||
| `rest.enabled` | `false` | Globally enable/disable the REST backend |
|
||||
| `rest.host` | *None* | Default base URL to use for the different endpoints. |
|
||||
| `rest.endpoints.auth` | `/_mxisd/backend/api/v1/auth/login` | Validate credentials and get user profile |
|
||||
| `rest.endpoints.directory` | `/_mxisd/backend/api/v1/directory/user/search` | Search for users by arbitrary input |
|
||||
| `rest.endpoints.identity.single` | `/_mxisd/backend/api/v1/identity/single` | Endpoint to query a single 3PID |
|
||||
| `rest.endpoints.identity.bulk` | `/_mxisd/backend/api/v1/identity/bulk` | Endpoint to query a list of 3PID |
|
||||
| Key | Default | Description |
|
||||
|--------------------------------------|------------------------------------------------|------------------------------------------------------|
|
||||
| `rest.enabled` | `false` | Globally enable/disable the REST backend |
|
||||
| `rest.host` | *None* | Default base URL to use for the different endpoints. |
|
||||
| `rest.endpoints.auth` | `/_mxisd/backend/api/v1/auth/login` | Validate credentials and get user profile |
|
||||
| `rest.endpoints.directory` | `/_mxisd/backend/api/v1/directory/user/search` | Search for users by arbitrary input |
|
||||
| `rest.endpoints.identity.single` | `/_mxisd/backend/api/v1/identity/single` | Endpoint to query a single 3PID |
|
||||
| `rest.endpoints.identity.bulk` | `/_mxisd/backend/api/v1/identity/bulk` | Endpoint to query a list of 3PID |
|
||||
| `rest.endpoints.profile.displayName` | `/_mxisd/backend/api/v1/profile/displayName` | Query the display name for a Matrix ID
|
||||
| `rest.endpoints.profile.threepids` | `/_mxisd/backend/api/v1/profile/threepids` | Query the 3PIDs for a Matrix ID
|
||||
| `rest.endpoints.profile.roles` | `/_mxisd/backend/api/v1/profile/roles` | Query the Roles for a Matrix ID
|
||||
|
||||
Endpoint values can handle two formats:
|
||||
- URL Path starting with `/` that gets happened to the `rest.host`
|
||||
- Full URL, if you want each endpoint to go to a specific server/protocol/port
|
||||
|
||||
If an endpoint value is configured as an empty string, it will disable that specific feature, essentially bypassing the
|
||||
Identity store for that specific query.
|
||||
|
||||
`rest.host` is mandatory if at least one endpoint is not a full URL.
|
||||
|
||||
## Endpoints
|
||||
### Authentication
|
||||
HTTP method: `POST`
|
||||
Content-type: JSON UTF-8
|
||||
- Method: `POST`
|
||||
- Content-Type: `application/json` (JSON)
|
||||
- Encoding: `UTF8`
|
||||
|
||||
#### Request Body
|
||||
```json
|
||||
@@ -87,8 +94,9 @@ If the authentication succeed:
|
||||
```
|
||||
|
||||
### Directory
|
||||
HTTP method: `POST`
|
||||
Content-type: JSON UTF-8
|
||||
- Method: `POST`
|
||||
- Content-Type: `application/json` (JSON)
|
||||
- Encoding: `UTF8`
|
||||
|
||||
#### Request Body
|
||||
```json
|
||||
@@ -113,7 +121,7 @@ If users found:
|
||||
"user_id": "UserIdLocalpart"
|
||||
},
|
||||
{
|
||||
...
|
||||
"...": "..."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -129,10 +137,11 @@ If no user found:
|
||||
|
||||
### Identity
|
||||
#### Single 3PID lookup
|
||||
HTTP method: `POST`
|
||||
Content-type: JSON UTF-8
|
||||
- Method: `POST`
|
||||
- Content-Type: `application/json` (JSON)
|
||||
- Encoding: `UTF8`
|
||||
|
||||
#### Request Body
|
||||
##### Request Body
|
||||
```json
|
||||
{
|
||||
"lookup": {
|
||||
@@ -142,7 +151,7 @@ Content-type: JSON UTF-8
|
||||
}
|
||||
```
|
||||
|
||||
#### Response Body
|
||||
##### Response Body
|
||||
If a match was found:
|
||||
- `lookup.id.type` supported values: `localpart`, `mxid`
|
||||
```json
|
||||
@@ -164,10 +173,11 @@ If no match was found:
|
||||
```
|
||||
|
||||
#### Bulk 3PID lookup
|
||||
HTTP method: `POST`
|
||||
Content-type: JSON UTF-8
|
||||
- Method: `POST`
|
||||
- Content-Type: `application/json` (JSON)
|
||||
- Encoding: `UTF8`
|
||||
|
||||
#### Request Body
|
||||
##### Request Body
|
||||
```json
|
||||
{
|
||||
"lookup": [
|
||||
@@ -183,7 +193,7 @@ Content-type: JSON UTF-8
|
||||
}
|
||||
```
|
||||
|
||||
#### Response Body
|
||||
##### Response Body
|
||||
For all entries where a match was found:
|
||||
- `lookup[].id.type` supported values: `localpart`, `mxid`
|
||||
```json
|
||||
@@ -215,3 +225,46 @@ If no match was found:
|
||||
"lookup": []
|
||||
}
|
||||
```
|
||||
|
||||
### Profile
|
||||
#### Request Body
|
||||
For all requests, the values are the same:
|
||||
- Method: `POST`
|
||||
- Content-Type: `application/json` (JSON)
|
||||
- Encoding: `UTF8`
|
||||
|
||||
With body (example values):
|
||||
##### Request Body
|
||||
```json
|
||||
{
|
||||
"mxid": "@john.doe:example.org",
|
||||
"localpart": "john.doe",
|
||||
"domain": "example.org"
|
||||
}
|
||||
```
|
||||
#### Response Body
|
||||
For all responses, the same object structure will be parsed, making the non-relevant fields as optional.
|
||||
|
||||
Structure with example values:
|
||||
```json
|
||||
{
|
||||
"profile": {
|
||||
"display_name": "John Doe",
|
||||
"threepids": [
|
||||
{
|
||||
"medium": "email",
|
||||
"address": "john.doe@example.org"
|
||||
},
|
||||
{
|
||||
"...": "..."
|
||||
}
|
||||
],
|
||||
"roles": [
|
||||
"DomainUsers",
|
||||
"SalesOrg",
|
||||
"..."
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
The base `profile` key is mandatory. `display_name`, `threepids` and `roles` are only to be returned on the relevant request.
|
||||
|
||||
Reference in New Issue
Block a user