• 沒有找到結果。

如何集成第三方帐号登录

第三方帐号认证方式

第三方帐号集成登录AppCube的时候,需要在AppCube上认证,AppCube认证成功后 返回“access-token”,第三方帐号通过“access-token”进行访问AppCube。第三方 帐号获取“access-token”的方式有两种:

1. OAuth 2.0协议接入认证:根据鉴权ID和鉴权密钥调用获取用户Token接口来获取 access_token。

2. 单点登录(“CAS”协议)认证:第三方帐号通过CAS server鉴权,鉴权成功后发 送ticket到AppCube,AppCube去CAS server验证ticket合法性并登录,成功后返 回access-token。

OAuth2.0 协议接入认证分类

AppCube采用OAuth 2.0协议进行接入认证。第三方系统在调用AppCube业务接口 前,需要在AppCube上进行鉴权注册,获取接入客户端ID、密钥等鉴权信息,才能实 现调用AppCube业务接口。

AppCube对第三方系统进行OAuth 2.0接入认证的授权类型分为两种:客户端模式和授 权码模式。

客户端模式接入认证操作步骤

1. 在AppCube首页单击“管理”,进入管理中心。

2. 选择“系统设置 > OAuth”。

1-11 参数说明

参数名 说明

名称 用于标识待接入AppCube的第三方系统名称。

例如:配置为“Commerce”。

授权类型 AppCube对第三方系统进行OAuth 2.0接入认证的授权类 型。有以下两种:

– username:当“授权类型”配置为“客户端模式”时,密钥文件会包含该参 数,为上一步设置的用户名。

– client_id:鉴权的客户端ID。

– client_secret:鉴权密钥。

5. 根据鉴权ID和鉴权密钥调用接口“/baas/auth/v1.0/oauth2/token”获取 access_token。后续第三方需要通过access_token访问业务接口。

1-12 接口基本信息

接口名称 接口路径 接口协议 接口方法

token /baas/auth/v1.0/oauth2/

token HTTPS POST

1-13 请求参数说明

pe String M Body 授权模式,Oauth2.0 中的grant_type字段

client_id String M Body 鉴权的客户端ID,可

在OAuth查看。 从上一步 骤获取。

client_se

cret String M Body 鉴权密钥,可在

OAuth查看。 从上一步 骤获取。

redirect_

url String O Body 重定向URL。 http://

www.goog le.com locale String O Body 语言。 en_US

响应样例:

通过Curl请求模拟接口调用:curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=client_credentials&client_id=鉴权ID值

&client_secret=鉴权密钥值' https://AppCube域名/baas/auth/v1.0/oauth2/token 响应如下:

{ "access_token": "ACCESS_TOKEN", "expires_in": 7200,

"token_type": "Bearer"

}

6. 第三方调用AppCube的业务接口,这里以调用AppCube的自定义接口

“registerPortalUser”为例进行举例说明。

a. 通过下面的REST接口调用“registerPortalUser”。

https://AppCube域名/service/SYL__A/1.0.0/registerPortalUser

其中“AppCube域名 ”替换为AppCube对外提供的开发态域名“appcube.cn-north-4.huaweicloud.com”,“/service/SYL__A/1.0.0/registerPortalUser”

为自定义接口URL(在如何注册业务用户中创建发布的业务用户注册接 口)。

b. (可选,调用公共接口时,当需要做CSRF校验时,请执行该步骤),请调接 口“https://AppCube域名/u-route/baas/sys/v1.0/csrf/get”(调该接口时需 要在请求消息头上设置“access-token”)获取“csrf-token”值,返回的 result取值即为“csrf-token”值。

c. 在请求消息头Request Header中增加“access-token”:

“ACCESS_TOKEN ”、“Content-Type”:“application/json”、“csrf-token”:“上一步result取值”。

其中“access-token”取值通过5获取。

d. 在请求消息体中写入该接口的输入参数。

