本文档包含所有的HTTP API接口描述,并提供在线测试工具。
同时,得益于Callme HTTP Adapter,本系统所有HTTP API接口都可以通过RPC方式调用(详情见下文)
注意:请仔细阅读本文档之后,再实际使用下文揭示的HTTP API接口。
注意:在本页面的操作与实际调用HTTP API具有相同效果,请小心演绎。
注意:无论是从本文档发起调用,还是从浏览器、命令行curl或通过RPC调用,都具有完全相同的效果。所以只要能够从本文档正常发起调用,即可认为HTTP API能够正常使用,故请优先检查自身代码。
本系统接口URL一般规则如下:
/api/{版本}/{操作对象}/{下级操作对象}/{...}/do/{动作}
对于一般的CRUD操作而言,本系统API主要提供以下几种接口:
GET /api/{版本}/{操作对象}/do/listGET /api/{版本}/{操作对象}/{操作对象ID}/do/getPOST /api/{版本}/{操作对象}/do/addPOST /api/{版本}/{操作对象}/{操作对象ID}/do/modifyGET /api/{版本}/{操作对象}/{操作对象ID}/do/delete注意:根据具体业务不同,有的操作对象可能并不会提供所有的上述接口;有的操作对象可能有额外的接口。
注意:超出上述范畴的API以API文档为准。
此外,API接口均使用JSON进行数据交换,且一般情况下,字段名称、字符串常量值使用littleCamel风格。如:
{
"error" : 200,
"message": "",
"data" : null,
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
除了一般情况下使用到的littleCamel风格的字段名外,有时会使用到下划线表示关联字段。如:
{
"error" : 200,
"message": "",
"data": {
"seq" : 1,
"id" : "data-xxxxxxxxxxxxxxxxxxxxxx",
"name" : "XXXX",
"note" : null,
"createTime": "2018-08-29T12:47:00.000Z",
"updateTime": "2018-08-29T12:47:00.000Z",
"o_id" : "o-xxxxxxxx",
"o_uniqueId": "o-xxxxxxxx",
"o_name" : "xxxxxxxx Organization"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
在上述数据中,data.seq至data.createTime使用littleCamel风格,属于接口操作对象的本身具有的字段。而data.o_id至data.o_name则表示所关联企业的ID、名称等字段,属于关联字段。
为了避免相同字段名冲突,以及明确字段意义。本系统中,操作对象本身具有的字段使用littleCamel风格。而关联对象的字段以<对象简称>_<littleCamel风格的关联对象字段名>方式命名。
本系统内对象的全称与简称举例如下:
| 对象 | 全称 | 全称(复数) | 简称 |
|---|---|---|---|
| 用户 | user |
users |
u |
| 组织 | organization |
organizations |
o |
注:在URL中,使用中杠连接风格,如
user-info。
由于本系统使用Node.js开发,所以在JSON数据交换时,均使用littleCamel风格。
但不可避免的是,本系统在与外部系统交互时接收到的JSON数据未必同样使用littleCamel风格来命名字段。如:
my_variableBigCamel风格:InstanceId为了避免不必要的麻烦,所有来自外部不可控系统的JSON数据,无论命名规则如何,都会保留原有的命名规则。
本系统API设计与教科书版RESTful风格接口非常相似,但是并没有使用教科书中的GET、POST、PUT、DELETE、PATCH等HTTP动词。而仅仅使用了最常用的GET和POST,分别用于需要或不需要提交数据的接口。同时,在接口结尾增加/do/{动作},来指明具体的动作行为。
这么做的目的在于避免牵强地套用RESTful的风格(如:如何为用户注册、登陆的过程进行RESTful建模?)。同时降低客户端的开发成本(有些语言的HTTP包并不支持自定义HTTP动词)。
根据业务不同,有些接口需要认证(即用户登录)后才可调用,有些则允许直接调用。
可以根据每个API文档的需要登录标签了解接口是否需要认证。
此认证方式由本系统的登录接口实现。
登录成功后,登录接口会返回一个xWatAuthToken作为之后调用其他API时的凭证。此凭证存在有效时间限制(默认为2小时)。但每当此凭证发送至本系统,系统会自动刷新此凭证的有限时间。
根据业务需要和配置,凭证可以通过多种方式发送:
X-WAT-Auth-Token字段,可配置为禁用)xWatAuthToken参数,可配置为禁用)注意:
一般页面的请求作为例外,始终支持Cookies方式传递凭证。
正式环境部署时,可单独针对API请求禁用通过Cookies传递凭证,但不影响一般页面通过Cookies传递凭证。
内建认证仅作为调试使用,不推荐提供给用户直接使用。
所有的API接口都有通用的返回值字段,客户端可以根据这些字段来判断API调用成功与否。
当API调用成功后返回的JSON中,包含以下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| error | Number | 固定为200,表示成功。 |
| message | String | 固定为空字符串,表示无特殊说明。 |
| data | Number, String, Array, JSON | 返回数据,具体类型根据业务不同而不同。 |
| traceId | String | 已TRACE-开头的请求ID,可用于日志查询等。 |
| reqCost | Number | 本次接口调用耗时(毫秒)。 |
data字段具体说明见下文
一个典型的API调用成功返回值JSON如下:
{
"error" : 200,
"message": "",
"data" : {...},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
当API调用失败后返回的JSON中,包含以下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| error | Number | 4xx.xx,表示客户端错误;5xx.xx表示服务端错误。 |
| message | String | 错误的文案说明,可用于UI显示。 |
| reason | String | 错误的标签名称,可用于程序判断。 |
| detail | JSON | 错误详情,具体类型根据业务不同而不同。 |
| traceId | String | 以TRACE-开头的请求ID,可用于日志查询等。 |
一个典型的API调用失败返回值JSON如下:
{
"error" : 404.41,
"message": "No such instance",
"reason" : "EClientNotFound",
"detail": {
"id": "xxx"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
此类接口主要用于获取操作对象列表。请求方式如下:
GET /api/v1/{操作对象}/do/list
如:
GET /api/v1/data/do/list
绝大部分列表接口都支持分页,客户端可以指定页号(从1开始)和每页记录条数(默认5,最大1000。可由配置文件修改)。
可以根据每个API文档的支持分页标签了解接口是否支持分页。
分页参数如下:
| 名称 | 位置 | 说明 |
|---|---|---|
| pageNumber | URL Query | 可选,默认为1。 |
| PageSize | URL Query | 可选,默认为5。 |
如:
GET /api/v1/data/do/list?pageNumber=1&pageSize=10
绝大部分列表接口都支持过滤条件,客户端可以指定通用搜索_search或具体字段进行过滤。
可以根据每个API文档的详情了解所支持的过滤条件
如:
GET /api/v1/data/do/list?_search=XXXXX
再如:
GET /api/v1/data/do/list?name=XXXXX
列表接口的返回值data字段是一个包含若干个JSON的数组。此外,在支持分页的列表接口返回值中,会额外具有一个pageInfo字段表示分页信息。
分页信息如下:
| 名称 | 类型 | 分页方式 | 说明 |
|---|---|---|---|
| count | Integer | 普通分页/标记分页 | 本页记录数 |
| totalCount | Integer | 普通分页 | 满足条件的记录总数 |
| pageSize | Integer | 普通分页/标记分页 | 实际每页最多记录数 |
| pageNumber | Integer | 普通分页 | 当前页号 |
| pageCount | Integer | 普通分页 | 总分页数量 |
| pageMarkerField | String | 标记分页 | 分页标记字段 |
| pageMarker | Any | 标记分页 | 下一页标记值 |
一个典型的列表接口返回值如下(普通分页):
{
"error" : 200,
"message": "",
"data": [
{
"seq" : 1,
"id" : "data-xxxxxxxxxxxxxxxxxxxxxx",
"name" : "XXXX",
"note" : null,
"createTime": "2018-08-29T12:47:00.000Z",
"updateTime": "2018-08-29T12:47:00.000Z"
}
],
"pageInfo": {
"count" : 1,
"totalCount" : 1,
"pageSize" : 10,
"pageNumber" : 1,
"pageCount" : 1,
"pageMarkerField": null,
"pageMarker" : null
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
一个典型的列表接口返回值如下(标记分页):
{
"error" : 200,
"message": "",
"data": [
{
"seq" : 1,
"id" : "data-xxxxxxxxxxxxxxxxxxxxxx",
"name" : "XXXX",
"note" : null,
"createTime": "2018-08-29T12:47:00.000Z",
"updateTime": "2018-08-29T12:47:00.000Z"
}
],
"pageInfo": {
"count" : 1,
"totalCount" : null,
"pageSize" : 10,
"pageNumber" : null,
"pageCount" : null,
"pageMarkerField": "seq",
"pageMarker" : 1
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
此类接口主要用于获取操作对象详情。请求方式如下:
GET /api/v1/{操作对象}/{操作对象ID}/do/get
如:
GET /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/get
获取的返回值data字段是一个JSON对象。
一个典型的列表接口返回值如下:
{
"error" : 200,
"message": "",
"data": {
"seq" : 1,
"id" : "data-xxxxxxxxxxxxxxxxxxxxxx",
"name" : "XXXX",
"note" : null,
"createTime": "2018-08-29T12:47:00.000Z",
"updateTime": "2018-08-29T12:47:00.000Z"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
此类接口主要用于添加操作对象。请求方式如下:
POST /api/v1/{操作对象}/do/add
{
"data": {
...
}
}
如:
POST /api/v1/data/do/add
{
"data": {
"name": "XXXXX",
"note": "Just Test!"
}
}
添加接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示新建对象的ID。
一个典型的列表接口返回值如下:
{
"error" : 200,
"message": "",
"data": {
"id": "data-xxxxxxxxxxxxxxxxxxxxxx"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
此类接口主要用于修改操作对象,请求方式如下:
POST /api/v1/{操作对象}/{操作对象ID}/do/modify
{
"data": {
...
}
}
如:
POST /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/modify
{
"data": {
"name": "YYYYY"
}
}
修改接口可以根据需要仅对部分字段进行修改,故相对于添加接口必选字段很少。
修改接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示被修改操作对象的ID。
一个典型的列表接口返回值如下:
{
"error" : 200,
"message": "",
"data": {
"id": "data-xxxxxxxxxxxxxxxxxxxxxx"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
此类接口主要用于删除操作对象,请求方式如下:
GET /api/v1/{操作对象}/{操作对象ID}/do/delete
如:
GET /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/delete
注意:一般来说,被删除的内容无法恢复,客户端在调用此接口前应当要求用户确认后方可进行
删除接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示被删除操作对象的ID。
一个典型的列表接口返回值如下:
{
"error" : 200,
"message": "",
"data": {
"id": "data-xxxxxxxxxxxxxxxxxxxxxx"
},
"traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
"reqCost": 100
}
本系统中大多数字段,根据用途都有相同的字段类型。
本系统常用的字段及其类型如下:
| 字段 | 本API文档中类型 | MySQL DDL中类型 | 举例 |
|---|---|---|---|
| 序号类 | Integer | BIGINT(20) UNSIGNED |
seq / actSeq |
| ID类 | String | CHAR(65) BINARY (就是区分大小写的意思) |
accountId / issueId |
| 枚举类 | Enum | VARCHAR(64) |
type / levle / status |
| KEY类 | String | VARCHAR(64) |
checkKey / uniqueMarker |
| 名称类 | String | VARCHAR(256) |
name |
| 备注类(明显不会很长) | String | VARCHAR(256) |
country / city / zip |
| 备注类(明显会很长或无法预估) | String | TEXT(65535,UTF8) |
note / address |
| JSON类 | JSON | JSON |
metaJSON / extraJSON |
| 布尔值类 | Boolean | TINYINT(1) 并转换为true/false格式输出 |
isDisabled / isTicket |
| 日期类 | String | TIMESTAMP 并转换为ISO日期格式输出 |
createTime / expireTime |
| 时间戳 | Integer | INT(11) |
dumpTimestamp |
根据字段意义特别指定的类型如下:
| 字段 | 本API文档中类型 | MySQL DDL中类型 | 举例 |
|---|---|---|---|
| 邮箱 | String | VARCHAR(256) |
email |
| 手机固话 | String | VARCHAR(32) |
mobile / telephone |
| 语言 | String | VARCHAR(10) |
locale |
| MD5值 | String | CHAR(32) |
md5Sum |
| 文件大小(字节) | Integer | INT(11) |
byteSize |
| 文件名 | String | TEXT(65535,UTF8) |
originalFileName |
| 文件路径/URL地址 | String | TEXT(65535,UTF8) |
webhookURL |
| HOST名 | String | VARCHAR(128) |
host |
Access Key访问本系统第三方系统可以通过Access Key ID和Access Secret(下称AK)来访问本系统。
AK可以在Access Key管理页面生成AK。
对请求进行签名需要以下字段:
| 字段 | 描述 | 示例 |
|---|---|---|
| AK时间戳 | 当前UNIX时间戳(秒) | 1527532323 |
| AK随机数 | 一个随机字符串 | 0.15029408624960117 |
| HTTP方法 | 全大写HTTP方法 | POST |
| 完整请求URL | 请求URL(包含Quey参数) | /api/v1/path?a=1&b=2 |
| AK签名算法版本 | v2新增字段。v1不用传递 |
v2 |
| 原始请求体MD5值 | v2新增字段。无请求体的以空字符串''计算MD5值 |
d41d8cd98f00b204e9800998ecf8427e |
目前支持v1和v2两种签名算法:
v1签名为:Hmac-SHA1("<AK时间戳>&<AK随机数>&<HTTP方法>&<完整请求URL>", <AK Secret>)
v2签名为:Hmac-SHA1("<AK签名算法版本>&<AK时间戳>&<AK随机数>&<HTTP方法>&<完整请求URL>&<原始请求体MD5值>", <AK Secret>)
| 请求头 | 描述 | 示例 |
|---|---|---|
X-Wat-Ak-Id |
Access Key ID | ak-abcde12345 |
X-Wat-Ak-Timestamp |
签名时所使用的UNIX时间戳 | 1527532323 |
X-Wat-Ak-Nonce |
签名时所使用的随机字符串 | 0.15029408624960117 |
X-Wat-Ak-Sign |
签名结果 | 431f70c44d5f7c97dcc87c20060e2480acdf3a04 |
X-Wat-Ak-Sign-Version |
AK签名算法版本,v2新增字段,v1不用传递 |
v2 |
至此,发送请求即可
每个AK支持添加一个URL作为Webhook触发时的调用地址。
当特定的API被调用成功后,系统会向所有Webhook URL发送请求并包含相关信息。
系统在向Webhook URL发送请求时,也会按照上述相同的AK签名方式对请求进行签名。
本项目已提供了一些已经实现的HTTP客户端,方便第三方系统使用,详见:
| 编程语言 | 文件地址 | 描述 |
|---|---|---|
| Python | sdk/wat_sdk.py |
无依赖、支持所有操作。 兼容Python 2.6 ~ 3.7。(文件上传依赖requests包) |
| Node.js | sdk/wat_sdk.js |
无依赖、无需编译。(文件上传依赖form-data包) |
| Golang | sdk/main.go |
无依赖。(注意使用时需要修改package名称) |
设计文档见链接。
由于CoreStone 本身也作为一个API 网关的角色存在, 并且在处理请求时,按照请求头中的Host 字段来区分请求的具体处理方式。
所以在部署CoreStone 时,对域名配置有一定要求。
CoreStone 系统中的转发系统包含业务系统、接收命名空间、前端域名、后端域名、转发规则、模拟规则概念,简要逻辑如下:
设计文档见链接。
部署CoreStone 时,需要有一个域名指向CoreStone 本身,
用于判断是否请求目标为CoreStone 本身的API。如:core-stone.cloudcare.cn。
与此同时,将此域名写入配置文件中的coreStone.hostnames(数组)字段中。
当CoreStone 接收到Host 头为CoreStone 本身的域名时,会自行处理,而不会转发到后端服务器。
直接在CoreStone 界面上操作,注意使用有意义的名称即可。
每个业务系统都需要有配置接收命名空间(支持多个)。
对于已登录的用户,当请求试图转发至某个业务系统时, CoreStone 首先会检查是否接收此用户所属的命名空间。
如接受此用户所属的命名空间,则按照正常登录用户流程转发请求。
如验证未通过,请求依然会转发到后端域名, 但不会包含有关用户的信息(即作为未登录用户的请求)。
前端域名指的是客户端(浏览器、手机APP等)发起请求时的请求地址(包含在Host 请求头中)。
这个域名需要在公网能解析,同时都指向CoreStone 服务器,
如: shine-via-core-stone.cloudcare.cn
此地址允许直接填写IP地址。
后端域名指的是客户端发起的请求最终的转发目的地址。
这个域名只需要CoreStone 能够解析即可(如内网DNS,内网IP和Port),
如:192.168.1.100:8088
此地址允许直接填写IP地址。
一般针对每一个业务系统,都需要在CoreStone 中配置一个前端域名(允许多个), 和一个后端域名(允许多个,但必须设置一个为默认)。
对于多个前端域名,客户端无论请求哪个前端域名效果都相同。
对于多个后端域名,客户端的请求在转发时,无特殊规则都会转发到默认后端域名。 在此基础上,可以配置某个团队下所有/部分登录账号的请求转发到指定的后端域名, 以实现类似灰度发布/AB测试等效果。
注意:前端域名不能与后端域名相同,否则可能会导致请求循环转发
每个业务系统都会有一个默认转发的后端地址。
在此基础上,可以针对某个团队下的所有/部分登录账号指定转发目标。
此功能主要用于测试/灰度发布/AB测试等用途。
每个业务系统可以配置模拟规则。
当请求匹配HTTP 请求方法、URL 地址(支持/data/:param语法)时,
CoreStone 会直接返回预先指定的内容,且优先级高于正常转发。
此功能主要用于接口兼容、生成假数据等用于。
注意:所有操作以实际接口说明文档为准
设计文档见链接。
CoreStone 支持两种转发方式:
其中,第二种方式可以不配置前端域名。
但无论何种方式,后端域名必须进行配置。
当App、Web应用通过前端地址转发时,CoreStone 会首先提取请求头中Host字段,
并根据以下规则依次匹配并执行转发:
Host指向自身(配置文件中指定),自CoreStone 自行处理请求Host指向某个业务系统,则转发至此业务系统Host无法找到任何匹配的目标,则拒绝本次请求在某些情况下,没有条件为每个业务系统的前端地址实际配置DNS, 那么可以采取在请求头中直接指定业务系统的前端域名进行转发。
操作方式为请求Query中添加xCoreStoneBizSystemHost=<业务系统前端域名>来指定请求发往的业务系统。
对于已登录的用户,客户端在发起请求时, 需要在请求中添加额外字段来传递认证令牌(登录成功后返回的认证令牌)。
目前认证令牌支持以下几种方式传递:
X-Core-Stone-Auth-Token字段。xCoreStoneAuthToken字段。请求发送到CoreStone 后,CoreStone 会对认证令牌进行验证。
如验证通过,则正常转发请求到后端域名,
并在HTTP 请求头中额外添加X-Core-Stone-Auth-Info-Token传递认证信息。
认证信息(CoreStoneAuthInfo)是一个通过JWT签名后的令牌,解析后结构如下:
| 字段 | 说明 |
|---|---|
account |
登录账号信息 |
account.id |
登录账号ID |
account.namespace |
登录账号所属命名空间 |
account.tags |
登录账号附带的标签 |
team |
登录账号当前团队信息 |
team.id |
登录账号当前团队ID |
team.tags |
登录账号当前团队附带的标签 |
teamRoles |
登录账号在本团队中的角色列表 |
teamRoles[#].id |
登录账号在本团队中的角色ID |
teamRoles[#].isSystem |
登录账号在本团队中的角色是否为系统内建角色 |
permissions |
登录账号在本团队中的权限列表(已根据角色+额外权限归并) |
permissions[#].id |
登录账号在本团队中的权限ID(为具有语义的字符串,如:buildIn.admin.RO) |
extra |
额外信息 |
extra.authTokenId |
所使用的认证令牌ID(可用于作废认证令牌) |
extra.authTokenMarker |
所使用的认证令牌标记(可用于作废认证令牌) |
如验证未通过,请求依然会转发到后端域名, 但不会包含有关用户的信息(即作为未登录用户的请求)。
由于当前整体系统架构进行了分层, 一个请求会连续经过多个系统处理后才会最终响应回到客户端, 这对一些错误的排查带来了挑战。
跟踪ID的目的在于在全局范围内跟踪每一个客户端发出的请求, 并在方便在日志系统中查找与此请求相关的所有日志(即使这些日志由不同的系统产生)。
客户端请求在发送到CoreStone 之后,CoreStone 会生成一个格式为TRACE-<UUID> 的跟踪ID。
并在转发时,在HTTP 请求头中额外添加X-Trace-Id字段传递本跟踪ID。
业务系统/基础系统在接收到请求后,应当从HTTP 请求头X-Trace-Id中获取跟踪ID,
并以此跟踪ID初始化日志对象,并在打印日志时,每一行日志都应包含此跟踪ID。
注意:如业务系统需要继续调用基础系统,也应在HTTP 请求头中添加此跟踪ID
注意:如觉得跟踪ID过长,可以只打印TRACE-<UUID前8个字符>
由于目前所有请求都经由CoreStone 转发,
所以在最终响应客户端时,CoreStone 自动会将生成的跟踪ID 写入HTTP 响应头X-Trace-Id中,
业务系统在响应请求时,无论在HTTP 响应中是否添加跟踪ID 都没有关系。
即:CoreStone作为跟踪ID的创建者,同时会将跟踪ID传递给客户端; 业务系统作为跟踪ID使用者,只需在必要之处输出跟踪ID即可。
注意:所有操作以实际接口说明文档为准
设计文档见链接。
CoreStone 系统中的账户系统包含团队、登录账号概念,简要逻辑如下:
单用户团队和多用户团队,单用户团队为仅包含本登录账号的团队,无法进行添加/修改/删除成员的操作。单用户团队主要在登录账号创建/团队删除登录账号后,登录账号无所属团队时自动创建。命名空间属性,不同命名空间下的登录账号完全隔离,即使同名,也认为是不同登录账号。单词表见链接。
涉及接口:
添加登录账号通常而言,对于独立用户系统,一般流程即向本地数据库写入公司/用户数据。
而在对接CoreStone 之后,原有的业务逻辑需要进行修改为调用本系统的添加登录账号API。
passwordEncryptType与passwordSalt字段本字段主要用于向旧有独立用户系统兼容所用。
| 字段 | 意义 |
|---|---|
passwordEncryptType |
密码加密方式(如:buildIn、cloudcare等) |
passwordSalt |
密码盐值 |
由于本系统、旧有系统的密码加密方式、密钥、盐值策略各不相同,需要对密码进行区分处理。
对于已经对接后,新注册的团队/登录账号,除非有特殊需求,本字段留空即可。
添加登录账号的同时,可以额外指定加入的多用户团队。
正确指定加入的团队后,登录账号会在创建的同时加入团队,并存在以下额外处理:
| 加入团队 | 额外处理 |
|---|---|
| 不指定团队 | 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员 |
| 指定团队,且任何一个团队都不是默认登录 | 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员 |
| 指定团队,且存在一个团队为默认登录 | 无额外处理 |
即在最终效果看来,任何一个登录账号必然存在一个默认登录的团队
涉及接口:
修改团队登录账号的团队如果为单用户团队,那么对应到CloudCare 业务体系中被称为「个人版」。
当「个人版」升级为「团队版」时,仅需在CoreStone 中修改团队为多用户团队,而不必额外创建团队。
注意:只能由单用户团队修改为多用户团队,不支持从多用户团队退回单用户团队
涉及接口:
添加登录账号此操作与上述「用户注册」并无区别。
涉及接口:
添加团队此操作在一般CloudCare 业务体系中并不存在, 但有可能存在为公司内部工作人员创建团队的情况。
注意:添加团队接口只能创建多用户团队
涉及接口:
向团队添加登录账号(附带团队角色/额外权限)修改团队中登录账号(附带团队角色/额外权限)从团队中删除登录账号当需要修改团队成员时,调用相应的API 接口即可, 此类API 接口都支持批量操作。
注意:团队成员操作不适用于单用户团队。
将登录账号从默认团队中删除后,系统会自动查找此登录账号加入的其他团队,并作以下额外处理:
| 其他加入的团队 | 额外处理 |
|---|---|
| 不存在 | 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员 |
| 存在 | 根据加入顺序,自动将此登录账号最后一个加入的团队设置为默认登录团队 |
即在最终效果看来,任何一个登录账号必然存在一个默认登录的团队
涉及接口:
直接创建认证令牌对于CoreStone 本身,任何登录账号的认证令牌均可以直接创建。 各业务系统自行规定创建和发行时机。
对于需要使用密码登录创建认证令牌时,
应在API 接口中额外传递password供CoreStone 进行计算比对。
登录成功后,CoreStone 会返回coreStoneAuthToken(CoreStone认证令牌)。
客户端直接在请求头(X-Core-Stone-Auth-Token)
或Query(xCoreStoneAuthToken)中附带此内容即可被CoreStone 授权。
涉及接口:
作废认证令牌(对应客户端登出操作)对于CoreStone 本身,认证令牌可以直接销毁。
作废认证令牌支持按认证令牌、登录账号ID等批量作废,用于支持踢出用户/强制下线等处理。
CoreStone 本身提供了用户认证(通过发行认证令牌)和转发, 与此同时,所有基于WAT 的系统都支持AK 方式认证。
而一个查询请求是经过业务系统,还是直接发到CoreStone, 是有明确的业务场景区分的,并不是一个模棱两可的事情。
首先,App/Web等终端用户登录后得到的认证令牌, 是「颁发给这一个登录账号的认证令牌」, 用这个认证令牌经过的认证原则上是只能访问「这个登录账号所属团队的数据」。
经过业务系统「转发」,实际上并不是真正的转发, 而是「业务系统接收到前端请求后,重新以业务系统的名义向CoreStone 发起请求」。 这个时候认证用的是系统间AK方式来认证的,权限比登录账号的认证令牌要大许多, 并且允许访问任何团队/登录账号的数据。
这两者具有本质区别的, 简而言之,认证令牌认证的是登录账号;AK认证的是业务系统。
举个例子:
Home中查询团队下属所有登录账号, 必须要提供「当前用户所属团队ID」作为过滤条件。
而Shrine中查询团队下属所有登录账号,十有八九是「销售或服务人员查询客户团队下属登录账号」。 这种情况下,存在跨团队的数据访问,必须用系统间AK认证方式调用, 传递的团队ID也不是「当前销售/服务人员登录账号的ID」而是「目标客户的ID」。
CoreStone 允许接收允许登录账号认证令牌, 本身是因为CoreStone 底层代码(以下简称WAT)的一个数据隔离机制, 这个机制只有在WAT 项目作为「业务系统」的时候才能体现出好处。
好处主要在于,依靠WAT 底层数据隔离机制,会根据每个数据模型的配置,
自动在SQL语句中插入类似WHERE TeamID = '<Team ID>' AND AccountID = 'Account ID'的条件语句。
保证开发人员在编写业务代码的时候,不用关注团队问题(也就是多租户问题),
直接写SQL查出来的就是本团队的数据。
目前WAT 没有使用在任何业务系统中, 所以这个机制暂时没有实际体现。
CoreStone 本身提供了Socket.io 的支持。 Web/App等客户端只需接入CoreStone 的Socket.io,即可与所有业务系统通过Socket.io 进行通讯。 业务系统也同时可以通过CoreStone 与客户端进行通讯。
为了方便客户端以及业务系统开发,集中处理Websocket 连接、消息。 所有的客户端实际都只和CoreStone 保持Websocket 连接, 而CoreStone 与业务系统之间并无Websocket 连接。
当客户端向业务系统发送Websocket 数据包时, 消息通过Websocket 协议到达CoreStone 之后, 会被转换为HTTP 请求,以WebHook 的方式转发给业务系统。
相反,业务系统希望向客户端发送Websocket 数据包时, 直接调用CoreStone 的相关接口即可。 CoreStone 在接收到业务系统有关Socket.io 的调用后, 向相关的客户端推送Websocket 数据包。
从整体上来说,仅需要客户端增加Socket.io 的开发, 在业务系统中依然是标准、普通的HTTP请求。
CoreStone 集成的Socket.io 版本为 2.X,且Socket.io 2.X 与 1.X 并不兼容。 客户端在接入时应当选择使用支持Socket.io 2.X 版本的第三方库。
对于Web端,只需在HTML代码中引用CoreStone 本身提供的Socket.io 客户端即可:
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
对于移动端,请参考官方提供的资源选择合适的客户端: socket.io - Other-client-implementations
Web端为例,前端对接CoreStone 的Socket.io 服务器(与HTTP复用端口), 使用以下代码即可与CoreStone 建立Websocket 连接:
var socketIO = io();
需要注意的是,
由于Socket.io 对错误处理上的封装,
服务器再向客户端发送错误时,必须使用Error对象,
且客户端实际接收到的是此Error对象的message内容(字符串)。
为了方便统一处理,CoreStone 规定,在与客户端之间数据交互时,
所有的数据包都是JSON字符串(即JSON.stringify(data))。
当Socket.io 服务器连接成功后,服务器会立刻发送一段欢迎信息, 客户端可以使用以下方式接收到此欢迎信息:
socketIO.on('hello', function(data) {
console.log(data); // "Welcome, please sent X-Core-Stone-Auth-Token string as `auth` event for authentication."
});
根据提示,客户端将X-Core-Stone-Auth-Token字符串作为auth事件发送给服务器:
socketIO.emit('auth', '<X-Core-Stone-Auth-Token>');
服务器会响应一个数据包给客户端,作为是否成功的判断依据,详情见下文「发送消息回应(ACK)」
当服务器响应200表示认证成功,客户端可以进行下一步操作。
否则,请根据提示排查问题。
任何以socketio.开头的事件都能够被客户端接受,
事件名称需要客户端与具体业务系统之间协商决定,
且避免以.ack结尾(.ack结尾的事件一般用作响应使用,详见下文「发送消息回应(ACK)」)。
socketIO.on('socketio.newMessage', function(data) {
console.log(data);
});
客户端认证之后可以向CoreStone 发送消息(实际向业务系统广播)。
Socket.io 的消息最终都会通过WebHook 转发给业务系统。
在转发时,
客户端发送的事件event即WebHook调用时的事件event;
客户端发送的数据data即WebHook调用时的数据data。
为了避免混淆,客户端发送的所有Socket.io 事件都必须以socketio.开头,如socketio.message。
同样,客户端接收到的来自业务系统的Socket.io 事件也都会以socketio.开头。
可以使用以下方式发送一条消息:
var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data));
客户端向服务器发送的任何一条消息,服务器都会有响应(ACK)。
注意:消息响应(ACK)来自CoreStone, 仅表示CoreStone 正确处理了客户端发来的消息。 并不代表后续业务系统正确处理了消息。 业务系统处理结果以业务系统发出的消息为准
响应(ACK)有以下几种:
event名称发回客户端<事件>.ack发回客户端error事件发回客户端服务器的响应数据包为一个JSON字符串,包含以下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
error |
Number | 错误码。整数部分与HTTP状态码意义相同,200表示OK。 |
message |
String | 错误信息。正常时为空字符串 |
data |
Number, String, Array, JSON | 成功响应的数据。可能包含相关数据 |
reason |
String | 发生错误原因。 |
ackId |
String | 响应ID。由客户端在发送数据包时指定。 |
如表示成功的数据包如下:
{
"error" : 200,
"message": "",
"data" : null
}
再如表示登录失败的数据包如下:
{
"error" : 401.92,
"message": "Invalid Auth Token.",
"reason" : "EAuthToken"
}
这两种响应服务器都会发送,客户端选择其中一种接收即可。
对于Socket.io 内建的响应,直接指定emit()函数的回调方法即可:
var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data), function(ack) {
console.log(ack); // ack即响应数据包
});
对于CoreStone 实现的响应,直接监听<事件>.ack即可:
socketIO.on('socketio.message.ack', function(ack) {
console.log(ack); // ack即响应数据包
});
var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data));
此外,为了方便客户端判断每个响应所对应的数据包,
客户端在发送消息时,可以附带一个ackId字段,值由客户端自行生成。
服务器在响应(ACK)时,会将字段原样返回:
socketIO.on('socketio.message.ack', function(ack) {
console.log(ack.ackId); // "12345"
});
var data = {"hello": "world", "ackId": "12345"};
socketIO.emit('socketio.message', JSON.stringify(data));
对于错误响应,直接监听error即可:
注意:所有的错误都会通过error事件发出,
正常响应(ACK)中并不会接受到任何有关错误的响应
socketIO.on('error', function(error) {
console.log(error);
});
业务系统除了在原先接收WebHook 的基础上做更多event的区分处理外,无其他额外工作。
由客户端发出的Socket.io 事件经由CoreStone 通过WebHook 方式转发后,会有如下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
event |
String | 事件,即客户端指定的事件,一定以socketio.开头 |
from |
JSON | 消息来源,内部各字段说明见下文 |
data |
JSON | 消息数据包,即客户端发送的数据包,通过WebHook转发时会被解析为JSON |
消息来源from中各字段说明如下:
各字段说明如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
type |
Enum | 类型 socketIOClient |
socketIOClientId |
String | Socket.io 客户端ID(由Socket.io自动生成) |
accountId |
String | 登录账号ID |
namespace |
String | 登录账号命名空间 |
teamId |
String | 团队ID |
authTokenId |
String | 认证令牌ID |
authTokenMarker |
String | 认证令牌标记(详情见CoreStone中直接创建认证令牌API说明) |
调用CoreStone API 接口即可,详情见「发送Socket.io 消息」。
调用CoreStone API 接口即可,详情见「发送Socket.io 全域广播消息」。
在特定操作执行成功后,会触发WebHook,并向在AccessKey 列表中注册的WebHook URL 发送HTTP POST 请求。
一个典型的WebHook 的请求体如下:
{
"isEcho": false,
"event" : "team.added",
"from": {
"socketIOClientId": "XXXXXXX-XXXXXXXXXXXX",
"accountId" : "acnt-XXXXXXXXXXXXXXXXXXXXXX",
"namespace" : "default",
"teamId" : "team-XXXXXXXXXXXXXXXXXXXXXX",
"authTokenId" : "csat-XXXXXXXXXXXXXXXXXXXXXX",
"authTokenMarker" : "web"
},
"data": {
"id" : "team-XXXXXXXXXXXXXXXXXXXXXX",
"name" : "上海驻云",
"email" : "postmaster@jiagouyun.com",
"telephone": "02100000000",
"mobile" : "18000000000",
"industry" : "云计算",
"country" : "中国",
"province" : "上海",
"city" : "上海市",
"district" : "云计算浦东新区",
"address" : "张江创新园",
"zip" : "200000"
}
}
各字段说明如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
isEcho |
Boolean | 此Webhook 回调是否为「回声」 |
event |
String | 触发事件,一般格式为<实体>.<所完成的操作> |
from |
JSON | 触发来源 |
data |
JSON | 本次WebHook 回调的数据包,不同事件字段也不同 |
注:当某个业务系统调用本系统某些接口触发Webhook 之后,Webhook 请求有可能又会发送到同一个业务系统,这被称为「回声」
注:from字段主要在客户端通过Socket.io触发事件时,填入客户端的详细信息。如本事件为系统内触发,则本字段保持为null
注:具体数据包格式见下文
各字段说明如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
type |
Enum | 类型 socketIOClient |
socketIOClientId |
String | Socket.io 客户端ID(由Socket.io自动生成) |
accountId |
String | 登录账号ID |
namespace |
String | 登录账号命名空间 |
teamId |
String | 团队ID |
authTokenId |
String | 认证令牌ID |
authTokenMarker |
String | 认证令牌标记(详情见CoreStone中直接创建认证令牌API说明) |
注:Socket.io 客户端触发的事件,事件命名一定为`socketio.`格式*
触发事件:account.added
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
id |
String | 必须 | 新增的登录账号ID |
namespace |
String | 必须 | 命名空间 |
mobile |
String | 可选 | 手机 |
email |
String | 可选 | 邮箱 |
username |
String | 可选 | 用户名 |
isDisabled |
Boolean | 可选 | 是否已禁用 |
teams |
Array[JSON] | 可选 | 创建时同时加入的团队列表 |
teams[#].id |
String | 必须 | 加入的团队ID |
teams[#].isDefault |
Boolean | 可选 | 是否为默认登录团队 |
teams[#].isAdmin |
Boolean | 可选 | 是否为管理员 |
tags |
JSON | 可选 | 新增标签 |
触发事件:account.modified
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
id |
String | 必须 | 修改的登录账号ID |
namespace |
String | 可选 | 命名空间 |
mobile |
String | 可选 | 手机 |
email |
String | 可选 | 邮箱 |
username |
String | 可选 | 用户名 |
isDisabled |
Boolean | 可选 | 是否已禁用 |
tags |
JSON | 可选 | 修改标签 |
触发事件:account.defaultTeamSwitched
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
id |
String | 必须 | 切换默认登录团队的登录账号ID |
defaultTeamId |
String | 必须 | 切换后的默认登录团队ID |
触发事件:team.added
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
id |
String | 必须 | 新建的团队ID |
type |
Enum | 可选 | 团队类型 singleAccount / multiAccount |
name |
String | 必须 | 名称 |
uniqueMarker |
String | 必须 | 标示 |
email |
String | 可选 | 邮箱 |
telephone |
String | 可选 | 固定电话 |
mobile |
String | 可选 | 手机 |
industry |
String | 可选 | 行业 |
country |
String | 可选 | 国家 |
province |
String | 可选 | 省份 |
city |
String | 可选 | 城市 |
district |
String | 可选 | 区 |
address |
String | 可选 | 地址 |
zip |
String | 可选 | 邮政编码 |
status |
Enum | 可选 | 团队状态 normal(预留字段,暂无用途) |
accounts |
Array[JSON] | 可选 | 创建时同时加入的登录账号列表 |
accounts[#].id |
String | 必须 | 加入的登录账号ID |
accounts[#].isDefault |
Boolean | 可选 | 是否为默认登录本团队 |
accounts[#].isAdmin |
Boolean | 可选 | 是否为管理员 |
tags |
JSON | 可选 | 新增标签 |
触发事件:team.modified
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
id |
String | 必须 | 修改的团队ID |
type |
Enum | 可选 | 团队类型 singleAccount / multiAccount |
uniqueMarker |
String | 可选 | 标示 |
name |
String | 可选 | 名称 |
email |
String | 可选 | 邮箱 |
telephone |
String | 可选 | 固定电话 |
mobile |
String | 可选 | 手机 |
industry |
String | 可选 | 行业 |
country |
String | 可选 | 国家 |
province |
String | 可选 | 省份 |
city |
String | 可选 | 城市 |
district |
String | 可选 | 区 |
address |
String | 可选 | 地址 |
zip |
String | 可选 | 邮政编码 |
status |
Enum | 可选 | 团队状态 normal(预留字段,暂无用途) |
isCanceled |
Boolean | 可选 | 是否已注销 |
isDisabled |
Boolean | 可选 | 是否已禁用 |
tags |
JSON | 可选 | 修改标签 |
触发事件:team.accountsAdded
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
accounts |
Array | 必须 | 加入的登录账号列表 |
accounts[#].id |
String | 必须 | 登录账号ID |
accounts[#].isDefault |
Boolean | 可选 | 是否为默认登录本团队 |
accounts[#].isAdmin |
Boolean | 可选 | 是否为管理员 |
accountIdsAlreadyInTeam |
Array[String] | 可选 | 加入的登录账号列表中,重复加入的登录账号ID列表 |
accountIdsAlreadyInTeam[#] |
String | 必须 | 登录账号ID |
触发事件:team.accountsModified
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
accounts |
Array | 必须 | 修改的登录账号列表 |
accounts[#].id |
String | 必须 | 登录账号ID |
accounts[#].isDefault |
Boolean | 可选 | 是否为默认登录本团队 |
accounts[#].isAdmin |
Boolean | 可选 | 是否为管理员 |
触发事件:team.accountsDeleted
数据包结构:
| 字段名 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
accounts |
Array | 必须 | 删除的登录账号列表 |
accounts[#].id |
String | 必须 | 登录账号ID |
accountIdsNotInTeam |
Array[String] | 可选 | 删除的登录账号列表中,重复删除的登录账号ID列表 |
accountIdsNotInTeam[#] |
String | 必须 | 登录账号ID |
本系统除了通过传统HTTP请求发送Webhook数据外, 同时支持通过Kafka发送Webhook数据。
由基础系统发出的Webhook数据,都会发往basis主题,
同时,为了保证接收方能够按照顺序接受到消息,所有的消息都会发往0号分区。
通过Kafka发送的Webhook数据与传统HTTP请求发送的Webhook相同,但不会有isEcho字段。
详细对接文档请参考 301.06-Kafka 对接说明
注意:基础系统只负责通过Kafka发送Webhook数据,本身并不接收任何Kafka消息。
注意:基础系统并不强制要求业务系统接入Kafka,如何使用请根据实际情况决定。
注意:基础系统同时会以传统HTTP方式和向Kafka发送Webhook数据, 为了避免重复接受消息,业务系统在切换为Kafka之后,必须删除本系统中有关Webhook URL的配置。
/api/v1/debug/tasks/do/put
CAUTION: This API is just for debug, please DO NOT use in a production environment.
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| waitResult | boolean |
Wait task result before response |
|
| times | int |
Send times
最小值为 :
1
|
|
| task | json |
|
|
| task.name | string |
Task name |
|
| task.args | array |
List arguments (*args) |
|
| task.args[#] | any |
|
|
| task.kwargs | json |
Dict arguments (**kwargs) |
|
| task.options | json |
Task options |
|
| task.options.queue | string |
队列 |
|
| task.options.eta | int |
ETA (Unix timestamp in seconds) |
|
| task.options.expires | int |
Expires (Unix timestamp in seconds) |
|
| task.options.retries | int |
Retry times
最小值为 :
0
|
|
| task.options.timeLimit | int |
Time limit (in seconds)
最小值为 :
1
|
|
| task.options.softTimeLimit | int |
Time soft limit (in seconds)
最小值为 :
1
|
|
| task.options.origin | string |
origin |
|
| task.options.priority | int |
Priority
最小值为 :
0
最大值为 :
255
|
|
| task.options.extra | any |
Extra information |
/api/v1/core-stone/do/batch-request
批量请求的返回内容严格按照body.requests顺序一一对应,如:
{
"error": 200,
"message": "",
"data": [
{
"status" : 200,
"contentType": "application/json; charset=utf-8",
"body": {
"data": "第1个请求返回值"
}
},
{
"status" : 200,
"contentType": "application/json; charset=utf-8",
"body": {
"data": "第2个请求返回值"
}
},
],
"traceId": "TRACE-00000000-0000-0000-0000-000000000000",
"reqCost": 21
}
可选批量请求模式:
| 模式 | 说明 |
|---|---|
parellel |
并发请求(同一时间实际最大并发量限制为10) |
series |
顺序请求 |
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| X-Core-Stone-Auth-Token | string |
CoreStone认证令牌 |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| mode | enum |
批量请求模式(默认为`parellel`)
为以下其中之一 :
"parallel", "series" |
|
| requests | array |
最小长度为 :
1
最大长度为 :
100
|
|
| requests[#] | json |
|
|
| requests[#].host | string |
请求前端地址(默认为当前请求地址) |
|
| requests[#].method | enum |
请求方法
为以下其中之一 :
"GET", "POST", "PUT", "DELETE", "PATCH", "OPTION" |
|
| requests[#].path | string |
请求路径 |
|
| requests[#].query | json |
请求Query |
|
| requests[#].contentType | string |
请求体内容类型(默认根据所发送body自动判断) |
|
| requests[#].body | any |
请求体(字符串或JSON) |
/api/v1/socket-io/do/emit
向Socket.io 客户端发送消息,可以按Socket.io 客户端ID、登录账号ID或团队ID进行发送
| Socket.io 客户端ID | 登录账号ID | 团队ID | 实际接收者 |
|---|---|---|---|
| 指定 | 指定的单个Socket.io 客户端 | ||
| 指定 | 指定登录账号ID的所有已登录的Socket.io 客户端 | ||
| 指定 | 指定团队ID的所有已登录的Socket.io 客户端 | ||
| 指定 | 指定 | 所属指定团队ID下指定登录账号ID的所有Socket.io 客户端(用于支持多端登录不同团队的情况) |
注意:当指定Socket.io 客户端ID时,不得同时指定登录账号ID和团队ID
注意:当同时指定登录账号ID和团队ID时,只支持一个团队ID+一个或多个登录ID的方式组合指定
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| event | string |
消息事件(必须为`socketio.*`格式或`error`) |
|
| data | json |
消息数据 |
|
| to | json |
|
|
| to.socketIOClientId | commaArray |
Socket.io客户端(接收者)ID
允许为Null :
是
不得为空字符串 :
是
|
|
| to.teamId | commaArray |
团队(接收者)ID
允许为Null :
是
不得为空字符串 :
是
|
|
| to.accountId | commaArray |
登录账号(接收者)ID
允许为Null :
是
不得为空字符串 :
是
|
/api/v1/core-stone-auth/do/verify-account
用于验证用户账号的信息:
| 普通账号 | LDAP用户 |
|---|---|
| 确认登录账号是否存在 | 确认LDAP用户是否存在 |
确认密码是否正确(仅在password字段填写时检查) |
确认LDAP用户密码是否正确(仅在password字段填写时检查) |
| 确认登录账号是否已被禁用 | 确认此LDAP用户在CoreStone中是否已被禁用 |
确认登录账号是否为团队成员(仅在signInTeamId字段填写时检查) |
确认登录账号是否为团队成员(仅在signInTeamId字段填写时检查) |
以ID或验证LDAP用户时,命名空间namespace无需填写。
指定标识符类型identifierType为"ldap"即为验证LDAP用户。
验证LDAP用户时,标识符identifier必须以"<团队标示/LDAP用户名>"格式传递,如:"jiagouyun/zhang3"。
注意:LDAP登录默认根据uid进行处理,如果希望以username登录,请选择"ldap.username"
第一次验证成功后,CoreStone会自动创建一个命名空间为"ldap.<团队唯一标示>"的登录账号。(驻云1号团队为"ldap.jiagouyun")
注意:本接口不会创建令牌
注意:LDAP用户在验证时,会自动在本系统中添加/更新LDAP用户信息
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| verifyAccount | json |
|
|
| verifyAccount.namespace | string |
命名空间(直接指定ID或LDAP用户不用填写)
不得为空字符串 :
是
|
|
| verifyAccount.identifierType | enum |
标识符类型(登录账号ID/手机号/邮箱/用户名/LDAP用户)
为以下其中之一 :
"id", "mobile", "email", "username", "ldap", "ldap.username" |
|
| verifyAccount.identifier | string |
标识符(与标识符类型对应,即具体的登录账号ID/手机号/邮箱/用户名/LDAP用户) |
|
| verifyAccount.password | string |
密码(指定此字段时会验证密码)
允许为Null :
是
不得为空字符串 :
是
|
|
| verifyAccount.signInTeamId | string |
登录团队ID(指定此字段时会验证是否属于指定团队)
允许为Null :
是
|
/api/v1/core-stone-auth/auth-tokens/do/create
创建认证令牌时,命名空间namespace应由业务系统指定。如前端直接传递,业务系统也应做相应检查。
以ID或验证LDAP用户时,命名空间namespace无需填写。
指定标识符类型identifierType为"ldap"即为LDAP登录。
登录LDAP用户时,标识符identifier必须以"<团队标示/LDAP用户名>"格式传递,如:"jiagouyun/zhang3"。
注意:LDAP登录默认根据uid进行处理,如果希望以username登录,请选择"ldap.username"
第一次登录成功后,CoreStone会自动创建一个命名空间为"ldap.<团队唯一标示>"的登录账号。(驻云1号团队为"ldap.jiagouyun")
注意:LDAP用户在登录时,会自动在本系统中添加/更新LDAP用户信息
注意:LDAP用户在登录时,密码password为必填项
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| createAuthToken | json |
|
|
| createAuthToken.namespace | string |
命名空间(直接指定ID或LDAP用户不用填写)
不得为空字符串 :
是
|
|
| createAuthToken.identifierType | enum |
标识符类型(登录账号ID/手机号/邮箱/用户名/LDAP用户)
为以下其中之一 :
"id", "mobile", "email", "username", "ldap", "ldap.username" |
|
| createAuthToken.identifier | string |
标识符(与标识符类型对应,即具体的登录账号ID/手机号/邮箱/用户名/LDAP uid) |
|
| createAuthToken.marker | string |
认证令牌标记(用于后续批量作废时使用。如区分移动端/Web端产生的认证令牌分别标记为mobile/web)
允许为Null :
是
|
|
| createAuthToken.userAgent | string |
客户端原始User-Agent(指定此字段时,后续验证认证令牌时会要求User-Agent不发生改变,否则抛出错误)
允许为Null :
是
|
|
| createAuthToken.password | string |
密码(指定此字段时会验证密码)
允许为Null :
是
不得为空字符串 :
是
|
|
| createAuthToken.expire | integer |
认证令牌过期时间(秒,1分钟~1年,默认7天)【拼写错误,请尽早改为"expires"】
允许为Null :
是
最小值为 :
60
最大值为 :
31536000
|
|
| createAuthToken.expires | integer |
认证令牌过期时间(秒,1分钟~1年,默认7天)
允许为Null :
是
最小值为 :
60
最大值为 :
31536000
|
|
| createAuthToken.signInTeamId | string |
登录团队ID(不传递时登录默认团队)
允许为Null :
是
|
/api/v1/core-stone-auth/auth-tokens/do/revoke
token、tokenId)| 序号 | 认证令牌 | 认证令牌ID | 影响范围 | 说明 |
|---|---|---|---|---|
| 1 | 指定 | 作废指定认证令牌 | 仅作废指定认证令牌 | |
| 2 | 指定 | 作废指定认证令牌ID令牌 | 仅作废指定认证令牌ID的令牌 | |
| 3 | 指定 | 指定 | 与【1】相同 | 同时指定认证令牌与认证令牌ID时,认证令牌ID不起作用 |
teamId、accountId、marker)| 序号 | 团队ID | 登录账号ID | 认证令牌标记 | 影响范围 | 说明 |
|---|---|---|---|---|---|
| 1 | 指定 | 指定 | 作废指定团队+登录账号的所有认证令牌 | 可用于类似「多团队登出某团队」的场景 | |
| 2 | 指定 | 作废指定登录账号相关的所有认证令牌 | 作废指定用户的所有令牌 | ||
| 3 | 指定 | 指定 | 作废指定登录账号+标记的所有认证令牌 | 可用于类似「仅允许单个手机登录」的场景 | |
| 4 | 指定 | 指定 | 指定 | 作废指定团队+登录账号+标记的所有认证令牌 | 可用于类似「仅允许单个手机登录」的场景 |
注意:未列在上述表格中的参数组合方式均不予支持,接口直接报错。
注意:当认证令牌或认证令牌ID指定后,其他传递的参数不起作用。
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| revokeAuthToken | json |
|
|
| revokeAuthToken.token | string |
认证令牌(优先级高于认证令牌ID、业务字段) |
|
| revokeAuthToken.tokenId | string |
认证令牌ID(优先级高于业务字段) |
|
| revokeAuthToken.teamId | string |
团队ID |
|
| revokeAuthToken.accountId | string |
登录账号ID |
|
| revokeAuthToken.marker | string |
认证令牌标记 |
/api/v1/teams/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"team.name", "team.uniqueMarker", "team.email", "team.telephone", "team.mobile", "team.industry", "team.country", "team.province", "team.city", "team.district", "team.address", "team.zip" |
|
| id | commaArray |
根据ID过滤
查询方式 :
多值匹配(IN)
查询字段 :
team.id
|
|
| accountId | commaArray |
根据登录账号(创始人)ID过滤(备注字段,无实际业务逻辑)
查询方式 :
多值匹配(IN)
查询字段 :
team.accountId
|
|
| type | commaArray |
根据类型过滤
查询方式 :
多值匹配(IN)
查询字段 :
team.type
包含以下元素的逗号分隔数组 :
"singleAccount", "multiAccount" |
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.name
|
|
| uniqueMarker | string |
根据标示搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.uniqueMarker
|
|
| string |
根据邮箱搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.email
|
|
|
| telephone | string |
根据固定电话搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.telephone
|
|
| mobile | string |
根据手机号搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.mobile
|
|
| industry | string |
根据行业搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.industry
|
|
| country | string |
根据国家搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.country
|
|
| province | string |
根据省份搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.province
|
|
| city | string |
根据城市搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.city
|
|
| district | string |
根据区域搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.district
|
|
| address | string |
根据地址搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.address
|
|
| zip | string |
根据邮编搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.zip
|
|
| status | commaArray |
根据状态过滤(预留字段,暂时无用)
查询方式 :
多值匹配(IN)
查询字段 :
team.status
包含以下元素的逗号分隔数组 :
"normal" |
|
| isCanceled | boolean |
根据是否已注销过滤
查询方式 :
等于(=)
查询字段 :
team.isCanceled
|
|
| isDisabled | boolean |
根据是否已禁用过滤
查询方式 :
等于(=)
查询字段 :
team.isDisabled
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| pageSize | integer |
每页记录数
必须为正整数 :
是
最小值为 :
1
最大值为 :
100
|
|
| pageNumber | integer |
页号
必须为正整数 :
是
最小值为 :
1
最大值为 :
99999
|
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|
/api/v1/teams/do/add
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| data | json |
|
|
| data.accountId | string |
登录账号(创始人)ID(备注字段,无实际业务逻辑,团队创建后无法修改)
允许为Null :
是
|
|
| data.type | enum |
类型(只能创建多用户团队)
为以下其中之一 :
"multiAccount" |
|
| data.name | string |
名称
不得为空字符串 :
是
|
|
| data.email | string |
邮箱
允许为Null :
是
必须为有效邮箱地址 :
是
|
|
| data.telephone | string |
固定电话
允许为Null :
是
|
|
| data.mobile | string |
手机号
允许为Null :
是
|
|
| data.industry | string |
行业
允许为Null :
是
|
|
| data.country | string |
国家
允许为Null :
是
|
|
| data.province | string |
省份/直辖市
允许为Null :
是
|
|
| data.city | string |
城市
允许为Null :
是
|
|
| data.district | string |
区域
允许为Null :
是
|
|
| data.address | string |
地址
允许为Null :
是
|
|
| data.zip | string |
邮编
允许为Null :
是
|
|
| data.status | enum |
状态(预留字段,暂时无用)
为以下其中之一 :
"normal" |
|
| data.note | string |
备注
允许为Null :
是
|
|
| data.tags | json |
标签
允许为Null :
否
|
|
| accounts | array |
创建同时添加登录账号 |
|
| accounts[#] | json |
|
|
| accounts[#].id | string |
登录账号(成员)ID |
|
| accounts[#].isDefault | boolean |
是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队) |
|
| accounts[#].isAdmin | boolean |
是否为管理员 |
|
| accounts[#].inTeamNote | string |
团队内备注 |
/api/v1/teams/:id/do/modify
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
团队ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| data | json |
|
|
| data.type | enum |
类型(只能修改为多用户团队)
为以下其中之一 :
"multiAccount" |
|
| data.name | string |
名称
不得为空字符串 :
是
|
|
| data.email | string |
邮箱
允许为Null :
是
必须为有效邮箱地址 :
是
|
|
| data.telephone | string |
固定电话
允许为Null :
是
|
|
| data.mobile | string |
手机号
允许为Null :
是
|
|
| data.industry | string |
行业
允许为Null :
是
|
|
| data.country | string |
国家
允许为Null :
是
|
|
| data.province | string |
省份/直辖市
允许为Null :
是
|
|
| data.city | string |
城市
允许为Null :
是
|
|
| data.district | string |
区域
允许为Null :
是
|
|
| data.address | string |
地址
允许为Null :
是
|
|
| data.zip | string |
邮编
允许为Null :
是
|
|
| data.status | enum |
状态(预留字段,暂时无用)
为以下其中之一 :
"normal" |
|
| data.isCanceled | boolean |
是否为已注销(注销后无法恢复)
值必须为 :
是
|
|
| data.isDisabled | boolean |
是否为已禁用 |
|
| data.note | string |
备注
允许为Null :
是
|
|
| data.tags | json |
标签
允许为Null :
否
|
/api/v1/teams/:id/accounts/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
团队ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"acnt.namespace", "acnt.email", "acnt.mobile", "acnt.username", "acnt.name", "acnt.nickname" |
|
| id | commaArray |
根据ID过滤
查询方式 :
多值匹配(IN)
查询字段 :
acnt.id
|
|
| namespace | string |
根据命名空间通配
查询方式 :
满足通配
查询字段 :
acnt.namespace
|
|
| string |
根据邮箱过滤
查询方式 :
等于(=)
查询字段 :
acnt.email
|
|
|
| mobile | string |
根据手机号过滤
查询方式 :
等于(=)
查询字段 :
acnt.mobile
|
|
| username | string |
根据用户名过滤
查询方式 :
等于(=)
查询字段 :
acnt.username
|
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
acnt.name
|
|
| nickname | string |
根据昵称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
acnt.nickname
|
|
| isDisabled | boolean |
根据是否已禁用过滤
查询方式 :
等于(=)
查询字段 :
acnt.isDisabled
|
|
| isDefault | boolean |
根据是否为默认团队过滤
查询方式 :
等于(=)
查询字段 :
rel.isDefault
|
|
| isAdmin | boolean |
根据是否为管理员过滤
查询方式 :
等于(=)
查询字段 :
rel.isAdmin
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|
/api/v1/teams/ldap-users/do/search
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| uniqueMarker | string |
团队唯一标识符 |
|
| uid | string |
根据LDAP uid 搜索(前后匹配) |
|
| cn | string |
根据LDAP cn 搜索(前后匹配) |
|
| name | string |
根据LDAP name 搜索(前后匹配) |
|
| username | string |
根据LDAP username 搜索(前后匹配) |
|
| phone | string |
根据LDAP phone 搜索(前后匹配) |
|
| objectclass | string |
根据LDAP objectclass 过滤(完全匹配) |
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
/api/v1/teams/:id/accounts/do/add
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
团队ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| accounts | array |
最小长度为 :
1
|
|
| accounts[#] | json |
|
|
| accounts[#].id | string |
登录账号(成员)ID |
|
| accounts[#].isDefault | boolean |
是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队)
值必须为 :
是
|
|
| accounts[#].isAdmin | boolean |
是否为管理员 |
|
| accounts[#].inTeamNote | string |
团队内备注 |
|
| accounts[#].teamRoles | array |
设置团队角色 |
|
| accounts[#].teamRoles[#] | json |
|
|
| accounts[#].teamRoles[#].id | string |
团队角色ID |
|
| accounts[#].teamRoles[#].operation | enum |
执行操作
为以下其中之一 :
"add" |
|
| accounts[#].permissions | array |
设置权限 |
|
| accounts[#].permissions[#] | json |
|
|
| accounts[#].permissions[#].id | string |
权限ID |
|
| accounts[#].permissions[#].operation | enum |
执行操作
为以下其中之一 :
"add" |
/api/v1/teams/:id/accounts/do/modify
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
团队ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| accounts | array |
最小长度为 :
1
|
|
| accounts[#] | json |
|
|
| accounts[#].id | string |
登录账号(成员)ID |
|
| accounts[#].isDefault | boolean |
是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队)
值必须为 :
是
|
|
| accounts[#].isAdmin | boolean |
是否为管理员 |
|
| accounts[#].inTeamNote | string |
团队内备注 |
|
| accounts[#].teamRoles | array |
设置团队角色 |
|
| accounts[#].teamRoles[#] | json |
|
|
| accounts[#].teamRoles[#].id | string |
团队角色ID |
|
| accounts[#].teamRoles[#].operation | enum |
执行操作
为以下其中之一 :
"add", "remove" |
|
| accounts[#].permissions | array |
设置权限 |
|
| accounts[#].permissions[#] | json |
|
|
| accounts[#].permissions[#].id | string |
权限ID |
|
| accounts[#].permissions[#].operation | enum |
执行操作
为以下其中之一 :
"add", "remove" |
/api/v1/accounts/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"acnt.namespace", "acnt.email", "acnt.mobile", "acnt.username", "acnt.name", "acnt.nickname" |
|
| id | commaArray |
根据ID过滤
查询方式 :
多值匹配(IN)
查询字段 :
acnt.id
|
|
| namespace | string |
根据命名空间通配
查询方式 :
满足通配
查询字段 :
acnt.namespace
|
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
acnt.name
|
|
| nickname | string |
根据昵称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
acnt.nickname
|
|
| string |
根据邮箱过滤
查询方式 :
等于(=)
查询字段 :
acnt.email
|
|
|
| mobile | string |
根据手机号过滤
查询方式 :
等于(=)
查询字段 :
acnt.mobile
|
|
| username | string |
根据用户名过滤
查询方式 :
等于(=)
查询字段 :
acnt.username
|
|
| isDisabled | boolean |
根据是否为禁用过滤
查询方式 :
等于(=)
查询字段 :
acnt.isDisabled
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| pageSize | integer |
每页记录数
必须为正整数 :
是
最小值为 :
1
最大值为 :
100
|
|
| pageNumber | integer |
页号
必须为正整数 :
是
最小值为 :
1
最大值为 :
99999
|
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|
/api/v1/accounts/do/add
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| data | json |
|
|
| data.namespace | string |
命名空间
不得为空字符串 :
是
值不得为 :
ldap
不得满足正则表达式 :
^ldap\.
必须满足正则表达式 :
^\w([.\w-]*\w)?$
|
|
| data.name | string |
名称(操作人姓名)
不得为空字符串 :
是
|
|
| data.nickname | string |
昵称
允许为Null :
是
|
|
| data.password | string |
密码
允许为Null :
是
不得为空字符串 :
是
|
|
| data.email | string |
邮箱(可用于登录)
允许为Null :
是
必须为有效邮箱地址 :
是
|
|
| data.mobile | string |
手机号(可用于登录)
允许为Null :
是
|
|
| data.username | string |
用户名(可用于登录)
允许为Null :
是
|
|
| data.status | enum |
状态(预留字段,暂时无用)
为以下其中之一 :
"normal" |
|
| data.tags | json |
标签
允许为Null :
否
|
|
| teams | array |
创建同时添加至团队 |
|
| teams[#] | json |
|
|
| teams[#].id | string |
团队ID |
|
| teams[#].isDefault | boolean |
是否为默认团队 |
|
| teams[#].isAdmin | boolean |
是否为管理员 |
|
| teams[#].inTeamNote | string |
团队内备注 |
/api/v1/accounts/:id/do/modify
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
登录账号ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| data | json |
|
|
| data.namespace | string |
命名空间
不得为空字符串 :
是
值不得为 :
ldap
不得满足正则表达式 :
^ldap\.
必须满足正则表达式 :
^\w([.\w-]*\w)?$
|
|
| data.name | string |
名称(操作人姓名)
不得为空字符串 :
是
|
|
| data.nickname | string |
昵称
允许为Null :
是
|
|
| data.password | string |
密码(直接修改密码)
不得为空字符串 :
是
|
|
| data.email | string |
邮箱(可用于登录)
允许为Null :
是
必须为有效邮箱地址 :
是
|
|
| data.mobile | string |
手机号(可用于登录)
允许为Null :
是
|
|
| data.username | string |
用户名(可用于登录)
允许为Null :
是
|
|
| data.status | enum |
状态(预留字段,暂时无用)
为以下其中之一 :
"normal" |
|
| data.isDisabled | boolean |
是否为已禁用 |
|
| data.tags | json |
标签
允许为Null :
否
|
/api/v1/account/:id/teams/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
登录账号ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"team.name", "team.uniqueMarker", "team.email", "team.telephone", "team.mobile", "team.industry", "team.country", "team.province", "team.city", "team.district", "team.address", "team.zip" |
|
| id | commaArray |
根据ID过滤
查询方式 :
多值匹配(IN)
查询字段 :
team.id
|
|
| accountId | commaArray |
根据登录账号(创始人)ID过滤(备注字段,无实际业务逻辑)
查询方式 :
多值匹配(IN)
查询字段 :
team.accountId
|
|
| type | commaArray |
根据类型过滤
查询方式 :
多值匹配(IN)
查询字段 :
team.type
包含以下元素的逗号分隔数组 :
"singleAccount", "multiAccount" |
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.name
|
|
| uniqueMarker | string |
根据标示搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.uniqueMarker
|
|
| string |
根据邮箱搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.email
|
|
|
| telephone | string |
根据固定电话搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.telephone
|
|
| mobile | string |
根据手机号搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.mobile
|
|
| industry | string |
根据行业搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.industry
|
|
| country | string |
根据国家搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.country
|
|
| province | string |
根据省份搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.province
|
|
| city | string |
根据城市搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.city
|
|
| district | string |
根据区域搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.district
|
|
| address | string |
根据地址搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.address
|
|
| zip | string |
根据邮编搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
team.zip
|
|
| status | commaArray |
根据状态过滤(预留字段,暂时无用)
查询方式 :
多值匹配(IN)
查询字段 :
team.status
包含以下元素的逗号分隔数组 :
"normal" |
|
| isDisabled | boolean |
根据是否已禁用过滤
查询方式 :
等于(=)
查询字段 :
team.isDisabled
|
|
| isDefault | boolean |
根据是否为默认团队过滤
查询方式 :
等于(=)
查询字段 :
rel.isDefault
|
|
| isAdmin | boolean |
根据是否为管理员过滤
查询方式 :
等于(=)
查询字段 :
rel.isAdmin
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|
/api/v1/team-roles/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"tmro.name" |
|
| _limitTeamId | string |
限制目标数据所属团队ID |
|
| id | commaArray |
根据ID过滤
查询方式 :
多值匹配(IN)
查询字段 :
tmro.id
|
|
| teamId | string |
根据团队ID过滤
查询方式 :
等于或为NULL
查询字段 :
tmro.teamId
|
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
tmro.name
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|
/api/v1/team-roles/:id/do/modify
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| id | string |
团队角色ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _limitTeamId | string |
限制目标数据所属团队ID |
|
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| data | json |
|
|
| data.name | string |
名称 |
|
| permissions | array |
设置权限 |
|
| permissions[#] | json |
|
|
| permissions[#].id | string |
权限ID |
|
| permissions[#].operation | enum |
执行操作
为以下其中之一 :
"add", "remove" |
/api/v1/permissions/do/list
| 字段 | 类型 | 描述 | 测试 |
|---|---|---|---|
| _fuzzySearch | string |
模糊搜索
查询字段 :
"perm.id", "perm.name" |
|
| id | commaArray |
根据权限ID(代码)过滤
查询方式 :
多值匹配(IN)
查询字段 :
perm.id
|
|
| name | string |
根据名称搜索
查询方式 :
包含(LIKE '%value%')
查询字段 :
perm.name
|
|
| export | enum |
导出文件类型
为以下其中之一 :
"json", "csv" |
|
| charset | enum |
导出文件编码
为以下其中之一 :
"utf8", "gbk" |
|
| pageSize | integer |
每页记录数
必须为正整数 :
是
最小值为 :
1
最大值为 :
100
|
|
| pageNumber | integer |
页号
必须为正整数 :
是
最小值为 :
1
最大值为 :
99999
|
|
| fieldPicking | commaArray |
挑选返回字段 |
|
| fieldKicking | commaArray |
剔除返回字段 |
|