一、概述
Quick BI企业客户所购买的多为专业版,且企业存在自有oa(办公)系统,组织架构庞大、复杂,系统多,权限分配及管理存在自有的集成系统统一管理,用以做到精准的权限管控。而Quick BI官方提供的OpenAPI提供了多样化的权限控制统一接口用以满足不同企业权限统一且自动化管控的的集成需求,本文针对Quick BI的工作流程、使用方法及限制以及针对高频场景从OpenAPI Explorer到封装python SDK由浅入深的给出了多种调用方式的使用样例。
二、OpenAPI的工作流程
- 客户发起指定API的请求,一般会通过如下两种方式向阿里云网关发送请求
- 阿里云官方SDK:支持java、python、C++等语言
- OpenAPI Explorer:可视化界面在线调试API
- 阿里云网关首先解析用户的请求,进行验签、鉴权,并根据api的调用信息找到对应产品线的服务提供者,携带请求参数及uid等唯一标识转发到QuickBI产品api的提供地址进行接口请求
- QuickBI后端根据请求参数处理完该请求后通过阿里云网关返回客户侧
二 、QuickBI产品侧OpenAPI的使用
1. 使用方法
QuickBI官网针对OpenAPI给出了官方支持的不同分类的api列表及调用参数等相关说明,链接如下:https://help.aliyun.com/document_detail/415066.html。根据自身需求可以点击相应的说明页并点击调试进入OpenAPI的调试界面
在调试页面可以通过如下三种方式进行操作
- 手动输入参数并在网页上发起调用
- 通过编辑示例SDK的代码,点击“运行示例”在临时的虚拟机中进行运行
- 下载sdk到本地测试环境进行api的调用
2. 使用限制
- openapi目前仅支持国内公有云、金融云专业版用户的调用
- 调用的人需具备管理员权限并登录过quickbi工作台至少一次
- 行级权限管理相关api仅支持新版行列权限模型,旧版将报错
可以同步客户对旧版进行升级,但要充分提示客户新旧切换中可能遇到的问题,切换入口见下图
- CreateTicket中的GlobalParam参数需联系qbi运营人员添加白名单,否则调用报如下错:https://next.api.aliyun.com/api/quickbi-public/2022-01-01/CreateTicket?spm=a2c4g.11186623.0.0.15614f6cAkyVBg¶ms={}&tab=DOC
{ "RequestId": "CF76D780-4E90-543F-A1A7-C36107C7E3E4", "HostId": "quickbi-public.cn-hangzhou.aliyuncs.com", "Code": "AE0579000002", "Message": "The global parameter function is restricted in your version", "Recommend": "https://next.api.aliyun.com/troubleshoot?q=AE0579000002&product=quickbi-public"}
3. 常用参数id获取方式及途径
- UserId
- 截至发稿前,openapi官网已经维护了三个通过api获取的途径
- 用户也可以通过quickbi“用户管理”界面,“批量导出”用户excel进行获取
- TagId
- AddUserTagMeta:通过如下链接新建标签后返回 https://next.api.aliyun.com/api/quickbi-public/2022-01-01/AddUserTagMeta?lang=JAVA¶ms={}
- QueryUserTagMetaList:直接获取组织下所有标签的TagId https://next.api.aliyun.com/api/quickbi-public/2022-01-01/QueryUserTagMetaList?params={}&sdkStyle=old&lang=JAVA&tab=DEBUG
- UserGroupId
- CreateUserGroup:新建用户组的时候自定义输入并返回 https://next.api.aliyun.com/api/quickbi-public/2022-01-01/CreateUserGroup?lang=PYTHON¶ms={}&tab=DOC
- QueryUserGroupListByParentId:https://next.api.aliyun.com/api/quickbi-public/2022-01-01/QueryUserGroupListByParentId?params={}
- WorksId
- 仪表盘
- 电子表格
- 自助取数
- DataPortalId
- MenuIds
- ListPortalMenus:根据数据门户DataPortalId获取分层菜单列表https://next.api.aliyun.com/api/quickbi-public/2022-01-01/ListPortalMenus?params={}&tab=DEBUG
- DatasetId
- ApiId
- ApplicationId
- 需按照文档配置自定义渠道,开启自定义审批流,并根据下图所示的方法进行验签后获得https://help.aliyun.com/document_detail/389614.html
四、高频需求实现样例
如下三个需求最为常见,下面采用不同的实现方式由浅入深的进行高频需求的实现:
- 通过openapi官网页面实现调用测试
- 通过官方sdk实现简单代码调用-基于python
- 以官方sdk为基础,根据客户需求实现特殊场景下的简单封装-基于python
1. Ticket票据实现免密登陆及权限控制
报表免密登陆,嵌入自有系统,数据权限控制和传参实现“千人千面”的安全增强方案AccessTicket票据接口CreateTicket:https://help.aliyun.com/document_detail/391291.html 。在拼接免密登陆的url时,通过网页调用测试参数及accesskeyid权限。
- 选择公有云或者金融云的服务地址
- 根据openapi文档填入api调用必填和选填的参数
- 点击发起调用并获得调用结果
2. 自定义权限审批流回调
企业权限审批集成至自有系统,在quickbi中的权限审批会按照“自定义渠道”中填写的webhook地址进行推送,待验签完成后,即可获得该审批流的ID:ApplicationId,根据此内容自定义回调审批流:ResultCallback,此处使用sdk进行样例实现。
- 打开对应openapi官网,选择区域,填写上需要配置的参数(此处可以随意填写,仅作为生成样例sdk中类参数的便捷操作),sdk实例代码即会自动生成样例
- 复制sdk示例代码至测试环境,集成自有系统配置,填入“审批理由”及“审批结果”,并配置好管理员权限的accessKeyId,accessKeySecret,内嵌测试系统或者直接运行相关的代码
- 代码运行成功,可以在quickbi控制台,“我的审批”中查看详情,显示审批已经通过
3. 递归获取当前用户组目录树及UserGroupId
获取当前组织下quickbi工作台手动创建的(通过api创建的用户组会直接在请求中返回UserGroupId)所有用户组的UserGroupId用于在自有系统中进行用户组目录树的罗列和人员-用户组的管理。客户工单频率较高,所以根据当前openapi提供的接口QueryUserGroupListByParentId进行了该场景的二次封装,根据递归的方法得到当前组织目录树的样例。
- 当前的组织示例:
- 根据递归的方式封装的代码
# -*- coding: utf-8 -*-# author: syffromalibabacloud_quickbi_public20220101.clientimportClientasquickbi_public20220101Clientfromalibabacloud_tea_openapiimportmodelsasopen_api_modelsfromalibabacloud_quickbi_public20220101importmodelsasquickbi_public_20220101_modelsfromalibabacloud_tea_utilimportmodelsasutil_modelsimportjsonclassSample: def__init__(self): passdefcreate_client( access_key_id: str, access_key_secret: str, ) ->quickbi_public20220101Client: """ 使用AK&SK初始化账号Client @param access_key_id: @param access_key_secret: @return: Client @throws Exception """config=open_api_models.Config( access_key_id=access_key_id, access_key_secret=access_key_secret ) config.endpoint=f'quickbi-public.cn-hangzhou.aliyuncs.com'returnquickbi_public20220101Client(config) defget_all_user_group_ids( access_key_id: str, access_key_secret: str, user_group_id: str="-1" ) ->str: """ 递归获取当前组织用户组的目录树 :param access_key_id: :param access_key_secret: :param user_group_id: 默认-1表示根结点 :return: 目录树的json字符串 """client=Sample.create_client(access_key_id, access_key_secret) defhelper(user_group_id: str): ifnotuser_group_id: return [] query_user_group_list_by_parent_id_request= \ quickbi_public_20220101_models.QueryUserGroupListByParentIdRequest( parent_user_group_id=user_group_id ) runtime=util_models.RuntimeOptions() try: requests=client.query_user_group_list_by_parent_id_with_options( query_user_group_list_by_parent_id_request, runtime) return [{'user_group_name': i.user_group_name, 'user_group_id': i.user_group_id, 'parent_user_group_id': i.parent_user_group_id, 'child_group_list': helper(i.user_group_id)} foriinrequests.body.result] exceptExceptionaserror: print(f'user_group_id:{user_group_id}\t', error) return [] returnjson.dumps(helper(user_group_id), ensure_ascii=False) if__name__=='__main__': user_group_desc=Sample.get_all_user_group_ids('LTAI5t9JzTe3JS9*******', 'lfYmlSmx57KjMdf**********', '-1') print(user_group_desc)
- 根据上述代码得到结果如下,可以正常获取到用户组目录树及对应的UserGroupId
[ { "user_group_name": "数据部", "user_group_id": "c4e8a581-3a12-4410-b52e-e370d61bd79c", "parent_user_group_id": "c7b29ffa-3f07-4379-b5eb-7bfcbcf3fc7e", "child_group_list": [ { "user_group_name": "数据平台组", "user_group_id": "165edc77-2b4f-4ff8-a31e-8e4887991316", "parent_user_group_id": "c4e8a581-3a12-4410-b52e-e370d61bd79c", "child_group_list": [] }, { "user_group_name": "数据智能组", "user_group_id": "91ce46b8-9cbd-4b8a-92e4-84222ac12d88", "parent_user_group_id": "c4e8a581-3a12-4410-b52e-e370d61bd79c", "child_group_list": [] } ] }, { "user_group_name": "财务部", "user_group_id": "12345", "parent_user_group_id": "c7b29ffa-3f07-4379-b5eb-7bfcbcf3fc7e", "child_group_list": [] }, { "user_group_name": "人力部", "user_group_id": "79f6179f-0f27-4c1a-bcc7-e234e0c9609b", "parent_user_group_id": "c7b29ffa-3f07-4379-b5eb-7bfcbcf3fc7e", "child_group_list": [ { "user_group_name": "员工关系部", "user_group_id": "a7edd4fb-c781-47ce-91ef-f3b089a612ef", "parent_user_group_id": "79f6179f-0f27-4c1a-bcc7-e234e0c9609b", "child_group_list": [ { "user_group_name": "原厂管理部", "user_group_id": "f6aff865-167a-4a40-a51f-8951a92a6b10", "parent_user_group_id": "a7edd4fb-c781-47ce-91ef-f3b089a612ef", "child_group_list": [] }, { "user_group_name": "生态管理部", "user_group_id": "76a5b158-bc69-4267-933b-20b4d2f4d293", "parent_user_group_id": "a7edd4fb-c781-47ce-91ef-f3b089a612ef", "child_group_list": [] } ] }, { "user_group_name": "员工福利部", "user_group_id": "5a9d3ce0-29d9-425d-ab1f-dfb71693df54", "parent_user_group_id": "79f6179f-0f27-4c1a-bcc7-e234e0c9609b", "child_group_list": [] } ] } ]