用户账号OA SDK
更新时间:2020-03-13 10:13:54
OA SDK基于Oauth2.0协议,提供快速对接自有账号体系的能力,满足开发者在web应用开发中的账号对接需求。
名词
oauthAppKey | 阿里云IoT平台颁发的appkey,参考创建应用组和应用 |
---|---|
authCode | 开发者服务器签发的一次性校验码 |
iotToken | 访问IoT平台的凭证 |
identityId | 访问IoT平台的身份Id |
接入
下载SDK
准备环境
在接入账号前,请先设置好环境信息。
参考自有账号体系配置。
前置依赖
- 在pom.xml中添加依赖:
<dependency>
<groupId>com.aliyun.api.gateway</groupId>
<artifactId>sdk-core-java</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.52</version>
</dependency>
- 引入API接口调用类
把工程中所有的api类OpenAccount_https_serviceApi.java文件复制到您的项目文件夹中;
- 初始化通信通道类
要提交请求至阿里云API网关,您首选要将所有的通道类初始化。您可以参考工程中 OAuthDemo.java中的示例代码,使用对应的ClientBuilderParams
类来初始化所有通道
接入总体流程
其中第3步的配置信息依赖开发者注册到IoT平台的配置,具体说明:自有账号体系配置。
流程说明
- 三方账号自己登陆自己的服务器,拿到自己服务器签发的authcode;
- 调用loginByOauth,通过授权方式去isv服务器做校验,并拿到用户的信息;
- loginByOauth成功后会颁发token, 拿token再调用createSessionByAuthCode获得IoT平台的登录态信息。
loginByOauth调用说明
参考工程中OAuthDemo.java中的示例代码testALoginByOauthSync。loginByOauthRequest
参数的是JSON格式转义为字符串的形式,如下:
"{
\"authCode\":\"2c7360fa72f**9527testtest\",
\"oauthAppKey\":\"501709*11922\",
\"oauthPlateform\":23,
\"riskControlInfo\":{
\"signType\":\"RSA2\",
\"createAccountIfNotExist\":\"true\"
}
}"
参数说明
authCode:服务器签发的一次性校验码
oauthAppKey:阿里云IoT平台颁发的appkey
oauthPlateform:固定填23
riskControlInfo:风险控制信息,固定signType=RSA2, createAccountIfNotExist=true
响应示例
其中"token":"d1AryxFPSH6r*-test"为签发的token数据,1分钟有效,用于createSessionByAuthCode
{
"code":1,
"data":{
"loginSuccessResult":{
"oauthOtherInfo":{
"platformType":23,
"gender":"1",
"iotOauthPlatform":23
},
"openAccount":{
"createAppKey":"2582**232",
"displayName":"陈**",
"domainId":809***2100,
"enableDevice":true,
"gmtCreate":1552960125000,
"gmtModified":1552960125000,
"hasPassword":false,
"id":4***37,
"mobileConflictAccount":false,
"mobileLocationCode":"86",
"oauthPlateform":23,
"openId":"5259**10-ac3f-448c-2***2-2233",
"pwdVersion":0,
"status":1,
"subAccount":false,
"type":0,
"version":1
},
"token":"d1AryxFPSH6r*****-test"
},
"mobileBindRequired":false
},
"message":"SUCCESS",
"subCode":0,
"successful":true,
"traceId":"0a98a36815538270858451413e78a1",
"vid":"null"
}
服务器端错误(调用 API)
以下为API服务端错误,如果频繁错误,可联系服务商。
错误代码 | Http状态码 | 语义 | 解决方案 |
---|---|---|---|
Internal Error | 500 | 内部错误 | 建议重试,或者联系服务商 |
Failed To Invoke Backend Service | 500 | 底层服务错误 | API 提供者底层服务错误,建议重试,如果重试多次仍然不可用,可联系 API 服务商解决 |
Service Unavailable | 503 | 服务不可用 | 建议重试,或者联系服务商 |
Async Service | 504 | 后端服务超时 | 建议重试,或者联系服务商 |
错误码
错误代码 | Http 状态码 | 语义 | 解决方案 |
---|---|---|---|
Throttled by USER Flow Control | 403 | 因用户流控被限制 | 调用频率过高导致被流控,可以联系 API 服务商协商放宽限制。 |
Throttled by APP Flow Control | 403 | 因APP流控被限制 | 调用频率过高导致被流控,可以联系 API 服务商协商放宽限制。 |
Throttled by API Flow Control | 403 | 因 API 流控被限制 | 调用频率过高导致被流控,可以联系 API 服务商协商放宽限制。 |
Throttled by DOMAIN Flow Control | 403 | 因二级域名流控被限制 | 直接访问二级域名调用 API,每天被访问次数上限1000次。 |
TThrottled by GROUP Flow Control | 403 | 因分组流控被限制 | 调用频率过高导致被流控,可以联系 API 服务商协商放宽限制。 |
Quota Exhausted | 403 | 调用次数已用完 | 购买的次数已用完。 |
Quota Expired | 403 | 购买次数已过期 | 购买的次数已经过期。 |
User Arrears | 403 | 用户已欠费 | 请尽快充值续费。 |
Empty Request Body | 400 | body 为空 | 请检查请求 Body 内容。 |
Invalid Request Body | 400 | body 无效 | 请检查请求 Body。 |
Invalid Param Location | 400 | 参数位置错误 | 请求参数位置错误。 |
Unsupported Multipart | 400 | 不支持上传 | 不支持上传文件。 |
Invalid Url | 400 | Url 无效 | 请求的 Method、Path 或者环境不对。请参照错误说明 Invalid Url。 |
Invalid Domain | 400 | 域名无效 | 请求域名无效,根据域名找不到 API。请联系 API 服务商。 |
Invalid HttpMethod | 400 | HttpMethod 无效 | 输入的 Method 不合法。 |
Invalid AppKey | 400 | AppKey 无效或不存在 | 请检查传入的 AppKey。注意左右空格的影响。 |
Invalid AppSecret | 400 | APP 的Secret 错误 | 检查传入的 AppSecret。注意左右空格的影响。 |
Timestamp Expired | 400 | 时间戳过时 | 请核对请求系统时间是否为标准时间。 |
Invalid Timestamp | 400 | 时间戳不合法 | 请参照 请求签名说明文档。 |
Empty Signature | 404 | 签名为空 | 请传入签名字符串,请参照 请求签名说明文档。 |
Invalid Signature, Server StringToSign:%s | 400 | 签名无效 | 签名无效,参照 Invalid Signature 错误说明 |
Invalid Content-MD5 | 400 | Content-MD5 值不合法 | 请求 Body 为空,但传入了 MD5 值,或 MD5 值计算错误。请参照 请求签名说明文档。 |
Unauthorized | 403 | 未被授权 | APP 未获得要调用的 API 的授权。请参照错误说明 Unauthorized。 |
Nonce Used | 400 | SignatureNonce | 已被使用 |
API Not Found | 400 | 找不到 API | 传入的APIdi地址或者HttpMethod不正确,或已下线。 |
createSessionByAuthCode调用说明
调用示例:
//1. 拿到oa的token
String token = "loginByOAuth返回的token";
//2.通过oa的token去获取iottoken
IoTApiRequest request = new IoTApiRequest();
//设置api的版本
request.setApiVer("1.0.5");
JSONObject jsonObject = new JSONObject();
jsonObject.put("authCode", token);
jsonObject.put("appKey",this.appKey);
jsonObject.put("loginSource","openAccount");
jsonObject.put("accountType","OA_TOKEN");
request.putParam("request",jsonObject);
String path = "/account/createSessionByAuthCode";
//请求参数域名、path、request
ApiResponse response = syncApiClient.postBody("api.link.aliyun.com", path, request, true);
返回值
{
"id":"a2845614-7156-42ff-94f7-9bc8db03bfa1",
"code":200,
"data":{
"identityId":"50f2op52a61e7d********aac900fd071323",
"iotToken":"267f8002434befa7*******dde18a8",
"refreshToken":"4DF38E239EA0********5262D9C15F",
"iotTokenExpire":72000,
"refreshTokenExpire":720000
}
}