样例如下:

{ "password": "password", "username": "username"

}

e. 调用成功,返回输出结果。

输出样例如下:

{ "msg": "string"

}

名称 用于标识待接入AppCube的第三方系统名称。

例如:配置为“Commerce2”。

授权类型 AppCube对第三方系统进行OAuth 2.0接入认证的授权类 型。有以下两种:

– redirect_uri:当“授权类型”配置为“授权码模式”时,密钥文件会包含该 参数,为上一步设置的重定向地址。

– client_id:鉴权的客户端ID。

– client_secret:鉴权密钥。

5. 第三方系统访问AppCube获取授权码code的接口“https://AppCube域名/baas/

auth/v1.0/oauth2/authorize?response_type=code&client_id=鉴权ID值

&redirect_uri=重定向地址”,如果第三方系统选择同意接受授权,认证服务器将 浏览器重定向到之前第三方系统注册时指定的重定向地址,同时附带上授权码,

6. 客户端收到授权码code,根据鉴权ID、鉴权密钥、授权码code在自己后端调用接 口“ https://AppCube域名/baas/auth/v1.0/oauth2/token”获取access_token。

后续第三方需要通过access_token获取授权用户信息。这一步是服务器上完成

token https://AppCube域名/baas/

auth/v1.0/oauth2/token HTTPS POST

1-16 参数说明

参数名称 类型 必选

(M)/可选

参数含义 值

grant_ty

pe String M 授权模式,Oauth2.0中 的grant_type字段的取 值。

authorization_code

(即授权码模式)

client_id String M 客户端鉴权ID,可在

OAuth查看。 从上一步骤获取。

locale String O 语言。 en_US

响应样例:

通过Curl请求模拟接口调用:curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&client_id=鉴权ID

值&client_secret=鉴权密钥值&redirect_uri=重定向地址&code=授权码' https://

AppCube域名/baas/auth/v1.0/oauth2/token 响应如下:

{ "access_token": "ACCESS_TOKEN", "expires_in": 7200,

"refresh_token":"REFRESH_TOKEN", "token_type": "Bearer"

}

7. (可选)刷新access_token。由于access_token拥有较短的有效期,例如上一步获 取的access_token,有效期是7200秒(即2小时),当access_token超时后,可以

8. 调用请求“https://AppCube域名/u-route/baas/oauth/v1.0/userinfo”获取授权 用户信息,请求方法为GET。

响应如下:

