1 睿智云平台统一帐号、鉴权设计
1.1 鉴权部分
1.2 帐号权限托管能力
下游平台聚焦自身业务,将RBAC部分托管给睿智云中台, 也可自行管理RBAC。
2 约定
2.1返回结果约定
code: 服务器响应码, 200 代表成功, 非200代表失败。
{
"code": "200",
"message":"平台侧相关提示"
}
code 值列表
值 | 类型 | 意义 | 网关行为/前端处理建议 |
---|---|---|---|
200 | String | 成功 | 网关放行 |
4031020 | String | 未登录或未携带票据 | 网关拒绝 |
4031021 | String | access_toke 票据过期 | 网关拒绝/使用refresh_token生成新票据 |
4031023 | String | refresh_token 票据过期 | 网关拒绝/跳转到登录界面 |
4031025 | String | 没有带remacToken头部标识 | 网关拒绝 |
4031026 | String | 没有操作此项的权限 | 网关拒绝 |
4031027 | String | 员工帐号已存在 | |
4031028 | String | 当前租户下员工手机号已占用 | |
4031029 | String | 图形验证码已过期 | 用户重新请求图形验证码 |
4031030 | String | 图形验证码不正确 | 用户无需重新请求图形验证码 |
4031031 | String | 短信验证码过期 | |
4031032 | String | 短信验证码不正确 | |
4031033 | String | 用户没有授予角色 | |
4031034 | Sring | 请求过于频繁 | |
4031035 | Sring | 租户已过期 | |
4031036 | String | 租户已禁用 | |
4031037 | String | 已有相同的帐号登录 | 适用于移动端帐号互踢方案 |
其他响应码 | String | 其他异常响应码 | 网关拒绝 |
2.2域名约定
本次API域名即鉴权网关域名 (范围:本次所有的API,之前的社区平台后端域名
除原登录接口和刷新token使用本次新鉴权网关域名域名外,其余的接口请维持旧的后端域名)
SIT环境 : https://gw-sit.remacsmart.com
生产环境 :https://gw.remacsmart.com
2.3 Http 请求头部约定
http头部:除《6.1 登录》和《 6.2 刷新票据》两个接口以外,所有经过睿智云中台鉴权网关的请求必须在http头部带上以下token标识。
名称:
remacToken , 值 :access_token
其中: access_token为登录或刷新token生成的access_token
影响范围:本次统一登录需求所有API;
注:原社区网关不变 (要求带Authorization 和 tokenInfo )
3 公钥
公钥分为两部分: 用于密码明文加密的公钥和JWT票据解密的公钥。当前文档仅列出测试环境的公钥。
3.1 用于密码明文加密的公钥 (已去掉首部 -----BEGIN PUBLIC KEY-----和 尾部-----END PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRx94bsVgoza8UD97XeXZM3/cu
sKZqdbmoHSYHp0fg/LObJnMYIzDri+fJ2ZBE/BqIAgou2EQWJG3yu9C44WEbJnbn
ntR1LfeVrp6e/5ZsWhjjgyikCfaysEJHSz7cNGdpcx7tgSzGGvUInK8F4lVaHyb8
et1AVnr567ArJg6CoQIDAQAB
3.2 用于JWT票据解密的公钥 (已去掉首部 -----BEGIN PUBLIC KEY-----和 尾部-----END PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7NmfnT4MaT/NtadggelMRpNIY
6Fb7vyAGBSZFbhgNSQaSJqGHUWsyHpyr+DOt15erardcncrxvIrWuzxWJa123jnD
wHjrTFEZCTbuwoIwaEnNqStRuWY2RqTLqzFcUH73lLaOiIyuEKylPL8+ypHv7JBz
zn9q5vIdu3P4kKlItwIDAQAB
4 接口约定
接受睿智云平台所有下游平台自主管理 帐号操作
API列表
编号 | API名称 | 路径 | 版本 | 适用范围 |
---|---|---|---|---|
6.1 | 登录 | /v1/user/sso/login | 1.0 | 所有 |
6.2 | 刷新token | /v1/oauth/sso/refreshtoken | 1.0 | 所有 |
6.3 | 平台统一登录切换接口 | /v1/user/auto/login | 1.0 | 所有 |
6.4 | 管理员批量创建帐号 | /v1/user/register/batch | 1.0 | 所有 |
6.5 | 帐号信息修改 | /v1/user/account/change | 1.0 | 所有 |
6.6 | 用户信息拉取(分页) | /v1/user/batch/pull) | 1.0 | 所有 |
6.7 | 认证配置 | /v1/oauth/client/config | 1.0 | 中台接口;不对外 |
6.8 | 获取认证配置集合 | /v1/oauth/client/config/list | 1.0 | 中台接口;不对外 |
6.9 | 退出登录 | /v1/user/logout | 1.0 | 所有 |
6.10 | 统一登陆配置列表 | /v1/oauth/configs/get | 1.0 | 所有 |
6.11 | 永久token在线生成 | /v1/oauth/token/gen | 1.0 | 仅限超管权限 |
二期接口 | ||||
6.12 | 获取随机验证码 | /v1/user/random/code | 2.0 | |
6.13 | 发送手机验证码 | /v1/user/verifycode/send | 2.0 | |
6.14 | 员工帐号注册 | /v1/user/account/register | ||
6.15 | 员工个人资料加载 | /v1/user/account/load/{id} | 2.0 | |
6.16 | 员工个人资料更新(不含密码更新) | /v1/user/account/edit) | 2.0 | |
6.17 | 员工密码更新 | /v1/user/account/pwdreset | 2.0 | |
6.18 | 图像上传 | http://arch.smartmideazy.com/docs/components/file-component.html#12 | 2.0 | |
6.19 | 员工个人头像更新 | /v1/user/account/avatarreset | 2.0 | |
6.20 | 员工企业信息更新 | /v1/iot/main/company/update | 2.0 | |
6.21 | 获取方案信息 | /v1/iot/main/plan/submit | 2.0 | |
6.22 | 员工企业信息加载 | /v1/iot/main/company/load | 2.0 | |
6.23 | 模拟发送短信 | /v1/user/verifycode/fake?mobile=XXX&verify_code=XXX | 2.0 | 仅在测试环境使用,方便调试,生产环境将移除 |
6.20 员工企业信息加载
描述:体验帐号的员工加载企业信息。 须登录后使用此功能。
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/iot/main/company/load
Method: GET
5 平台通用
5.1 字典
5.1.1 平台标识来源字典
键 | 值 | 类型 | 描述 | |
---|---|---|---|---|
client_id | h5-client | String | 平台管理端标识 | |
app-client | String | 社区管家APP端标识 | ||
ioc-client | String | 社区IOC管理端标识 | ||
tianmu-client | String | 家居天目管理端标识 | ||
tiance-client | String | 家居天策管理端标识 | ||
tiangong-client | String | 家居天工管理端标识 | ||
h5-unit-client | String | 统一平台H5 portal 工程 |
5.1.2 平台client_secret
以下是各平台 测试环境的client_secret (172长度的RSA密钥)
client_id | client_secret | |
---|---|---|
h5-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
app-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
ioc-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
tianmu-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
tiance-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
tigong-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= | |
h5-unit-client | WtN8vIuDCagc+yGsc8b446Q1yq3dvfnaGon9swHakLfp0sef9vP6XFh5XTKv4DukSslh25CLDwWmjycp2hD91P0sJhbbBvjTGnK7XurAWghU0Nt9Hr/OFjJbbQxOn1C18y4DsF2UV0FU0D0zL5rnvnAYuLyctAG/HrkzsT9HJSo= |
5.1.3 帐号类型
描述:社区、家居平台后台管理帐号已统一
键 | 值 | 类型 | 描述 | |
---|---|---|---|---|
account_type | remac | String | 社区后台帐号 | |
smarthome | String | 家居后台帐号,当前包含:天工、天目、天策平台后台管理 帐号 |
5.2 密码明文加密
描述: 所有涉及到用户登录帐号的密码需要用睿智云中台统一的RSA(SHA256)工具进行加密。
5.2.1 java端 RSA加密工具包
当前安卓工具包已提供 , 使用方法如下:
第一步: 引入依赖包。(源码: http://10.18.69.218/remac-mid/remac-rsa-sdk.git)
<dependency>
<groupId>com.remac.mid.sdk</groupId>
<artifactId>remac-rsa-sdk</artifactId>
<version>1.0</version>
</dependency>
第二步:配置平台提供的公匙 , 请向中台索取
第三步: 按照示例完成集成:
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRx94bsVgoza8UD97XeXZM3/cu\n"+
"sKZqdbmoHSYHp0fg/LObJnMYIzDri+fJ2ZBE/BqIAgou2EQWJG3yu9C44WEbJnbn\n"+
"ntR1LfeVrp6e/5ZsWhjjgyikCfaysEJHSz7cNGdpcx7tgSzGGvUInK8F4lVaHyb8\n"+
"et1AVnr567ArJg6CoQIDAQAB";
String pwd = "HelloWorld";
String encrypted = new RsaUtil(publicKey).encrypt(pwd);
System.out.println("--->encrypted=" + encrypted);
iOS 密码加密方法参考:
+ (NSData *)encryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef isSign:(BOOL)isSign {
const uint8_t *srcbuf = (const uint8_t *)[data bytes];
size_t srclen = (size_t)data.length;
size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);
void *outbuf = malloc(block_size);
size_t src_block_size = block_size - 11;
NSMutableData *ret = [[NSMutableData alloc] init];
for(int idx=0; idx<srclen; idx+=src_block_size){
//NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
size_t data_len = srclen - idx;
if(data_len > src_block_size){
data_len = src_block_size;
}
size_t outlen = block_size;
OSStatus status = noErr;
if (isSign) {
status = SecKeyRawSign(keyRef,
kSecPaddingPKCS1,
srcbuf + idx,
data_len,
outbuf,
&outlen
);
} else {
status = SecKeyEncrypt(keyRef,
kSecPaddingPKCS1,
srcbuf + idx,
data_len,
outbuf,
&outlen
);
}
if (status != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
ret = nil;
break;
}else{
[ret appendBytes:outbuf length:outlen];
}
}
free(outbuf);
CFRelease(keyRef);
return ret;
}
5.2.2 vue RSA加密工具包
使用 JSEncrypt 工具完成密码明文加密后经http传输平台层必须使用统一的 java RSA 工具包完成解密。
vue 使用示例 :
第一步: 先安装工具包
npm install jsencrypt 或者 yarn add jsencrypt
第二步:配置平台公钥 , 请向中台索取。在main.js 全局挂载:
import { JSEncrypt } from 'jsencrypt'
//JSEncrypt加密方法
Vue.prototype.$encryptedData = function(publicKey, data) {
//new一个对象
let encrypt = new JSEncrypt()
//设置公钥 publicKey是公钥
encrypt.setPublicKey(publicKey)
//data是要加密的数据
let result = encrypt.encrypt(data)
return result
}
或者在需要加密的vue中直接引入JSEncrypt再自定义函数 encryptedData
import { JSEncrypt } from 'jsencrypt'
methods: {
// 加密
encryptedData(publicKey, data) {
// 新建JSEncrypt对象
let encryptor = new JSEncrypt();
// 设置公钥
encryptor.setPublicKey(publicKey);
// 加密数据
return encryptor.encrypt(data);
},
...
}
encryptedData函数中参数:publicKey为平台RSA公钥,data 为需要加密的字段。
vue项目地址: https://github.com/travist/jsencrypt.git
5.2.3 密码规范
参见正则:
^[A-Za-z0-9\\_\\-\\@\\.\\*\\$]{8,16}$
密码必须同时包含英文字母、数字且必须包含特殊字符如:-_@.*$"。 长度8至16个字符。
5.2.4 邮箱规范
合法E-mail地址:
- 必须包含一个并且只有一个符号“@”
- 第一个字符不得是“@”或者“.”
- 不允许出现“@.”或者.@
- 结尾不得是字符“@”或者“.”
- 允许“@”前的字符中出现“+”
- 不允许“+”在最前面,或者“+@”
- 长度5-24个字符
5.3 JWT 解密工具
说明 : 解密工具用于解析由睿智云中台生成的JWT token 。如:《6.1 登录》接口中返回的access_token
<dependency>
<groupId>org.json.web</groupId>
<artifactId>jwt-decrypt</artifactId>
<version>1.0</version>
</dependency>
具体用法示例 :
String publicKeyContent = "-----BEGIN PUBLIC KEY-----\n"+
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7NmfnT4MaT/NtadggelMRpNIY\n"+
"6Fb7vyAGBSZFbhgNSQaSJqGHUWsyHpyr+DOt15erardcncrxvIrWuzxWJa123jnD\n"+
"wHjrTFEZCTbuwoIwaEnNqStRuWY2RqTLqzFcUH73lLaOiIyuEKylPL8+ypHv7JBz\n"+
"zn9q5vIdu3P4kKlItwIDAQAB\n"+
"-----END PUBLIC KEY-----\n";
Decryptor jwt = new Decryptor( publicKeyContent );
String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJyZW1hYyIsImp0aSI6IjU0NGYwZjY5LTRhZjItNDZkMy04NjU0LWRmYTA5YmYyN2FjZCIsInVzZXJfaWQiOiIxMTIwIiwiaXNzIjoic29mdHdhcmUiLCJpYXQiOjE2NDQ4MDY5NTQsImV4cCI6MTY0NDgxNDE1NH0.tG_lMN9ov4RraWpc8i7leT8KMvT8BwIaIoX11uYQOqpTDoJCZagqj18aM7I3QGYLExUFNFH1Fhu5Xih48Czs4mrnRLNhCq5OAxAE_OeaUl6LeGM0Yc1QzORzPZ8fRFMuD8_dHrXGeDdUgNI2OIoymzXvnDmEcacEQvKuk0hoELI";
Claims claims = jwt.verifyToken(token, "RS256");
System.err.println(claims);
注: 以上解密工具SIT环境请使用 《5.3 JWT 解密工具 》部分所列的公钥。生产环境不会在此文档中更新 。
5.4 用户密码字段统一加密工具
请统一使用睿智云中台的《用户密码字段统一加密工具》将用户的密码明文加密后存储于数据库表中。
与 《5.2 密码明文加密》工具不同的是:用户密码不可解密,而《5.2 密码明文加密》的密码明文通过平台公钥加密后可以由平台私钥解密。 为实现不同平台的帐号单点登录功能,密码密文必须使用同样的加密工具,由于帐号统一在睿智云中台管理,故密码必须使用相同的加密工具。
如何使用?
将以下依赖包引入工程中,
<dependency>
<groupId>com.remac.mid.sdk</groupId>
<artifactId>remac-encryptor-sdk</artifactId>
<version>5.2.1</version>
</dependency>
见: com.remac.crypto.Sample源码
public static void main(String[] args) {
String pwd = "Hello"; //密码明文
String encrypted = new BCryptPasswordEncoder().encode(pwd); //BCrypt加密码后的密文
System.out.println("--->encrypted:"+encrypted);
boolean b = new BCryptPasswordEncoder().matches(pwd, encrypted);//密码与明文比对
System.out.println("--->encrypted matched raw pwd:"+b);
}
5.5 消息 SDK
描述:基于rocketMQ, 用于睿智云中台与下游平台同步数据。具体用法请参见:
https://confluence.mideazy.com/pages/viewpage.action?pageId=271089676
http://10.18.69.218/remac-common/remac-base-components
https://confluence.mideazy.com/pages/viewpage.action?pageId=271089676
5.5.1 睿智云中台消息同步协议约定
消息格式结构 | 业务场景 | tag | topic |
---|---|---|---|
{ {"tag","login", "topic": "sso-login-topic"}, "payload": { "client_id":"h5-client, "id": 1, "user_name": "test", "time":'2021-12-09 13:01:02"} } | 登录 | login | sso-login-topic |
{ {"tag","login","topic": "sso-login-topic"}, "payload": { "client_id":"h5-client, "id": 1, "user_name": "test", "time":'2021-12-09 13:01:02"} } | 自动登录 | login | sso-login-topic |
{ {"tag","logout","topic": "sso-login-topic"}, "payload": { "client_id":"h5-client, "id": 1, "user_name": "test", "time":'2021-12-09 13:01:02"} } | 帐号退出 | logout | sso-login-topic |
属性 | 类型 | 说明 |
---|---|---|
client_id | String | 见《5.1.1 平台标识来源字典》 |
id | String | 用户表主键 ID |
user_name | String | 用户帐号名,即用户表中的job_number字段 |
time | Date | 消息产生的时间 |
tag | String | RocketMQ tag |
topic | String | 默认为 sso-login-topic |
payload | JSONObject | 包含id, client_id, user_name, time 字段 |
5.6 睿智云中台统一鉴权工具包
5.61. maven 地址
<dependency>
<groupId>com.remac.mid.sdk</groupId>
<artifactId>remac-token-sdk</artifactId>
<version>1.0</version>
<dependency>
5.6.2 用法示例
RemacToken 在spring环境中,请使用单例。 统一以秒为单位。
推荐值:
connectTimeOut: 5 (秒)
readTimeOut: 10 (秒)
axIdleConnections:100
keepAliveDuration: 30(秒)
@Value("${connectTimeOut}")
private int connectTimeOut;
@Value("${readTimeOut}")
private int readTimeOut;
@Value("${axIdleConnections}")
private int axIdleConnections;
@Value("${keepAliveDuration}")
private long keepAliveDuration;
@Value("${tokenUrl}")
private String tokenUrl;
@Bean
public RemacToken remacToken() {
return new RemacToken(connectTimeOut,
readTimeOut,
writeTimeOut,
maxIdleConnections,
keepAliveDuration,
tokenUrl);
}
@Autowired
private RemacToken remacToken;
String remacToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJiZXR0eSIsInNjb3BlIjpbImFsbCJdLCJuYW1lIjoiYmV0dHkiLCJpZCI6Ijg3MzA1IiwiZXhwIjoxNjQ3MzE5MzMxLCJqdGkiOiIyM2ZiOGEyNS1mNWQwLTQ4MzItOWI5My0wZThlZTZmYzlkMmQiLCJjbGllbnRfaWQiOiJoNS11bml0LWNsaWVudCIsImlzX3N1cHBlciI6IjEifQ.a_VlyHCliK5nSITq9V0ebjP012uTmExDieadwpaoQujTsTNsazseh7WZQHgDNxARb2fZJWLWQrE5ill_DPnYaiofPt_QYUtL3SL8QnAUmYnkNfF-3slC7wsCIy4TqmwFszh3yrkot3ZkVa05nIpVukSvdh1rZzAPHzEg-a2HBOs";
JSONObject json = token.validateToken(remacToken);
System.out.println("--->json=" + json);
// 返回结果见:http://arch.smartmideazy.com/docs/account/account-doc.html
5.6.3 返回结果约定
正确返回,result 对象包含帐号的信息,帐号信息由睿智云中台通过私钥将 remacToken头部解密后将用户的信息明文返回。
{
"code":"200",
"message":"成功信息"
"result": {"id":"110", "name":"jack", "user_name":"betty", "client_id":"h5-client"}
}
其他错误码请参见 2.1返回结果约定
注: 除SDK外,也可以基于http 接口调用来实现。 详见: http://arch.smartmideazy.com/docs/account/account-validate.html
5.7 帐号规范
合法帐号 : 4-16个长度,可以是英文、数字、、-、@、.。 参见正则:^[A-Za-z0-9\\-\@\.]{4,16}$"),
6 API 定义
6.1 登录
描述 用户登录后,需要将票据信息Authorization(bearer access_token)和tokenInfo放在HTTP Header中用于请求平台API, 未携带票据信息将在网关层被拒绝。
详见: http://47.111.56.94/apidoc/main-entry/API.html 具体如何使用请参见:《Part II 前端(含H5、小程序、APP)请求Token 约定》。除特别声明,除登录、刷新票据接口外,其他接口http header均须带上Authorization和tokenInfo ,具体用法请参见: http://47.111.56.94/apidoc/main-entry/API.html ,否则网关将拒绝请求。
请求信息
HTTP协议:HTTP,HTTPS
uri:/v1/user/sso/login
方法:POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
job_number | string | y | 帐号 见《5.7 帐号规范》 |
pwd | String | y | 密码, 须遵循 《5.2 密码明文加密》完成明文的加密 |
client_id | String | y | 各内、外部系统的客户端标识,由平台统一约定,详见《5.1.1 平台标识来源》字典 |
client_secret | String | y | oauth2 客户端密钥 ,由平台配置并提供, 平台已加密; |
String | N |
请求参数: app_id: 类型: String; App端登录此值必传。 如:管家App登录。
请求Body描述(非Form表单数据)
{"job_number": "betty", "pwd": "GuXq7XwbRMDWFMz63tSsZG0LqMi6R1+qW3B6Rg7zblWdIOAOIl8LdDygVSP/5kohYrY/7kCKp5TVKRwsZal+YfGboWaK96CR/Y8yKUHWIBrglj+ujQc3ibd2QBE8N/yBHM6cFKrKWZMpbV1D8yG5OSUt81SFdCu88ENGxT5tDa4=
", "client_id":"h5-client", "client_secret":"R9fkMHbDjgNY8yCth9zt2DdMkPe/6PS+bRA6lifLmJr0ZEq1n2+L9qTVpdmNXf08nISFpv8rIIaBz6fZTjKrQiptsHqt6cUEhIvGG2Spfu4tGUcJ9H1pKCg0wV74kgTGCITe4SggwnNfOimW8ID7d6Flg6LxUQGKHsnxPFVlGzY=", "grant_type": "password"}
返回信息
返回参数类型
JSON
返回参数
名称 | 类型 | 层级 | 必返 | 描述 |
---|---|---|---|---|
code | string | 顶级 | 是 | 响应码标识 |
message | string | 顶级 | 是 | 响应消息文本 |
result | JSONObject | 顶级 | 否 | 响应数据对象 |
tokenInfo | JSONObject | 二级 | 否 | 自定义用户信息返回 |
token | JSONObject | 二级 | 否 | 登录成功后,由认证服务返回合法的token |
business_org_trees | JSONObject | 二级 | 否 | 登录成功后,由认证服务返回用户所拥有的业务组织书 |
token字段说明
字段属性
名称 | 类型 | 层级 | 必返 | 描述 |
---|---|---|---|---|
access_token | string | 顶级 | 是 | 登录成功后,由认证服务返回的合法token票据 |
refresh_token | string | 顶级 | 是 | 登录成功后,由认证服务返回的合法刷新token票据,用于当access_token过期后,客户端可用refresh_token向平台发送刷新票据请求。refresh_token的过期时间比access_token长,由平台配置。 |
expires_in | Long | 顶级 | 否 | token票据的有效时间,单位为秒 |
返回结果示例
{
"code": "200",
"message": "成功",
"result": {
"token": {
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDQ1NTk2NzcsInVzZXJfbmFtZSI6ImJldHR5IiwianRpIjoiMmUxZTAyYzAtNzg0Yy00Yjk5LTk5NWEtMDkzN2JjMzQ2ZjJhIiwiY2xpZW50X2lkIjoiaDUtY2xpZW50Iiwic2NvcGUiOlsiYWxsIl19.Fv5yUEjJWLueUwcEkwHaz8rvEwebmMpl0v1z6Q-3LUy_NvEYv7yHmqz1TVhcgkRb1wFpQjqH2sm-en9ooFEZFpA9QkkP0wEF6c93ssmHRXLmbp84F6LmzJWHTPCsdpz_ibZHJeJ0KosxHxFvHzglOkyDT5XsCQ7Qh-Nk4r0SfXA",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDQ1OTIwNzcsInVzZXJfbmFtZSI6ImJldHR5IiwianRpIjoiOWIwZjU3ZTgtOWIwZC00N2ZlLWEwNGQtZGQ5NWM5ZDk0YjcwIiwiY2xpZW50X2lkIjoiaDUtY2xpZW50Iiwic2NvcGUiOlsiYWxsIl0sImF0aSI6IjJlMWUwMmMwLTc4NGMtNGI5OS05OTVhLTA5MzdiYzM0NmYyYSJ9.kwwu23xP5GksXp_81nEfdKG7SGlwpk4Lk3uzu8kCqo6OkM0CMJdbJbT6C-ixi2mVRbC6CceQEgitX-g9Kgr8hchlwDgWFwp3nAMwrvi94mo-bUvDoXEQv2utrhaNswJGGmdSd_En41bdwooZMlksVRUls0PQV5hh8OIYFop2V6s",
"scope": "all",
"jti": "2e1e02c0-784c-4b99-995a-0937bc346f2a",
"expires_in": 3599
},
"tokenInfo": {
"name": "betty",
"orgFullName": "美的置业",
"id": "87305",
"orgId": "15263",
"org_code": "100000000",
"user_name": "betty",
"position": "无业游民",
"mobile": "13302422689",
"is_supper": 1,
"status": 1,
"bizOrgId": null,
"bizOrgCode": null,
"bizOrgFullName": null,
"credentials": null,
"roles": null,
"orgRoles": null,
"tenantId": null,
"top_org_code": null,
"top_org_id": null,
credentials: "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJwbGF0Zm9ybV90aWNrZXQiLCJqdGkiOiJhZjRlM2EwMzYyMGQ0OGFmYTE4Y2Q0NTFiOWM1Y2ZiYiIsInRvcF9vcmdfY29kZSI6IjEwMDAwMDAwMSIsInRvcF9vcmdfaWQiOjE1MjY0LCJ0ZW5hbnRJZCI6IjEiLCJpZCI6ODczMDUsImlzX3N1cHBlciI6MSwiaXNzIjoicmVtYWMiLCJpYXQiOjE2NDU3NTAwMjcsImV4cCI6MTk2MTExMDAyN30.bYOR-qCc3sZdPkFiHzjWvFgx-uP7cW2A3038n0DfWpn03-9xyx3DWTSqVtWseH8M8tzoM0O51j_E2zS828zK9Ofn1s5NoVkjJpSZ2Uql3BZgpQNoYmwnJhwuuQf8sXHHaoWFa53x29ICeHPv8zOnBO8IqgEYI9_o5nCe8V-6vMo"
},
"business_org_trees": {
"code": "200",
"message": "成功",
"version": null,
"returnExceptionData": false,
"trees": [
{
"tree": [
{
"id": 15264,
"org_code": "100000001",
"org_name": "美的置业-业务",
"parent_code": null,
"parentid": null,
"full_org_name": "美的置业-业务",
"org_type": 2,
"sub_type": 2,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": [
{
"create_by": null,
"update_by": null,
"create_by_id": null,
"update_by_id": null,
"create_time": "2020-12-08T14:56:13.000+00:00",
"update_time": "2021-02-22T12:53:20.000+00:00",
"id": 15274,
"org_code": "100000001100000000",
"org_name": "美的新海岸446",
"parent_code": "100000001",
"parentid": 15264,
"full_org_name": "美的置业-业务/美的新海岸446",
"org_type": 2,
"sub_type": 1,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": null
},
{
"id": 20373,
"org_code": "100000001100000001",
"org_name": "朱慧媛-美的置业项目-勿动",
"parent_code": null,
"parentid": 15264,
"full_org_name": "美的置业-业务/朱慧媛-美的置业项目-勿动",
"org_type": 2,
"sub_type": 1,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": null
},
{
"id": 20527,
"org_code": "100000001100000002",
"org_name": "美的置业广场",
"parent_code": null,
"parentid": 15264,
"full_org_name": "美的置业-业务/美的置业广场",
"org_type": 2,
"sub_type": 2,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": [
{
"id": 21176,
"org_code": "100000001100000002100000000",
"org_name": "睿住智能科技",
"parent_code": null,
"parentid": 20527,
"full_org_name": "美的置业-业务/美的置业广场/睿住智能科技",
"org_type": 2,
"sub_type": 2,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": [
{
"id": 21177,
"org_code": "100000001100000002100000000100000000",
"org_name": "置业19楼项目",
"parent_code": null,
"parentid": 21176,
"full_org_name": "美的置业-业务/美的置业广场/睿住智能科技/置业19楼项目",
"org_type": 2,
"sub_type": 1,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": null
},
{
"id": 21178,
"org_code": "100000001100000002100000000100000001",
"org_name": "置业20楼项目",
"parent_code": null,
"parentid": 21176,
"full_org_name": "美的置业-业务/美的置业广场/睿住智能科技/置业20楼项目",
"org_type": 2,
"sub_type": 1,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": null
},
{
"id": 111259,
"org_code": "100000001100000002100000000100000002",
"org_name": "aaaaaa",
"parent_code": null,
"parentid": 21176,
"full_org_name": "美的置业-业务/美的置业广场/睿住智能科技/aaaaaa",
"org_type": 2,
"sub_type": 1,
"org_id": null,
"src": 1,
"parent_org_id": null,
"logic_deleted": 1,
"tenant_id": 0,
"parent_name": null,
"children": null
}
]
}
]
]
"menus": [],
"role": null
},
"communitys": null,
"menu_trees": null,
"roles": null
}
}
注:返回结果可以根据各平台的要求定制。
business_org_trees 字段:返回多棵业务组织树型结构。
睿智云平台网关鉴权及用户登录逻辑时序图
token和tokenInfo 字段必返。
tokenInfo 数据结构如下:
"tokenInfo": {
"name": "betty",
"orgFullName": null,
"id": "87305",
"orgId": "15263",
"org_code": "100000000",
"user_name": "betty",
"position": "无业游民",
"mobile": "13302422689",
"is_supper": 1,
"status": 1,
"bizOrgId": null,
"bizOrgCode": null,
"bizOrgFullName": null,
"credentials": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJwbGF0Zm9ybV90aWNrZXQiLCJqdGkiOiJjYzBkNjE5YmY3ZTA0YTlmYTNiMzk1Zjg5ZWNkOWMzZCIsInRvcF9vcmdfY29kZSI6IjEwMDAwMDAwMSIsInRvcF9vcmdfaWQiOjE1MjY0LCJ0ZW5hbnRJZCI6IjEiLCJpZCI6ODczMDUsImlzX3N1cHBlciI6MSwiaXNzIjoicmVtYWMiLCJpYXQiOjE2NDU2NzIxMTMsImV4cCI6MTk2MTAzMjExM30.XCmrpUk0QT-_XWiivxgIiciEAAbF_7Nb2Dy7ohh9mAPS61k3CL0owBqlfdsvVXPdu15xUEcpjKmpX2kUR4oq7touK-X2o6IRDDFynzfaXN2HQX8moZdjtJY8m25bPsJ-1BwkMjAWmDkHWeJHstLMF0uWsubtVJnO5qSDGWIv7D0",
"roles": null,
"orgRoles": null,
"tenantId": null,
"top_org_code": null,
"top_org_id": null
},
其中 credentials 字段: 鉴于安全考虑使用了jwt加密,请使用《5.3 JWT 解密工具》进行解密。
credentials中存储了用户的敏感数据,如:
top_org_id: 顶级业务组织ID (超管为空)
top_org_code: 顶级业务组织code (超管为空)
is_supper: 超管标识
id : 帐号主键
下面给出如何从 tokenInfo 中取出加密信息
String tokenInfoStr = URLDecoder.decode( tokenInfo , "UTF-8"); //先decode
JSONObject json = JSONObject.parseObject(tokenInfoStr);
String credentials = json.getString("credentials");
Decryptor jwt = new Decryptor( publicKeyContent );
Claims claims = jwt.verifyToken(token, "RS256");
String id = claims.get("id");
....
access_token 解密同上, 解密出来的数据结构如下:
{id=132870, exp=1645787180, user_name=18680546087, jti=7ff38760-8d6c-4786-b759-d52e436467a1, client_id=h5-client, scope=[all]}
6.2 刷新票据
描述 当access_token票据过期,用户可以调用此接口来续期。生成新的access_token和refresh_token
请求信息
HTTP协议:HTTP,HTTPS
uri:/v1/oauth/sso/refreshtoken
方法:POST
请求Body
名称 | 层级 | 类型 | 必填 | 描述 |
---|---|---|---|---|
client_id | 顶级 | String | y | 见 《5.1.1 平台标识来源字典》 |
client_secret | 顶级 | String | y | oauth2 客户端密钥 ,由平台配置并提供, 平台已加密; |
refresh_token | 顶级 | String | y | 登录成功后,由认证服务返回的合法刷新token票据,用于当access_token过期后,客户端可用refresh_token向平台发送刷新票据请求。refresh_token的过期时间比access_token长,由平台配置。 |
grant_type | 顶级 | String | y | 此处用:refresh_token |
id | 顶级 | Long | N | 员工帐号ID,管家 APP刷新TOKEN必传。 当refresh_token过期平台需要按退出处理 |
请求Body描述(非Form表单数据)
{
"client_id": "h5-client", "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDQ1NTk2NzcsInVzZXJfbmFtZSI6ImJldHR5IiwianRpIjoiMmUxZTAyYzAtNzg0Yy00Yjk5LTk5NWEtMDkzN2JjMzQ2ZjJhIiwiY2xpZW50X2lkIjoiaDUtY2xpZW50Iiwic2NvcGUiOlsiYWxsIl19.Fv5yUEjJWLueUwcEkwHaz8rvEwebmMpl0v1z6Q-3LUy_NvEYv7yHmqz1TVhcgkRb1wFpQjqH2sm-en9ooFEZFpA9QkkP0wEF6c93ssmHRXLmbp84F6LmzJWHTPCsdpz_ibZHJeJ0KosxHxFvHzglOkyDT5XsCQ7Qh-Nk4r0SfXA","grant_type":"refresh_token", "job_number":"betty", "client_secret":"R9fkMHbDjgNY8yCth9zt2DdMkPe/6PS+bRA6lifLmJr0ZEq1n2+L9qTVpdmNXf08nISFpv8rIIaBz6fZTjKrQiptsHqt6cUEhIvGG2Spfu4tGUcJ9H1pKCg0wV74kgTGCITe4SggwnNfOimW8ID7d6Flg6LxUQGKHsnxPFVlGzY"
}
返回参数
名称 | 位置 | 类型 | 必填 | 描述 |
---|---|---|---|---|
access_token | 第一层 | String | y | 登录成功后,由认证服务返回的合法token票据 |
refresh_token | 第一层 | String | y | 登录成功后,由认证服务返回的合法刷新token票据,用于当access_token过期后,客户端可用refresh_token向平台发送刷新票据请求。refresh_token的过期时间比access_token长,由平台配置。 |
expires_in | 第一层 | Int | y | token票据过期时间 |
返回结果示例
{
"code": "200",
"message": "成功",
"result": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDYzOTE0NjIsInVzZXJfbmFtZSI6ImJlc3RzaGkxMjM0IiwianRpIjoiNzEzMDRmZjEtMjBjZC00YTRlLThjYTctMjUwOGE5OTQ3ODlkIiwiY2xpZW50X2lkIjoiaDUtY2xpZW50Iiwic2NvcGUiOlsiYWxsIl19.4uvHXhlEXJW4Z_dvJEqFnAmk-SSYq8xvP6nEwWMhep8",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDY0MjMzOTYsInVzZXJfbmFtZSI6ImJlc3RzaGkxMjM0IiwianRpIjoiNDM1ZjlkYzgtYzQyMC00ZDEwLWFhMjAtYjNmODE5NTY1ZTBmIiwiY2xpZW50X2lkIjoiaDUtY2xpZW50Iiwic2NvcGUiOlsiYWxsIl0sImF0aSI6IjcxMzA0ZmYxLTIwY2QtNGE0ZS04Y2E3LTI1MDhhOTk0Nzg5ZCJ9.F3S38ewnEPIUzCa0zQPqApP4TOIrRmwFlgJnngWW-2Y",
"scope": "all",
"jti": "71304ff1-20cd-4a4e-8ca7-2508a994789d",
"expires_in": 3599
}
}
6.3 平台统一登录切换接口
描述 适用于已登录的帐号从一个平台切换到另外一个平台后实现自动登录的效果。由于切换平台后client_id有变化,需要重新生成新的票据access_token和新的refresh_token 以便于在票据access_token过期后可以拿refresh_token主动向睿智云中台请求刷新token。可以简单地理解成用户已登录其中一个平台,拿着生成的票据自动登录其他平台。
方案1: 下游平台有自己的帐号,帐号不托管到睿智云中台。
平台帐号从一个平台切换到另一个平台前提是不同平台的帐号有相同的手机号码(或同一微信公众号下的openid,已预留)
场景: 张三在睿住社区有帐号zhangsan, 手机号:134 登录了睿住社区,现切换至家居天目的后台,
调用 此接口,即《平台统一登录切换接口》, 中台网关由http请求头部 Authorization ,tokenInfo 识别用户身份,由关联手机号找到切换新平台绑定同一手机号的帐号,再用新平台帐号登录,返回登录数据 。
方案2: 下游平台无帐号,帐号托管至睿智云中台。本次家居平台按此种方案对接。
请求信息
HTTP协议:HTTP,HTTPS
URL:/v1/user/auto/login
http头: 请严格遵循 《2.3 Http 请求头部约定》
方法:POST
请求body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
client_id | String | y | 所切换平台的client_id, 由平台统一约定,见《5.1.1 平台标识来源字典》 |
client_secret | String | y | 切换到新的平台所对应的client_secret |
请求参数: app_id: 类型: String; App端登录此值必传。 如:管家App登录。
请求body示例
{
"client_id": "app-client", "client_secret":"R9fkMHbDjgNY8yCth9zt2DdMkPe/6PS+bRA6lifLmJr0ZEq1n2+L9qTVpdmNXf08nISFpv8rIIaBz6fZTjKrQiptsHqt6cUEhIvGG2Spfu4tGUcJ9H1pKCg0wV74kgTGCITe4SggwnNfOimW8ID7d6Flg6LxUQGKHsnxPFVlGzY"
}
返回信息
返回《6.1 登录》相同的数据,可以根据下游平台定制返回数据。
6.4 管理员批量创建帐号
描述: 批量创建家庭的游客帐号。注:仅供家庭帐号使用。
请求信息
支持批量:
HTTP协议:HTTP,HTTPS
uri:/v1/user/register/batch
http头: 请严格遵循 《2.3 Http 请求头部约定》
方法:POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
account_type | String | y | account_type : 见《5.1.3 帐号类型》描述. |
list | JSONArray | y | 批量帐号信息对象集合。批量尺寸最大100个用户。 |
list 集合中的JSONObject对象 各属性:
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
job_number | String | y | 帐号 , 一旦创建不可修改 ; 4-16 个字符长度 |
pwd | String | y | 密码, 传参须遵循 《5.2 密码明文加密》完成明文的加密; 8-16个字符长度 |
mobile | String | y | 手机号, 不同帐号类型下唯一 |
is_effective | int | N | 1:帐号启用 2:帐号禁用; 默认1 |
status | int | N | 1为正常、2为离职或注销; 默认1 |
name | String | y | 姓名 |
nickname | String | N | 昵称 |
String | N | 邮箱 |
请求Body描述
{
"account_type":"smarthome" ,
"list": [ {"name":"BB", ... }, {"name":"BB", ... } ]
}
返回参数
批量新增接口是异步执行的, 返回批量新增的案件编号settlement_id , 由批量案件编号来查询执行结果。
{
"code":"200",
"message":"success",
"data":{
"settlement_id": "XXXXXX"
}
}
6.4.1 批量新增用户执行结果查询
描述: 由《6.4 管理员批量创建帐号》接口返回的 settlement_id来查询批量用户新增结果。
请求信息
支持批量:
HTTP协议:HTTP,HTTPS
uri:/v1/iot/main/register/batch/query
http头: 请严格遵循 《2.3 Http 请求头部约定》
方法:POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
settlement_id | String | y | 批量用户新增案件编号 |
返回结果:
{
"code":"200",
"message":"success",
"data":{
"code": "1",
"fail_results": [{
"job_number":"XXX", "fail_reason":"密码不符合规范"
}]
}
}
返回相关字段说明:
code: 类型String, 执行结果 ,1: 已执行完。 2: 执行中
fail_results: 类型 JSONArray , 帐号新增失败的原因
6.5 帐号信息修改
描述:
请求信息
支持批量:
HTTP协议:HTTP,HTTPS
URL:/v1/user/account/change
http头: 请严格遵循 《2.3 Http 请求头部约定》
方法:POST
请求 Body
名称 | 层级 | 类型 | 必填 | 描述 |
---|---|---|---|---|
id | 顶级 | Long | y | 后台帐号表主键 |
pwd | 顶级 | String | N | 密码, 传参须遵循 《5.2 密码明文加密》完成明文的加密 |
mobile | 顶级 | String | N | 手机号 |
is_effective | 顶级 | int | N | 1:帐号启用 2:帐号禁用; 默认1 |
status | 顶级 | int | N | 1为正常、2为离职或注销; 默认1 |
name | 顶级 | String | N | |
顶级 | String | N | ||
nickname | 顶级 | String | N | |
sex | 顶级 | int | N | 性别: 0:未知,1为女,2为男; 默认0 |
6.6 用户信息拉取(分页)
描述:
请求信息
支持批量:
HTTP协议:HTTP,HTTPS
uri:/v1/user/batch/pull)
http头: 请严格遵循 《2.3 Http 请求头部约定》
方法:POST
请求Body
名称 | 层级 | 类型 | 必填 | 描述 |
---|---|---|---|---|
pageNo | 顶级 | Long | N | 页码;默认 1; |
pageSize | 顶级 | String | N | 每页记录条数;默认 20 条;最大100 ; |
account_type | 顶级 | String | N | 见《5.1.3 帐号类型》描述, 不传些值代表请求所有帐号 |
order_by | 顶级 | String | N | DESC: 降序 ASC: 升序 , 按ID和更新时间排序, 默认降序,显示最新数据 |
key_word | 顶级 | String | N | 支持手机号/姓名/帐号全模糊查询 |
is_effective | 顶级 | int | N | 不传参数显示所有;帐号是否有效,1: 有限, 2: 无效 |
返回格式示例:
{
"code": "200",
"data": {
"result": [
{
"is_effective": 1,
"update_time": 1647047170000,
"last_login_time": null,
"sex": 0,
"mobile": "13146060168",
"name": "刘添明",
"nickname": "客户000095",
"id": 133048,
"job_number": "13146060168",
"email": "13146060168@midea.com",
"status": 1
}
],
"total": 1,
"pageNo": 1,
"totalPage": 1,
"pageSize": 20
},
"message": "success"
}
6.7 退出登录
描述 适用于已登录帐号在睿智云任意子系统退出。
请求信息
HTTP协议:HTTP,HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
uri:/v1/user/logout?id = XX
方法:GET
参数:管家帐号id 仅 管家app 需要传。 其他端请勿传。
注意: 同一帐号退出登录后,该帐号经过睿智云中台网关的任意请求将视为未登录。
睿智云中台将发布退出登录主题的rocketMQ 消息,下游平台订阅到用户退出登录事件后,在自己的网关识别该帐号已退出登录。
由于下游平台仅部分功能请求睿智云中台网关, 靠中台的access_token 来识别帐号是否合法(未过期、帐号信息等), jwt access_token 一旦生成,未过期仍可用。收回 access_token的做法合下游平台自己要处理。 参照中台做法是:退出登录后,缓存中存放用户已退登, 网关拦截器层每次从access_token解析出帐号(job_number) 先查询是否有退登缓存; 用户登录成功后,将该帐号的退登缓存移除 。
6.8 获取随机验证码
描述:用户在调用手机号发送验证码前,需要填写随机验证码。此验证码支持刷新。
注: 验证码 5 分钟后过期。
URL: /v1/user/random/code
http://10.73.160.70:6001/v1/user/random/code
Method: get
返回结果:
直接返回4个字符的图片流。
前端使用示例:
<img src="https://gw-sit.remacsmart.com/v1/user/random/code" width="105px" height="32px" />
默认生成长:105像素、宽:32像素的图片验证码。
6.9 发送手机验证码
HTTP协议:HTTP,HTTPS
URL: /v1/user/verifycode/send
注: 此验证码适用于注册场景,会校验手机号是否重复。
Method: POST
注: 手机验证码在2分钟后过期。发送4位短信验证码。
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
mobile | string | y | 手机号 |
random_code | String | y | 图片随机码4位字符。由 《6.12 获取随机验证码》获取的图片随机验证码。 |
6.10 员工帐号注册
URL: /v1/user/account/register
Method: POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
job_number | string | N | 帐号,不填即使用手机号mobile作为帐号。帐号在平台是唯一的。 4-16位长度,正则:^[A-Za-z0-9\_\-\@\.]{4,16}$。除社区帐号(src =1)外其他帐号来源此字段必填 |
mobile | mobile | Y | 手机号 |
verify_code | String | y | 短信验证码 |
pwd | String | y | 密码, 须遵循 《5.2 密码明文加密》完成明文的加密;且密码须遵循《5.2.3 密码规范》 正则: ^[A-Za-z0-9\_\-\@\.\*\$]{8,16}$ |
src | Int | N | 帐号来源,4: 家庭帐号, 1:社区帐号。家庭帐号必传。 不传代表社区帐号。 |
返回:
{"code":"200", "message":"success",
"data":
{
"id":"1109",
"nickname":"路人甲",
"delivery_address":"北京朝阳区290号",
"mobile":"13302733689",
"email":"zxu@126.com"
"ico":"https://google.com/avatar/1120/35/35",
"job_number":"13302733689",
"random_bg":"1"
}
}
6.11 员工个人资料加载
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/user/account/load/{id}
Method: GET
路径参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | Long | y | 员工帐号表主键 |
返回:
{"code":"200", "message":"success",
"data":
{
"id":"1109",
"nickname":"路人甲",
"delivery_address":"北京朝阳区290号",
"mobile":"13302733689",
"email":"zxu@126.com"
"ico":"https://google.com/avatar/1120/35/35",
"job_number":"13302733689"
"random_bg":"1",
"share": 2
}
}
新增 返回字段:
share: 帐号方案分享标识 1:不开启 2:开启
6.11B 帐号开启/关闭分享
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/iot/main/oauth2/admin/account/share/set
Method: PUT
BODY
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | Long | y | 员工帐号表主键 |
share | Int | Y | 1: 关闭分享 2: 开启分享 |
返回:
{"code":"200", "message":"success"}
6.12 员工个人资料更新(不含密码更新)
注:修改信息时请将请求Body所述字段都提交给服务器,服务器将根据字段批量更新。如:用户图像在修改时,如果用户未更新图像请将《6.15 员工个人资料加载》接口返回的原字段内容提交给服务器。
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/user/account/edit
Method: POST
请求BODY
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | Bigint | y | 员工帐号表主键 |
delivery_address | String | N | 非空则更新此字段, 最大120个长度 |
String | N | 非空则更新此字段, 24个长度 , 见《5.2.4 邮箱规范 》 | |
nickname | String | N | 非空则更新此字段 |
ico | String | N | 非空则更新此字段 |
返回更新后的用户信息:
{
"code":"200", "message":"success",
"data":
{
"id":1109,
"nickname":"路人甲",
"delivery_address":"北京朝阳区290号",
"mobile":"13302733689",
"email":"zxu@126.com",
"ico":"https://google.com/avatar/1120/35/35",
"job_number":"13302733689",
"random_bg":"1",
}
}
6.13 员工密码更新
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/user/account/pwdreset
Method: POST
·
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | string | y | 新的手机号 |
pwd | String | y | 原密码, 密码, 须遵循 《5.2 密码明文加密》完成明文的加密,且密码须遵循《5.2.3 密码规范》 |
new_pwd | String | y | 新密码, 须遵循 《5.2 密码明文加密》完成明文的加密,且密码须遵循《5.2.3 密码规范》 |
注:重复新密码与重复新密码由前端来判断。
返回:
{
"code":"200", "message":"success",
"data":
{
"id":1109,
"nickname":"路人甲",
"delivery_address":"北京朝阳区290号",
"mobile":"13302733689",
"email":"zxu@126.com",
"ico":"https://google.com/avatar/1120/35/35",
"job_number":"13302733689",
"random_bg":"1"
}
}
6.14 图像上传
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
具体协议见: http://arch.smartmideazy.com/docs/components/file-component.html#12
其中businessId 为员工表主键ID
businessType固定为ssologin
需要遵循 《2.3 Http 请求头部约定》
返回示例:
{
"code": 200,
"data": {
"filePath": "https://iot-xlink-xfile.oss-cn-hangzhou.aliyuncs.com/community/2020-12-23/134354560.png",
"id":"主键",
"fileName":"文件名",
"businessId":"文件所关联的业务id",
"businessType":"文件所关联的业务类型",
"fileExt":"文件扩展名",
"contentType":"文件类型",
"remotePath":"文件远程地址",
"fileUri":"文件路径",
},
"message": "success"
}
6.15 员工个人头像更新
此接口可以使用 《6.16 员工个人资料更新(不含密码更新)》接口完成。不需要单独调用此接口。
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/user/account/avatarreset
Method: POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | string | y | 员工表主键ID |
filePath | String | y | 调用接口《6.17 图像上传》返回的存储桶位置URL |
返回:
{
"code":"200", "message":"success",
"data":
{
"id":1109,
"nickname":"路人甲",
"delivery_address":"北京朝阳区290号",
"mobile":"13302733689",
"email":"zxu@126.com",
"ico":"https://google.com/avatar/1120/35/35",
"random_bg":"1"
}
}
6.16 员工企业信息新增/修改
描述:体验帐号的员工更新企业信息。 须登录后使用此功能。
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/iot/main/company/update
Method: POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
id | Bigint | N | 员工企业信息表的主键ID;非空时表示修改;空值代表新增 |
contact | string | y | 联系人; 2-12字符个长度; |
mobile | String | y | 手机号; |
company_name | String | y | 公司名称,2-120个字符长度。 |
company_address | String | y | 公司地址,2-120个字符长度。 |
返回:
{
"code":"200", "message":"success",
"data":
{
contact:XX,
mobile:XX,
company_name:XX,
company_address:XX,
update_time:XX
}
}
6.17 获取方案信息
描述:未注册帐号的游客发起的获取方案请求。需要手机验证码验证。
HTTP协议:HTTP, HTTPS
http头: 无
URL: /v1/iot/main/plan/submit
Method: POST
请求Body
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
verify_code | String | N | 手机短信验证码; 见接口《6.13 发送手机验证码》 |
contact | string | y | 联系人; 2-12个字符长度; |
mobile | String | y | 手机号,接收短信的手机号。 |
company | String | y | 公司名称; 2-120个字符长度; |
返回:
{
"code":"200", "message":"success",
"data":
{
"id":1109,
"mobile":"13209889678",
"company":"XXX",
"contact":"XX",
"update_time":"2022-03-09 10:09:08"
}
}
6.18 员工企业信息加载
描述:体验帐号的员工加载企业信息。 须登录后使用此功能。
HTTP协议:HTTP, HTTPS
http头: 请严格遵循 《2.3 Http 请求头部约定》
URL: /v1/iot/main/company/load
Method: GET
请求Body : 无
{
"code":"200", "message":"success",
"data":
{
contact:XX,
mobile:XX,
company_name:XX,
company_address:XX,
update_time:XX
}
}
6.19 模拟发送短信验证码
描述:方便测试预留的模拟发送短信接口。临时接口,生产环境将移除。
HTTP协议:HTTP, HTTPS
http头: 无
URL: /v1/user/verifycode/fake?mobile=13360332878&verify_code=1234
Method: GET
其中: mobile为手机号、 verify_code为短信
eg : https://gw-sit.remacsmart.com/v1/user/verifycode/fake?mobile=13360332878&verify_code=1234
6.20 获取重置密码短信验证码
请求信息
HTTP协议:HTTP,HTTPS
/v1/iot/main/send/verify/code
方法:POST
请求参数:
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
jobNumber | string | 是 | 登录账号 |
mobile | string | 是 | 手机号 |
random_code | string | 是 | 图片验证码 |
BODY:
{
"msgId": "3fc848aa-1282-d011-d02d-a751bf6a9355",
"jobNumber": "abc",
"mobile": "13112345678",
"random_code": "2753"
}
返回
{
"code": "200",
"message": "success"
}
6.21 重置密码
请求信息
HTTP协议:HTTP,HTTPS
/v1/iot/main/reset/pwd/byCode
方法:POST
请求参数:
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
jobNumber | string | 是 | 登录账号 |
mobile | string | 是 | 手机号 |
code | string | 是 | 短信验证码 |
password | string | 是 | 密码 , 遵循《5.2.3密码规范 》及 《5.2 密码明文加密》 |
BODY: |
{
"msgId": "3fc848aa-1282-d011-d02d-a751bf6a9355",
"jobNumber": "abc",
"mobile": "13112345678",
"code": "2753",
"password": "ZAx9_uxL3Jph5wEuBT_X1kN2kdOOuu8KsUU7_agJzHY"
}
返回
{
"code": "200",
"message": "success"
}
7 缓存
缓存数据 | key | 说明 | Value |
---|---|---|---|
业务组织树缓存 | RedisKey.CACHE_PREFIX_ADMIN_ORG_TREES+":"+adminid; | ||
菜单树缓存 | RedisKey.CACHE_PREFIX_MENU_TREES+":"+adminid; | ||
小区列表缓存 | RedisKey.CACHE_PREFIX_ADMIN_COMMUNITYS+":"+adminid; | ||
8 相关参考资料
文档地址: http://arch.smartmideazy.com/docs/
主数据文档: http://arch.smartmideazy.com/apidoc/main-entry/API.html
生产统一登录平台网址: https://smartlife.ruizhuzn.com/