第三方帐号认证方式
第三方帐号集成登录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的向前兼容性。