公共应用开放文档

随着DM Hub功能的不断丰富,由此带来的产品复杂性的增加和可维护性的降低日益成为制约产品进一步发展的重要因素。为了简化系统架构,增加产品的灵活性,引入了产品开放平台,从而使得产品的基本架构与应用层分离,实现了应用开发与部署的灵活性,同时减轻了产品核心功能的负担。后续新增的新应用将以应用的形式进行开发,同时为了兼顾与DM Hub核心功能的集成,引入了应用的概念。外部应用由产品研发团队或合作伙伴开发,部署客户或外部系统中。本文档介绍如何从零开始快速开发一个应用。

快速开始

应用项目的开发可以使用如下的项目模板来快速开始:

git clone https://github.com/xsio/plugin-quick-starter.git

或者点击 plugin-quick-starter-v1.0.zip 下载。

前端开发指引

从上面的项目模板开始,可以快速开始应用前端代码的开发。此处的前端是指应用管理段的界面,即从DM Hub应用市场打开应用时访问的界面。产品自动流程和微页面模板相关的前端开发请参考功能开发文档章节。

具体的开发步骤和流程,请参考下面的文档:

应用前端开发指引

后端开发指引

从上面的项目模板开始,可以快速搭建应用后端的服务。该部分包括项目的结构说明、需要配置的点、示例代码以及开发中的注意事项等。

具体的开发步骤和流程,请参考下面的文档:

应用后端开发指引

其中应用与产品的对接部分,请参考下面章节中的“应用服务与产品进行对接的方式”部分。

应用授权开发指引

应用与产品的集成一般通过DM Hub的open API来实现。私有云环境下更多的对接方式参考下面的“应用服务与产品进行对接的方式”章节。

为了调用DM Hub的open API,需要在开放平台上创建一个应用(创建方式参考下面“应用功能开发指引”章节),获取到clientId和clientSecret,并设置应用的授权回调地址。私有云部署方式下的授权回调地址格式一般为:http(s)://{app域名}/plugin/{服务名称}/oauth2,例如:

https://app.convertlab.com/plugin/myservice/oauth2

根据clientId,clientSecret和授权回调地址就可以开始进行授权集成,从而获取到调用DM Hub open API所必须的access token。集成方式请参阅下面的文档:

应用授权开发指引

接口调用安全

对于外部应用,页面上发起的对应用后台接口的调用是通过公网进行的,需要对调用方用户进行认证,防止接口被未授权的用户调用。

在文件grails-app/controllers/interceptor/TenantInterceptor.groovy中定义了全局的拦截器,对除了下面几个接口之外的所有接口进行拦截:

TenantInterceptor() {
    matchAll()
            .except(uri: "/dist/**")
            .except(uri: "/oauth2")
            .except(uri: "/oauth2/callback")
            .except(controller: 'ping', action: 'pong')
}

除了上面排除的几个接口之外,其余的接口都会进行用户鉴权,即检查当前session中是否有用户信息,如果没有则会进行授权流程。由于正常授权时需要用户登录DM Hub,从而防止了攻击者伪造的请求。在TenantInterceptor中定义的鉴权流程如下:

/**
    在公有云插件中,使用下面的代码来获取当前tenant和用户的信息。
*/
Map user = (Map)session.getAttribute('user')
if (!user) {
    redirect(uri: "/oauth2?${request.queryString?:''}", absolute: true)
} else {
    def tenantId
    try{
        log.info("get user: ${user as JSON}")
        tenantId = user.tenantId as Long
    } catch (Exception e) {
        log.error ("invalid tenant id ${user as JSON}", e)
        render status : 400, text : "invalid tenant id"
        return false
    }
    currentTenant.set(tenantId)
}

当用户授权成功时,应该跳转到应用的首页,可以在grails-app/controllers/app/OauthController.groovy中定义:

def callback() {
    def user = oauthService.getUserAndRefreshToken(request)
    if (user['error']) {
        return render(user as JSON)
    }
    session.setAttribute("user", user)
 
    //跳转到应用首页,注意更换为正确的路径
    redirect(url: "/dist/index.html")
}

应用功能开发指引

目前的开放平台支持自动流程action、微页面模块、自定义事件和自定义身份的集成,后续新增集成点会持续更新,请关注本文档。

上述集成点的配置 v2.6 之前的版本开发方式请参阅功能开发文档v2.6 及之后版本的开发方式参阅 微前端应用功能开发文档

外部应用的部署方式

公有云应用部署在产品体系之外,彼此之间通过公网进行通信。其对接方式如下;

对接方式