# 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
}