鉴权登陆
鉴权登陆接口,主要是用于根据用户提供的信息登陆全时云会议系统,并获取系统的统一鉴权标志串:token,(请妥善保存token, 丢失token可能会造成他人在token有效期内使用接口修改数据)如果出现token丢失,请及时调用鉴权接口中的token失效方法,保证数据的安全性。
全时云云会议提供的所有开放接口,都需要将token作为参数在header传递给对应的接口,用于对调用方身份的校验。
新建token
1. 接口描述
接口名称:
/token/create
发送方式:
POST
参数格式:
accept: application/json;content-type: application/json
Http Headers
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
AppId | String | 是 | 开发者平台分配的AppId |
Nonce | String | 是 | 随机数(随机数,最大长度128个字符) |
CurTime | String | 是 | 当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的毫秒数 |
CheckSum | String | 是 | 服务器认证需要,16进制字符小写SHA1(AppSecret+Nonce+CurTime) |
HttpBody 无
3. 输出参数
参数 | 类型 | 说明 |
---|---|---|
timeStamp | Long | 返回时间(时间戳,单位毫秒) |
requestId | String | 请求ID(在接口异常时, 需提供请求ID) |
code | Int | 返回的状态码 |
msg | String | 当返回结果的状态码不为200时,包含的错误信息 |
data | Json | 返回数据 |
data 参数说明
参数 | 类型 | 说明 |
---|---|---|
token | String | 统一鉴权token |
userId | Long | 帐号ID |
userName | String | 帐号名称 |
expire | Int | token有效时长(时间戳,单位秒) |
createTime | Long | token创建时间(时间戳,单位毫秒) |
customerCode | String | 客户编码 |
4. 示例
输入示例
Header:
请求体Header参数参照说明
Body:
{
}
输出示例
{
"code": 200,
"data": {
"createTime": 1671155217300,
"customerCode": "154327",
"expire": 86400,
"token": "95ed19f021a252d54a97afe13cf5c1ae",
"userId": 88610840,
"userName": "pei"
},
"msg": "Successfully to create the token!",
"requestId": "confopenapiserver-192.168.12.12-1671155209.866244100.887",
"timeStamp": 1671155209866
}
5. Java代码示例
public class TokenUtil {
@Value(value="${openapi-url}")
private String openApiUrl;
@Value(value="${app.id}")
private String AppId;
@Value(value="${app.secret}")
private String AppSecret;
@Value(value="${user.userId}")
private Long userId;
@Autowired
private RestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(TokenUtil.class);
public String createToken() {
logger.info("createToken.......");
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(MediaType.valueOf("application/json; charset=UTF-8")));
requestHeaders.setContentType(MediaType.valueOf("application/json; charset=UTF-8"));
Map<String, String> headerParameter = getHeaderParam();
requestHeaders.add("AppId", headerParameter.get("AppId"));
requestHeaders.add("Nonce", headerParameter.get("Nonce"));
requestHeaders.add("CurTime", headerParameter.get("CurTime"));
requestHeaders.add("CheckSum", headerParameter.get("CheckSum"));
JSONObject param = new JSONObject();
HttpEntity<String> request = new HttpEntity<String>(param.toString(), requestHeaders);
ParameterizedTypeReference<ResultData<Token>> typeRef = new ParameterizedTypeReference<ResultData<Token>>() {};
ResponseEntity<ResultData<Token>> responseEntity = restTemplate.exchange(openApiUrl+"/token/create", HttpMethod.POST, request, typeRef, new Object[] { });
ResultData<Token> body = responseEntity.getBody();
Token token = body.getData();
logger.info("token = " + token);
return token.getToken();
}
private Map<String, String> getHeaderParam() {
Map<String, String> headerParam = new HashMap<String, String>();
String nonce = getStringRandom();
String curTime = String.valueOf(System.currentTimeMillis());
String checkSum = getCheckSum(AppSecret, nonce, curTime);
headerParam.put("AppId", AppId);
headerParam.put("Nonce", nonce);
headerParam.put("CurTime", curTime);
headerParam.put("CheckSum", checkSum);
return headerParam;
}
private String getStringRandom() {
long length = Math.round(Math.random() * 128);
if(length == 0) length = 32;
String val = "";
Random random = new Random();
//参数length,表示生成几位随机数
for (int i = 0; i < length; i++) {
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
//输出字母还是数字
if ("char".equalsIgnoreCase(charOrNum)) {
//输出是大写字母还是小写字母
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (random.nextInt(26) + temp);
} else if ("num".equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
private String getCheckSum(String appSecret, String nonce, String curTime) {
return encode("SHA1", appSecret + nonce + curTime);
}
private String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return StringUtil.getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}