API - Auth ========== ## Contents - [Notes](#notes) - [Common error codes](#errcode) - [Roles](#roles) - [Service APIs](#service) - [`GET /version` Get service version](#get_version) - [Auth APIs](#auth) - [`GET /auth/api/v1/auth/tokeninfo` Get token information](#get_auth_tokeninfo) - [`POST /auth/api/v1/auth/logout` Log-out the user](#post_auth_logout) - [User information APIs](#user) - [`GET /auth/api/v1/user` Get user information](#get_user) - [`PATCH /auth/api/v1/user` Update user information](#patch_user) - [User administration APIs](#admin) - [`POST /auth/api/v1/user` Create user](#post_admin_user) - [`GET /auth/api/v1/user/count` User count](#get_admin_user_count) - [`GET /auth/api/v1/user/list` User list](#get_admin_user_list) - [`GET /auth/api/v1/user/{userId}` Get user information](#get_admin_user) - [`PATCH /auth/api/v1/user/{userId}` Update user information](#patch_admin_user) - [`DELETE /auth/api/v1/user/{userId}` Delete user](#delete_admin_user) - [Client administration APIs](#client) - [`POST /auth/api/v1/client` Create client](#post_client) - [`GET /auth/api/v1/client/count` Client count](#get_client_count) - [`GET /auth/api/v1/client/list` Client list](#get_client_list) - [`GET /auth/api/v1/client/{clientId}` Get client information](#get_client) - [`PATCH /auth/api/v1/client/{clientId}` Update client information](#patch_client) - [`DELETE /auth/api/v1/client/{clientId}` Delete client](#delete_client) - [`DELETE /auth/api/v1/client/user/{userId}` Delete user clients](#delete_client_user) ## Notes All API requests (except `GET /version`) must have a **Authorization** header with a **Bearer** token. - **Example** ```http GET /auth/api/v1/user HTTP/1.1 Host: localhost Authorization: Bearer 766f29fa8691c81b749c0f316a7af4b7d303e45bf4000fe5829365d37caec2a4 ``` All APIs may respond one of the following status codes: - **200 OK**: The request is success with body. - **204 No Content**: The request is success without body. - **400 Bad Request**: The API request has something wrong. - **401 Unauthorized**: The access token is invalid or expired. - **403 Forbidden**: The user does not have the permission to operate APIs. - **404 Not Found**: The resource (in path) does not exist. - **500 Internal Server Error**: The server is crash or get an unknown error. You should respond to the system administrators to solve the problem. - **503 Service Unavailable**: The server has something wrong. Please try again later. All error responses have the following parameters in JSON format string: - *string* `code`: The error code. - *string* `message`: (**optional**) The error message. - **Example** ```http HTTP/1.1 401 Unauthorized Access-Control-Allow-Origin: * Content-Type: application/json Content-Length: 70 ETag: W/"43-Npr+dy47IJFtraEIw6D8mYLw7Ws" Date: Thu, 13 Jan 2022 07:46:09 GMT Connection: keep-alive {"code":"err_auth","message":"Invalid token: access token is invalid"} ``` ## Common error codes The following are common error codes. The API specific error codes are listed in each API response documents. - **401** `err_auth`: Authorization code error. Please refresh a new token. - **503** `err_db`: Database operation error. Please try again later. - **503** `err_intmsg`: Inter-service communication error. Please try again later. - **404** `err_not_found`: The request resource (normally in path) not found. - **400** `err_param`: Request input format error. Please check request parameters. - **403** `err_perm`: Permission fail. This usually means that API requests with an invalid user role. - **503** `err_rsc`: Resource allocation error. Please try again later. - **500** `err_unknown`: Unknown error. This usually means that the server causes bugs or unexpected errors. ## Roles This system supports the following roles: - `admin`: The system administrator. - `dev`: The 3rd party developer. - `manager`: The system manager who can manage users' information. - `service`: The web service. **Normal user** means users without any roles. # Service APIs ## Get service version Get service name and version information. GET /version? q={query} - *string* `q`: (**optional**) To query the specific information **in plain text**. You can use: - `name`: To query the service name. - `version`: To query current version. #### Response - **200 OK**: Version information. Parameters are: - *object* `data`: - *string* `name`: The service name. - *string* `version`: Current version. - **Example** ```json { "data": { "name": "sylvia-iot-auth", "version": "1.0.0" } } ``` - **Example** when `q=name`: ``` sylvia-iot-auth ``` - **Example** when `q=version`: ``` 1.0.0 ``` # Auth APIs These APIs can be used by all users. ## Get token information Get token information. GET /auth/api/v1/auth/tokeninfo #### Response - **200 OK**: Token information. Parameters are: - *object* `data`: - *string* `userId`: User ID. - *string* `account`: User account. - *string* `name`: User display name. - *object* `roles`: Roles with `{role}:true/false` format. - *string* `clientId`: Associated client ID. - *string[]* `scopes`: Allowed scopes. - **400, 401, 500, 503**: See [Notes](#notes). ## Log-out the user Log-out all the user's sessions with the access token. POST /auth/api/v1/auth/logout #### Response - **204, 400, 401, 500, 503**: See [Notes](#notes). # User information APIs These APIs can be used by all users. ## Get user information Get user self information. GET /auth/api/v1/user #### Response - **200 OK**: User information. Parameters are: - *object* `data`: - *string* `account`: User account. - *string* `createdAt`: Creation time in RFC 3339 format. - *string* `modifiedAt`: Creation time in RFC 3339 format. - *string | null* `verifiedAt`: Verification time in RFC 3339 format. - *object* `roles`: (**present for special roles**) Roles. - *string* `name`: Display name. - *object* `info`: Other information. - **Example** ```json { "data": { "account": "michael-johnson@example.com", "createdAt": "2022-01-01T02:23:47.053Z", "modifiedAt": "2022-01-02T05:17:27.129Z", "validated": "2022-01-01T02:26:52.210Z", "name": "Michael", "info": { "firstName": "Michael", "lastName": "Johnson", "phoneNumber": "0987654321" } } } ``` - **400, 401, 500, 503**: See [Notes](#notes). ## Update user information Update user self information. PATCH /auth/api/v1/user #### Additional HTTP Headers Content-Type: application/json #### Parameters - *object* `data`: - *string* `password`: (**optional**) User password. - *string* `name`: (**optional**) The display name. - *object* `info`: (**optional**) Other information. - **Note**: You must give at least one parameter. - **Example** ```json { "data": { "name": "Michael", "info": { "firstName": "Michael", "lastName": "Johnson", "address": "123, abc road, def city", "phoneNumber": "123456" } } } ``` #### Response - **204 No Content** - **400, 401, 500, 503**: See [Notes](#notes). # User administration APIs These APIs can be used by system administrators only, for managers except: - `GET /auth/api/v1/user/count` - `GET /auth/api/v1/user/list` - `GET /auth/api/v1/user/{userId}` - `PATCH /auth/api/v1/user/{userId}`: (limited) ## Create user Create a user. POST /auth/api/v1/user #### Additional HTTP Headers Content-Type: application/json #### Parameters - *object* `data`: - *string* `account`: User account. Must be **email address** format or the pattern `[A-Za-z0-9]{1}[A-Za-z0-9-_]*`. The account will be transformed to lowercase. - *string* `password`: Password. - *string* `name`: (**optional**) Display name. - *object* `info`: (**optional**) Other information. - *string* `expiredAt`: (**optional**) Set the expiration time in RFC 3339 format. Without this value means this user is never expired and is verified immediately. - **Example** ```json { "data": { "account": "michael-johnson@example.com", "password": "p@ssw0rD", "name": "Michael", "info": { "firstName": "Michael", "lastName": "Johnson", "phoneNumber": "0987654321" } }, "expiredAt": "2022-01-02T02:23:47.053Z" } ``` #### Response - **200 OK**: The user ID. Parameters are: - *object* `data`: - *string* `userId`: The ID of the created user. - **Example** ```json { "data": { "userId": "1641003827053-c2e84RJO" } } ``` - **400 Bad Request**: the special error codes are: - `err_auth_user_exist`: The account has been used. - **401, 403, 500, 503**: See [Notes](#notes). ## User count Get user list count. GET /auth/api/v1/user/count? account={specifiedAccount}& contains={word} - *string* `account`: (**optional**) To search the specified account. This is case insensitive and excludes **contains**. - *string* `contains`: (**optional**) To search accounts which contain the specified word. This is case insensitive. #### Response - **200 OK**: User list count. Parameters are: - *object* `data`: - *number* `count`: User list count. - **Example** ```json { "data": { "count": 2 } } ``` - **400, 401, 403, 500, 503**: See [Notes](#notes). ## User list Get user list. GET /auth/api/v1/user/list? account={specifiedAccount}& contains={word}& fields={displayFields}& offset={offset}& limit={limit}& sort={sortKeysAndOrders}& format={responseFormat} - *string* `account`: (**optional**) To search the specified account. This is case insensitive and excludes **contains**. - *string* `contains`: (**optional**) To search accounts which contain the specified word. This is case insensitive. - *string* `fields`: (**optional**) To display more data fields with comma separated format. **expired**, **disabled** can be used. For example, `fields=expired,disabled`. - *number* `offset`: (**optional**) Data offset. Default is **0**. - *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**. - *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **account**, **created**, **modified**, **verified**, **name**. Default is **account:asc**. - *string* `format`: (**optional**) Response body format. Default is array in the **data** field. - **array**: The response body is JSON array, not an object. #### Response - **200 OK**: An array that contains all users' information. Parameters are: - *object[]* `data`: - *string* `userId`: User ID. - *string* `account`: User account. - *string* `createdAt`: Creation time in RFC 3339 format. - *string* `modifiedAt`: Modification time in RFC 3339 format. - *string | null* `verifiedAt`: Verification time in RFC 3339 format. - *string | null* `expiredAt`: (**optional**) Expiration time in RFC 3339 format. - *string | null* `disabledAt`: (**optional**) Disabled time in RFC 3339 format. - *object* `roles`: Roles. - *string* `name`: Display name. - *object* `info`: Other information. - **Example** ```json { "data": [ { "userId": "1640921188987-x51FTVPD", "account": "admin@example.com", "createdAt": "2021-12-31T03:26:28.987Z", "modifiedAt": "2021-12-31T03:26:28.987Z", "verifiedAt": "2021-12-31T03:26:28.987Z", "expiredAt": null, "disabledAt": null, "roles": { "admin": true }, "name": "System administrator", "info": { "phoneNumber": "1234567890" } }, { "userId": "1641003827053-c2e84RJO", "account": "michael-johnson@example.com", "created": "2022-01-01T02:23:47.053Z", "modifiedAt": "2022-01-02T05:17:27.129Z", "validated": "2022-01-01T02:26:52.210Z", "expiredAt": null, "disabledAt": null, "roles": {}, "name": "Michael", "info": { "firstName": "Michael", "lastName": "Johnson", "phoneNumber": "0987654321" } } ] } ``` - **Example (format=`array`)** ```json [ { "userId": "1640921188987-x51FTVPD", "account": "admin@example.com", "createdAt": "2021-12-31T03:26:28.987Z", "modifiedAt": "2021-12-31T03:26:28.987Z", "verifiedAt": "2021-12-31T03:26:28.987Z", "expiredAt": null, "disabledAt": null, "roles": { "admin": true }, "name": "System administrator", "info": { "phoneNumber": "1234567890" } } ] ``` - **400, 401, 403, 500, 503**: See [Notes](#notes). ## Get user information Get the specified user information. GET /auth/api/v1/user/{userId} - *string* `userId`: The specified user ID to get user information. #### Response - **200 OK**: - *object* `data`: An object that contains the user information. See [User administration APIs - User list](#get_admin_user_list). - **400, 401, 403, 500, 503**: See [Notes](#notes). - **404 Not Found**: The specified user does not exist. ## Update user information Update the specified user information. PATCH /auth/api/v1/user/{userId} - *string* `userId`: The specified user ID to update user information. #### Additional HTTP Headers Content-Type: application/json #### Parameters - *object* `data`: (**optional**) - *string* `verifiedAt`: (**optional for admin**) The validation date time in RFC 3339 format. The **expiredAt** field will be set to **null**. - *object* `roles`: (**optional**) Roles. The content must be booleans. Only administrators can set to roles **admin** and **service**. - *string* `password`: (**optional for admin**) User password. - *string* `name`: (**optional for admin**) The display name. - *object* `info`: (**optional for admin**) Other information. You must provide full of fields, or all fields will be replaced with the new value. - *bool* `disable`: (**optional**) **true** to disable the user and **false** to enable the user. The permissions are: - **admin**: (all) - **manager**: service, user - **Note**: You must give at least one parameter. - **Example** ```json { "data": { "roles": { "developer": true }, "info": { "firstName": "Michael", "lastName": "Johnson", "address": "123, abc road, def city", "phoneNumber": "123456" } }, "disable": false } ``` #### Response - **204 No Content** - **400, 401, 403, 500, 503**: See [Notes](#notes). - **404 Not Found**: The specified user does not exist. ## Delete user Delete a user. One cannot delete himself/herself. DELETE /auth/api/v1/user/{userId} - *string* `userId`: The specified user ID to delete. #### Response - **204 No Content** - **401, 403, 500, 503**: See [Notes](#notes). # Client administration APIs These APIs can be used by system administrators and developers only, except: - `DELETE /auth/api/v1/client/user/{userId}`: for administrators. ## Create client Create a client. POST /auth/api/v1/client #### Additional HTTP Headers Content-Type: application/json #### Parameters - *object* `data`: - *string[]* `redirectUris`: Allowed redirect URIs. - *string[]* `scopes`: Allowed scopes in `[a-z0-9]+([\.]{1}[a-z0-9])*` format. - *string* `userId`: (**optional for administrators**) Assign to the specified user. - *string* `name`: Client name. - *string* `image`: (**optional**) The URI of the client icon. - *boolean* `credentials`: (**optional**) Create the client with secret. Default is **false**. #### Response - **200 OK**: The client ID. Parameters are: - *object* `data`: - *string* `clientId`: The ID of the created client. - **Example** ```json { "data": { "clientId": "1641040728318-zyAnDK9I" } } ``` - **400 Bad Request**: the special error codes are: - `err_auth_user_not_exist`: The user ID does not exist. - **401, 403, 500, 503**: See [Notes](#notes). ## Client count Get client list count. GET /auth/api/v1/client/count? user={userId} - *string* `user`: (**optional for administrators**) The specified user ID. #### Response - **200 OK**: Client list count. Parameters are: - *object* `data`: - *number* `count`: Client list count. - **Example** ```json { "data": { "count": 2 } } ``` - **400, 401, 403, 500, 503**: See [Notes](#notes). ## Client list Get client list. GET /auth/api/v1/client/list? user={userId}& offset={offset}& limit={limit}& sort={sortKeysAndOrders}& format={responseFormat} - *string* `user`: (**optional for administrators**) The specified user ID. - *number* `offset`: (**optional**) Data offset. Default is **0**. - *number* `limit`: (**optional**) Number of items to list. **0** to list all data. Default is **100**. - *string* `sort`: (**optional**) To sort the result. Format is `key:[asc|desc]`. The key can be **created**, **modified**, **name**. Default is **name:asc**. - *string* `format`: (**optional**) Response body format. Default is array in the **data** field. - **array**: The response body is JSON array, not an object. - **Note**: Administrators can get all clients and developers can only get their own clients. #### Response - **200 OK**: An empty array or an array that contains all clients' information. Parameters are: - *object* `data`: - *string* `clientId`: Client ID. - *string* `createdAt`: Creation time in RFC 3339 format. - *string* `modifiedAt`: Modification time in RFC 3339 format. - *string | null* `clientSecret`: Client secret. **null** means that this is a public client. - *string[]* `redirectUris`: Allowed redirect URIs. - *string[]* `scopes`: Allowed scopes. - *string* `userId`: (**optional for administrators**) User ID that is associated with the client. - *string* `name`: Client name. - *string | null* `image`: The URI of the client icon. - **Example** ```json { "data": [ { "clientId": "1641040728318-zyAnDK9I", "createdAt": "2022-01-01T12:38:48.318Z", "modifiedAt": "2022-01-01T12:38:48.318Z", "clientSecret": "G3LCtKsJvB3nrkA4CnIH3IUVF+BKMHXHTXbzgNF6REU", "redirectUris": [ "https://localhost/oauth2/desktop" ], "scopes": [ "user.rw", "client.rw" ], "name": "OAuth2 App", "image": "https://localhost/oauth2/app.png" }, { "clientId": "1641042262366-1HTBqdPg", "createdAt": "2022-01-01T13:04:22.366Z", "modifiedAt": "2022-01-02T07:52:38.129Z", "redirectUris": [ "https://exmaple.com/oauth2/redirect/uri" ], "scopes": [ "user.rw", "client.rw" ], "name": "OAuth2 Web", "image": "https://example.com/oauth2/web.png" } ] } ``` - **Example (format=`array`)** ```json [ { "clientId": "1641040728318-zyAnDK9I", "createdAt": "2022-01-01T12:38:48.318Z", "modifiedAt": "2022-01-01T12:38:48.318Z", "clientSecret": "G3LCtKsJvB3nrkA4CnIH3IUVF+BKMHXHTXbzgNF6REU", "redirectUris": [ "https://localhost/oauth2/desktop" ], "scopes": [ "user.rw", "client.rw" ], "name": "OAuth2 App", "image": "https://localhost/oauth2/app.png" } ] ``` - **400, 401, 403, 500, 503**: See [Notes](#notes). ## Get client information Get the specified client information. GET /auth/api/v1/client/{clientId} - *string* `clientId`: The specified client ID to get client information. #### Response - **200 OK**: - *object* `data`: An object that contains the client information. See [Client administration APIs - Client list](#get_client_list). - **400, 401, 403, 500, 503**: See [Notes](#notes). - **404 Not Found**: The specified client does not exist. ## Update client information Update the specified client information. PATCH /auth/api/v1/client/{clientId} - *string* `clientId`: The specified client ID to update client information. #### Additional HTTP Headers Content-Type: application/json #### Parameters - *object* `data`: (**optional**) - *string[]* `redirectUris`: (**optional**) Allowed redirect URIs. - *string[]* `scopes`: (**optional**) Allowed scopes in `[a-z0-9]+([\.]{1}[a-z0-9])*` format. - *string* `name`: (**optional**) Client name. - *string | null* `image`: (**optional**) The URI of the client icon. - *boolean* `regenSecret`: (**optional**) Re-generate secret of the private client. Default is **false**. - **Note**: You must give at least one parameter. - **Example** ```json { "data": { "name": "New client name" } } ``` #### Response - **204 No Content** - **400, 401, 403, 500, 503**: See [Notes](#notes). - **404 Not Found**: The specified client does not exist. ## Delete client Delete a client. One client cannot delete itself. DELETE /auth/api/v1/client/{clientId} - *string* `clientId`: The specified client ID to delete. #### Response - **204 No Content** - **400, 401, 403, 500, 503**: See [Notes](#notes). ## Delete user clients Delete all clients of the specified user. DELETE /auth/api/v1/client/user/{userId} - *string* `userId`: The specified user ID. #### Response - **204 No Content** - **400, 401, 403, 500, 503**: See [Notes](#notes).