{ "resCode": "0", "resMsg": "成功", "result": {

"usrname": "qxx", "alias": "",

"email": "[email protected]", "aboutme": "",

"company_name": "Huawei", "photo": "",

"address": "",

"phone": "18888888888", "country": "",

在AppCube开发的应用也可自定义OAuth 2.0授权码模式接入鉴权,当应用配置鉴权 后,只有通过鉴权的第三方系统才可访问应用

1. 参考1~4获取鉴权ID“client_id”和鉴权密钥“client_secret”。

2. 在应用开发界面,开发者通过自定义接口,给第三方接入调用,用于第三方系统 获取授权码code。

3. 平台应用调用脚本API,判断第三方客户端的鉴权ID“client_id”和重定向地址

“redirect_url”是否和注册接入鉴权时匹配。如果匹配,则由平台应用自定义接 口,实现登入跳转和授权跳转。在授权完成后,再调用脚本API获取授权码code,

并将需要展示给第三方的授权用户信息通过该API传给AppCube,AppCube会返回 一个code。然后应用重定向到“redirect_url”,并携带code。

– 判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否 和注册接入鉴权时匹配的API样例如下:

import * as oauth from 'oauth'

let handle = oauth.getAuthorizeHandle() let clientDatas: oauth.clientDataFromApp = {

redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c", }let pass = handle.checkURL(clientDatas)

console.log(pass) //true if (pass){

//判断是否登入,做登入跳转 //判断是否授权,做授权跳转 }

– 获取授权码code的脚本API样例如下:

import * as oauth from 'oauth'

let handle = oauth.getAuthorizeHandle()

//前面a步骤已经走完

let clientDatas: oauth.clientDataFromApp = {

redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c", }

let userInfo = { "name": "jack", "phone": "1256287222", "email": "dsfsdf.com"

} let code = handle.getAuthCode(clientDatas, userInfo) console.log(code) //WEUcqXbeQDKUHxcn8til3Q

4. 第三方系统接收到该请求,并解析出code后,在自己的后端访问AppCube接口获 取access_token,其步骤和6一致。

5. 第三方系统在获取到access_token后,用该凭证访问平台“https://AppCube域 名/u-route/baas/oauth/v1.0/third/userinfo”接口(注意,该接口和8中的接口不 同),来获取授权用户的信息。

响应如下:

{ "resCode": "0", "resMsg": "成功", "result": {

"email": "dsfsdf.com", "name": "jack",

"phone": "1256287222"

} }

单点登录(“CAS”协议)认证

单点登录认证是让AppCube作为客户端,第三方进行cas鉴权作为服务端的认证方式。

当AppCube作为客户端时,第三方帐号通过cas鉴权获得ticket,第三方帐号携带ticket 重定向到AppCube,AppCube后台拿到ticket后到CAS Server校验ticket合法性,ticket 合法性验证成功后AppCube返回access-token给第三方帐号供第三方帐号访问

AppCube。

AppCube作为客户端拿到ticket后,提供了sso快捷校验ticket合法性方法。使用sso对 ticket进行验证样例代码如下:

import * as user from 'user';

import * as sys from 'sys';

import * as sso from 'sso'; //使用sso单点登录需要引用 //输入参数

@action.object({type: "param"}) export class MyObject {

@action.param({type: 'String'})

ticket: string; //第三方进行cas鉴权时得到的ticket @action.param({type: 'string'})

service: string; //第三方提供的service }

//输出参数

@action.object({type: "param"}) export class Output {

@action.param({type: 'String'}) username: string; //返回的用户名 @action.param({type: 'String'}) token: string; //返回的Access-token }

//sso登录逻辑

@action.object({type: "method"}) export class ActionDemo {

@action.method({ label: 'greeting something', description: 'greeting something.', input: 'MyObject', output:

'Output' })

public greet(inarg: MyObject): Output { console.log(inarg.ticket);

let ticket = inarg.ticket;

let service = inarg.service;

//cas服务的域名

let casUrl = "http://10.70.67.246:8899/cas"

//根据传入的service和ticket使用sso去cas校验ticket的合法性并返回用户信息 let cli = sso.newClientWithCas(service, ticket, casUrl);

let a = cli.validateTicket();

function createUser(username: string) { try{

let u = {

"userName": username, "name": username, "email": username,

"languageLocaleKey": "zh_CN", "timeZoneSidKey": "10",

"profile": "000T0000000000000002", }

let id = user.createInnerUser(u) console.log(id)

}catch(e) { console.log(e) }

}

2 开发规范

● 逻辑接口Interface:对外暴露的接口服务,Restful API接口可以直接被前台或第 三方系统调用。

● BO是有边界的。BO与BO之间不能共享数据。

● BO对外开放数据视图、接口服务、配置机制、事件等来进行交互,内部实现对外 闭源不可见。

● BO的数据视图以聚合根的形式开放供外部查询。BO可以同时开放多个聚合根。

● BO与BO之间允许有接口调用的引用关系,但设计时应尽量避免BO与BO之间的直 接交互,并完全禁止双向依赖。

● BO中可以包含UI内容如Layout、Widget,但仅作为参考实现。

● BO应尽量利用配置能力来适配不同的业务场景。配置无法满足时才考虑对BO做 Addon扩展。扩展不能影响BO的向前兼容性。