# JWT相关接口API
注意事项
- 所有API接口的域名前缀是:http://gateway--cnki--net--https.cnki.mdjsf.utuvpn.utuedu.com:9000/openx/
# 客户端模式获取Jwt
接口地址 :http://gateway--cnki--net--https.cnki.mdjsf.utuvpn.utuedu.com:9000/openx/admin/login/jwt
请求方式: POST
请求数据类型:application/x-www-form-urlencoded
接口描述: 客户端模式获取jwttoken
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 |
---|---|---|---|---|
client_id | 客户端ApiKey | query | true | String |
app_id | 应用AppId | query | true | String |
grant_type | 授权类型,客户端模式为:client_credentials | query | true | String |
响应状态
状态码 | 说明 |
---|---|
200 | OK |
400300 | 账号或密码错误! |
400301 | 账号已被禁用! |
400500 | 系统异常,请联系管理员! |
响应参数
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应编码 | integer | |
success | 请求是否成功 | boolean | |
content | 响应数据 | object | OAuth2AccessToken |
message | 提示消息 | string | |
count | 数据条数 | Integer | |
total | 数据总条数 | Integer |
schema属性说明
OAuth2AccessToken
参数名称 | 参数说明 | 类型 |
---|---|---|
access_token | jwttoken | String |
token_type | token类型 | String |
expires_in | 到期时间 | String |
响应示例
{
"success": true,
"message": "SUCCESS",
"content": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBQU1TLURFViIsInN1YiI6IjE3MDE4NDQyNzQ5NzgiLCJpYXQiOjE3MTEwMTIxMDQsIm5iZiI6MTcxMTAxMjEwNCwiZXhwIjoxNzExMDE5MzA0LCJqdGkiOiIyMjU4ODFlNi1jYTI1LTQ4ODYtOGQ1YS01NzhlYTNmOTE1MGUiLCJ0eXBlIjoic2lnbiIsInRpbWVzdGFtcCI6IjE3MTEwMTIxNjMiLCJhcHBpZCI6IjE3MDE4NDQyNzQ5NzgiLCJuYW1laWQiOiIiLCJlY3B0b2tlbiI6IiIsImNsaWVudGlkIjoiIiwiY2xpZW50aXAiOiIiLCJzZXJ2ZXJuYW1lIjoiQUFNUy1FQ1AiLCJjbGllbnRfaWQiOiJlMGdpOFpPQWtmQVlneTkwNnlRb0gzMWUifQ.w-Ekewc4TQ4eGzhDfuSPLMHcJHjD6LXdQR1wBAh6E0g",
"token_type": "bearer",
"expires_in": 7199
},
"code": 200
}
# 密码模式获取Jwt
接口地址: http://gateway--cnki--net--https.cnki.mdjsf.utuvpn.utuedu.com:9000/openx/admin/login/jwt
请求方式: POST
请求数据类型:application/x-www-form-urlencoded
接口描述: 客户端模式获取jwttoken
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 |
---|---|---|---|---|
client_id | 客户端ApiKey | query | true | String |
app_id | 应用AppId | query | true | String |
grant_type | 授权类型,密码模式为:password | query | true | String |
user_name | 用户名 | query | true | String |
password | 密码 | query | true | String |
响应状态
状态码 | 说明 |
---|---|
200 | OK |
400300 | 账号或密码错误! |
400301 | 账号已被禁用! |
400500 | 系统异常,请联系管理员! |
响应参数
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应编码 | integer | |
success | 请求是否成功 | boolean | |
content | 响应数据 | object | OAuth2AccessToken |
message | 提示消息 | string | |
count | 数据条数 | Integer | |
total | 数据总条数 | Integer |
schema属性说明
OAuth2AccessToken
参数名称 | 参数说明 | 类型 |
---|---|---|
access_token | jwttoken | String |
token_type | token类型 | String |
expires_in | 到期时间 | String |
响应示例
{
"success": true,
"message": "SUCCESS",
"content": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBQU1TLURFViIsInN1YiI6IjE3MDE4NDQyNzQ5NzgiLCJpYXQiOjE3MTEwMTIxMDQsIm5iZiI6MTcxMTAxMjEwNCwiZXhwIjoxNzExMDE5MzA0LCJqdGkiOiIyMjU4ODFlNi1jYTI1LTQ4ODYtOGQ1YS01NzhlYTNmOTE1MGUiLCJ0eXBlIjoic2lnbiIsInRpbWVzdGFtcCI6IjE3MTEwMTIxNjMiLCJhcHBpZCI6IjE3MDE4NDQyNzQ5NzgiLCJuYW1laWQiOiIiLCJlY3B0b2tlbiI6IiIsImNsaWVudGlkIjoiIiwiY2xpZW50aXAiOiIiLCJzZXJ2ZXJuYW1lIjoiQUFNUy1FQ1AiLCJjbGllbnRfaWQiOiJlMGdpOFpPQWtmQVlneTkwNnlRb0gzMWUifQ.w-Ekewc4TQ4eGzhDfuSPLMHcJHjD6LXdQR1wBAh6E0g",
"token_type": "bearer",
"expires_in": 7199
},
"code": 200
}
# Lid模式获取Jwt
接口地址 :http://gateway--cnki--net--https.cnki.mdjsf.utuvpn.utuedu.com:9000/openx/admin/login/jwt/lid
请求方式: POST
请求数据类型:application/x-www-form-urlencoded
接口描述: Lid模式获取jwttoken
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 |
---|---|---|---|---|
client_id | 客户端ApiKey | query | true | String |
lid | 知网的access_token | query | true | String |
app_id | 应用AppId | query | true | String |
user_name | 用户名 | query | true | String |
响应状态
状态码 | 说明 |
---|---|
200 | OK |
400300 | 账号或密码错误! |
400301 | 账号已被禁用! |
400500 | 系统异常,请联系管理员! |
响应参数
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应编码 | integer | |
success | 请求是否成功 | boolean | |
content | 响应数据 | object | OAuth2AccessToken |
message | 提示消息 | string | |
count | 数据条数 | Integer | |
total | 数据总条数 | Integer |
schema属性说明
OAuth2AccessToken
参数名称 | 参数说明 | 类型 |
---|---|---|
access_token | jwttoken | String |
token_type | token类型 | String |
expires_in | 到期时间 | String |
响应示例
{
"success": true,
"message": "SUCCESS",
"content": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBQU1TLURFViIsInN1YiI6IjE3MDE4NDQyNzQ5NzgiLCJpYXQiOjE3MTEwMTIxMDQsIm5iZiI6MTcxMTAxMjEwNCwiZXhwIjoxNzExMDE5MzA0LCJqdGkiOiIyMjU4ODFlNi1jYTI1LTQ4ODYtOGQ1YS01NzhlYTNmOTE1MGUiLCJ0eXBlIjoic2lnbiIsInRpbWVzdGFtcCI6IjE3MTEwMTIxNjMiLCJhcHBpZCI6IjE3MDE4NDQyNzQ5NzgiLCJuYW1laWQiOiIiLCJlY3B0b2tlbiI6IiIsImNsaWVudGlkIjoiIiwiY2xpZW50aXAiOiIiLCJzZXJ2ZXJuYW1lIjoiQUFNUy1FQ1AiLCJjbGllbnRfaWQiOiJlMGdpOFpPQWtmQVlneTkwNnlRb0gzMWUifQ.w-Ekewc4TQ4eGzhDfuSPLMHcJHjD6LXdQR1wBAh6E0g",
"token_type": "bearer",
"expires_in": 7199
},
"code": 200
}
# 授权码模式获取Jwt
接口地址: http://gateway--cnki--net--https.cnki.mdjsf.utuvpn.utuedu.com:9000/openx/admin/login/jwt
请求方式: POST
请求数据类型:application/x-www-form-urlencoded
接口描述: 授权码模式获取jwttoken
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 |
---|---|---|---|---|
app_id | 应用AppId | query | true | String |
grant_type | 授权类型,授权码模式为:authorization_code | query | true | String |
auth_code | 授权码,开放平台认证中心授权回调后在url路径上携带的参数openx_code ,每个授权码只能使用一次 | query | true | String |
auth_mac | 认证中心用于验证客户端身份的参数 | query | true | String |
auth_ip | 用户ip(发起登录请求的用户IP) | query | true | String |
注意:
auth_mac
参数是研学开放平台认证中心用于校验客户端身份的参数,生成方式:使用加密函数对授权码openx_code
和应用标识app_id
进行加密,拼接方式为:app_id=1740000071581&openx_code=c10580cfd150554989a3828ddcbb841037dc8a09
,注意字段顺序。加密秘钥是从开放平台管理后台创建应用后生成的ApiKey
。加密的示例代码如下:
/**
* 加密Map
*
* @param data 要加密的数据
* @return 加密后的字符串
* @throws Exception
*/
public static String encryptMap(Map<String, String> data, String secretKey) throws Exception {
// 元素排序
Map<String, String> sortedData = new TreeMap<>(data);
StringBuilder dataToEncrypt = new StringBuilder();
for (Map.Entry<String, String> entry : sortedData.entrySet()) {
dataToEncrypt.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
// 去掉最后一个多余的&
if (dataToEncrypt.length() > 0) {
dataToEncrypt.setLength(dataToEncrypt.length() - 1);
}
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.toString().getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* 解密Map
*
* @param encryptedData 加密后的字符串
* @return 解密后的Map
* @throws Exception
*/
public static Map<String, String> decrypt(String encryptedData, String secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
String decryptedString = new String(decryptedBytes, StandardCharsets.UTF_8);
Map<String, String> decryptedMap = new TreeMap<>();
String[] pairs = decryptedString.split("&");
for (String pair : pairs) {
int idx = pair.indexOf("=");
if (idx > 0) {
decryptedMap.put(pair.substring(0, idx), pair.substring(idx + 1));
}
}
return decryptedMap;
}
public static void main(String[] args) {
Map<String, String> data = new HashMap<>();
//授权码
data.put("openx_code", "396256a6c49d16a6de261a059972a8362671347f");
//应用Id
data.put("app_id", "174*****1581");
try {
String encrypt = encryptMap(data, "Nmq******H0Rp");
System.out.println("加密结果:" + encrypt);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
加密算法:AES
工作模式:ECB
填充方式:PKCS5Padding
以上是Java语言实现的加密算法,其它语言加密请保证相同的算法、工作模式、填充方式。
注意编码格式为:UTF_8
响应状态
状态码 | 说明 |
---|---|
200 | OK |
400500 | 系统异常,请联系管理员! |
400505 | 应用不存在! |
400513 | 授权码已过期! |
400514 | 授权码无效! |
400517 | 授权码不能为空! |
400519 | MAC地址不能为空! |
400520 | MAC加密值不合法! |
400521 | IP地址不能为空! |
400522 | 非法的IP地址! |
响应参数
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应编码 | integer | |
success | 请求是否成功 | boolean | |
content | 响应数据 | object | OAuth2AccessToken |
message | 提示消息 | string | |
count | 数据条数 | Integer | |
total | 数据总条数 | Integer |
schema属性说明
OAuth2AccessToken
参数名称 | 参数说明 | 类型 |
---|---|---|
access_token | jwttoken | String |
token_type | token类型 | String |
expires_in | 到期时间 | Integer |
响应示例
{
"success": true,
"message": "SUCCESS",
"content": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBQU1TLUVOViIsInN1YiI6IjE3MzY0MTUwOTg3MjQiLCJpYXQiOjE3MzkwMDc0OTQsIm5iZiI6MTczOTAwNzQ5NCwiZXhwIjoxNzM5MDE0Njk0LCJqdGkiOiJlY2Y1M2U3OS1hYzI0LTQ3ZGEtOWU4ZS1iMTUwMWZiNjFmMDkiLCJ0eXBlIjoic2lnbiIsInRpbWVzdGFtcCI6IjE3MzkwMDc1NTQiLCJhcHBpZCI6IjE3MzY0MTUwOTg3MjQiLCJuYW1laWQiOiIiLCJ1c2VyaWQiOiIiLCJlY3B0b2tlbiI6IiIsImNsaWVudGlkIjoiIiwiY2xpZW50aXAiOiIizZXJ2ZXJuYW1lIjoiQ05LSS0yNy0xNy0xMzgiLCJ1c2VyX25hbWUiOiJlYTA4ZjQ4NzU3ZTA0YzZkOTM4NmE0YTQ1YjViMzY4ZSIsImF1dGhvcml0aWVzIjoiQVBJXzBjYjk0ZGJhZGQ3NzdhOGM5ZTIyZjVkNDdlYWVhMGQwIiwiY2xpZW50X2lkIjoidEhtOElzZXFMQTd5QWFoZiIsIm9wZW5pZCI6ImVhMDhmNDg3NTdlMDRjNmQ5Mzg2YTRhNDViNWIzNjhlIn0.1uVERmo3LOgDDx0_zFAX83vd6kX0gs5dggMN6r9rrPQ",
"token_type": "bearer",
"expires_in": 7199
},
"count": null,
"total": null,
"code": 200
}