鉴权登陆
鉴权登陆接口,主要是用于根据用户提供的信息登陆全时云直播系统,并获取系统的统一鉴权标志串:token,(请妥善保存token, 丢失token可能会造成他人在token有效期内使用接口修改数据)如果出现token丢失,请及时调用鉴权接口中的token失效方法,保证数据的安全性。
全时云直播提供的所有开放接口,都需要将token作为参数传递给对应的接口,用于对调用方身份的校验。(虽然全时云直播支持多种token的传递方式,但出于安全考虑,建议用户将token放置在请求头中)
新建token
1. 接口描述
接口名称:
/eventopenapi/token/v2/create
发送方式:
POST
参数格式:
accept: application/json;content-type: application/json
2. 请求参数
Http Headers
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
AppId | String | 是 | 开发者平台分配的AppId |
Nonce | String | 是 | 随机数(随机数,最大长度128个字符) |
CurTime | String | 是 | 当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的毫秒数 |
CheckSum | String | 是 | 服务器认证需要,16进制字符小写SHA1(AppSecret+Nonce+CurTime) |
Http Body
无
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创建时间(时间戳,单位毫秒) |
productId | Long | 产品ID |
customerCode | String | 客户编码 |
4. 示例
Headers:
参照Header参数说明
Body:
{
}
输出示例
{
"timeStamp": 1639470773358,
"code": 200,
"msg": "Successfully to create the token!",
"data": {
"productId": 80,
"createTime": 1639470773241,
"expire": 86400,
"customerCode": "153857",
"userName": "云活动测试账号151",
"userId": 88408809,
"token": "5d41c4ac806c6440eb6aa8e071115f2b"
},
"requestId": "10.255.0.106_20211214_163252_1639470772926"
}
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;
@Autowired
private RestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(TokenUtil.class);
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
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/v2/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 getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String getFormattedText(byte[] bytes){
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >>4) &0x0f]);
buf.append(HEX_DIGITS[bytes[j] &0x0f]);
}
return buf.toString();
}
}