【JEECG技術文檔】JEECG平臺對外接口JWT應用文檔V3.7.2

1、 接口方式

    接口調用採用http協議,rest請求方式;java

2、 接口安全

    接口安全採用Json web token (JWT)機制,基於token的鑑權機制.web

1. 機制說明redis

    基於token的鑑權機制相似於http協議也是無狀態的,它不須要在服務端去保留用戶的認證信息或者會話信息。這就意味着基於token認證機制的應用不須要去考慮用戶在哪一臺服務器登陸了,這就爲應用的擴展提供了便利。json

2. 基本流程緩存

    流程上是這樣的:安全

        (1) 用戶使用用戶名密碼來請求服務器服務器

        (2) 服務器進行驗證用戶的信息app

        (3) 服務器經過驗證發送給用戶一個token測試

        (4) 客戶端存儲token,並在每次請求時附送上這個token值(存在head裏的參數X-AUTH-TOKEN)編碼

        (5) 服務端驗證token值,並返回數據

 

 

3. 優勢

  •   由於json的通用性,因此JWT是能夠進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等不少語言均可以使用。
  •   由於有了payload部分,因此JWT能夠在自身存儲一些其餘業務邏輯所必要的非敏感信息。
  •   便於傳輸,jwt的構成很是簡單,字節佔用很小,因此它是很是便於傳輸的。
  •   它不須要在服務端保存會話信息, 因此它易於應用的擴展

4. 安全相關

  •   不該該在jwt的payload部分存放敏感信息,由於該部分是客戶端可解密的部分。
  •   保護好secret私鑰,該私鑰很是重要。
  •   若是能夠,請使用https協議

3、 緩存配置

    JWT 驗證token採用redis進行緩存,

    redis配置文件:src/main/resources/redis.properties

    修改redis對應的IP和端口。

[java]  view plain  copy
  1. #redis  
  2. redis.host=124.206.91.99  
  3. redis.port=6379  
  4. redis.pass=  
  5. redis.adapter.maxIdle=100  
  6. redis.adapter.minIdle=10  
  7. redis.adapter.testOnBorrow=true  
  8. redis.adapter.testOnReturn=true  
  9. redis.adapter.testWhileIdle=true  
  10. redis.adapter.numTestsPerEvictionRun=10  
  11. redis.adapter.timeBetweenEvictionRunsMillis=60000  

4、 接口說明

    注意:訪問除【鑑權TOKEN接口】之外的接口時,都須要訪問用戶擁有對接口的訪問權限,如無權限,將直接返回以下信息:

[java]  view plain  copy
  1. {"message":"您沒有該接口的權限!","data":null,"ok":false,"respCode":"-1"}  

1. 鑑權TOKEN接口

    ■描述

        根據用戶名和密碼獲取TOKEN。

    ■訪問地址

        http://域名/rest/tokens

    ■訪問方式

        GET

    ■參數

參數名

數據類型

是否必須

示例值

默認值

描述

username

String

Y

「admin」

 

用戶名

password

String

Y

「123456」

 

密碼

 

    ■返回值

        成功時,直接返回token字符串。

        失敗時,直接返回用戶帳號密碼錯誤!

    ■校驗規則

        無

    ■請求示例

        請求地址:http://域名/rest/tokens

[java]  view plain  copy
  1. {  
  2.     "username":"admin",  
  3.     "password":"123456"  
  4. }  

    ■返回示例

        成功案例:

[java]  view plain  copy
  1. eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4YThhYjBiMjQ2ZGM4MTEyMDE0NmRjODE4MTk1MDA1MiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU0NDE4fQ.tnILZEivS-6YOX9uqsnCHygh7-XrG_-Sj8vLslNGkdQ  
  2.   
  3. 失敗案例:  
  4.   
  5. 用戶帳號密碼錯誤!  

2. 建立黑名單信息接口

    ■描述

        建立黑名單信息接口,黑名單爲單表。

    ■訪問地址

        http://域名/rest/tsBlackListController

    ■訪問方式

        POST

    ■參數(詳見excel)

參數名

數據類型

是否必須

示例值

默認值

描述

ip

String

Y

「192.168.1.1」

 

 

......

 

 

……省略信息其餘字段……


    ■返回值

參數名

描述

respCode

返回碼(見附錄1接口返回信息列表)

respMsg

返回信息(見附錄1接口返回信息列表)

data

返回結果(NULL)

ok

狀態

    ■校驗規則

        1. 接口中涉及日期時間的字段,要求格式化爲字符串傳遞,日期格式爲「YYYY-MM-dd」,時間格式爲「YYYY-MM-dd HH:mm:ss」。

    ■請求示例

        請求地址:http://域名/rest/tsBlackListController

    參數以下:

     注意:建立企業無需傳id,子表無需傳id和企業id,這些都會在後臺生成,必須要傳入的是來源id和來源表。

[java]  view plain  copy
 
  1. {  
  2.   "ip": "192.1.1.1",  
  3. ……(省略信息其餘字段)  
  4. }  

    ■返回示例

[java]  view plain  copy
 
  1. 成功案例:  
  2. {  
  3.     "respCode":"0",  
  4.     " respMsg":"成功"  
  5. }  
  6. 失敗案例:  
  7. {  
  8.     "respCode":"-1",  
  9.     "respMsg":"黑名單建立失敗"  
  10. }  

3. 查詢黑名單信息接口

    ■描述

        根據id查詢或查詢黑名單信息接口。

    ■訪問地址

根據id查詢

http://域名/rest/tsBlackListController/get/{id}

    ■訪問方式

        GET

    ■參數

        無

    ■返回值

參數名

描述

respCode

返回碼(見附錄1接口返回信息列表)

respMsg

返回信息(見附錄1接口返回信息列表)

data

返回結果(結構參照建立企業接口的參數,具體字段參照excel)

ok

狀態

    ■校驗規則

    ■請求示例

        請求地址:http://域名

[java]  view plain  copy
  1. /rest/tsBlackListController/get/297e7ae15f7f7f7e015f7fb0f57e0040  

    ■返回示例

[java]  view plain  copy
  1. 成功案例:  
  2.   
  3. {  
  4.   
  5.     "message": "成功",  
  6.   
  7.     "data": {  
  8.   
  9.         "id": "402881f15e751d2a015e75212c570005",  
  10.   
  11.         "createBy": "admin",  
  12.   
  13.         "updateBy": "",  
  14.   
  15.         "bpmStatus": "1",  
  16.   
  17.         "ip": "111.193.210.4",  
  18.   
  19.         "createName": "管理員",  
  20.   
  21.         "createDate": "2017-09-12 16:07:41",  
  22.   
  23.         "updateName": "",  
  24.   
  25.         "updateDate": null,  
  26.   
  27.         "sysOrgCode": "A03",  
  28.   
  29.         "sysCompanyCode": "A03"  
  30.   
  31.     },  
  32.   
  33.     "respCode": "0",  
  34.   
  35.     "ok": true  
  36.   
  37. }  
[java]  view plain  copy
  1. 失敗案例:  
  2. {"data":null,"respCode":"-1","respMsg":"根據所傳id查詢無結果"}  

4. 修改黑名單信息接口

    ■描述

        根據id修改

    ■訪問地址

        http://域名/rest/tsBlackListController/update/{id}

    ■訪問方式

        PUT

    ■參數

參數名

數據類型

是否必須

示例值

默認值

描述

id

String

Y

「402881f15f811877015f8124ca1c0002」

 

 

ip

String

Y

「192.168.1.1」

 

 

 

 

 

……省略信息其餘字段……

    ■返回值

參數名

描述

respCode

返回碼(見附錄1接口返回信息列表)

respMsg

返回信息(見附錄1接口返回信息列表)

data

返回結果(NULL)

ok

狀態

    ■校驗規則

        經過校驗主表的字段:來源id和來源表驗證數據惟一性。

    ■請求示例

       請求地址:http://域名/rest/tsBlackListController/update/402881f15f811877015f8124ca1c0002

       參數以下:

[java]  view plain  copy
  1. {  
  2.   "id": "402881e75f94878e015f94896bb80002",  
  3.   "ip": "1.1.1.1"  
  4.   
  5. }  

    ■返回示例

[java]  view plain  copy
 
  1. 成功案例:  
  2. {  
  3.     "respCode":"0",  
  4.     "respMsg":"成功"  
  5. }  
  6.   
  7. 失敗案例:  
  8. {  
  9.     "respCode":"-1",  
  10.     "respMsg":"輸入ID無效,重複輸入"  
  11. }  

5. 刪除黑名單接口

    ■描述

        根據id刪除

    ■訪問地址

        http://域名/rest/tsBlackListController/delete/{id}

    ■訪問方式

        DELETE

    ■參數

       無

    ■返回值

參數名

描述

respCode

返回碼(見附錄1接口返回信息列表)

respMsg

返回信息(見附錄1接口返回信息列表)

data

返回結果(NULL)

ok

狀態

    ■校驗規則

        無

    ■請求示例

        請求地址:http://域名/rest/tsBlackListController/delete/297e7ae15f7f7f7e015f7fb0f57e0040

    ■返回示例

[java]  view plain  copy
 
  1. 成功案例:  
  2. {  
  3.     "respCode":"0",  
  4.     "respMsg":"成功"  
  5. }  
  6. 失敗案例:  
  7. {  
  8.     "respCode":"-1",  
  9.     "respMsg":"輸入ID無效,重複輸入"  
  10. }  

5、 客戶端測試代碼

    代碼示例

[java]  view plain  copy
  1. public static String getToken(String userName,String password){  
  2.         String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;  
  3.         String token= JwtHttpUtil.httpRequest(url, "POST", null);  
  4.         return token;  
  5.     }  
  6.         //獲取黑名單列表  
  7.     public static JSONObject getBlackList(String token){  
  8.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  9.         JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);  
  10.         return resp;  
  11.     }  
  12.     //建立黑名單  
  13.     public static JSONObject createBlackList(String token,String json){  
  14.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  15.         JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);  
  16.         return resp;  
  17.     }  
  18.     //更新黑名單  
  19.     public static JSONObject updateBlackList(String token,String json){  
  20.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  21.         JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);  
  22.         return resp;  
  23.     }  
  24.     //刪除黑名單  
  25.     public static JSONObject deleteBlackList(String token,String id){  
  26.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;  
  27.         JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);  
  28.         return resp;  
  29.     }  
  30.     //查詢黑名單  
  31.     public static JSONObject getBlackList(String token,String id){  
  32.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;  
  33.         JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);  
  34.         return resp;  
  35.     }  
  • 參考源碼:
[java]  view plain  copy
 
  1. package org.jeecgframework.test.demo;  
  2.   
  3. import org.jeecgframework.jwt.util.JwtHttpUtil;  
  4.   
  5. import com.alibaba.fastjson.JSONObject;  
  6.   
  7. /** 
  8.  * jeecg jwt 
  9.  * 接口客戶端調用demo 
  10.  * @author qinfeng 
  11.  * 
  12.  */  
  13. public class JwtRestfulClientDemo {  
  14.       
  15.     public static String getToken(String userName,String password){  
  16.         String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;  
  17.         String token= JwtHttpUtil.httpRequest(url, "POST", null);  
  18.         return token;  
  19.     }  
  20.       
  21.       
  22.     //獲取黑名單列表  
  23.     public static JSONObject getBlackList(String token){  
  24.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  25.         JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);  
  26.         return resp;  
  27.     }  
  28.       
  29.     //建立黑名單  
  30.     public static JSONObject createBlackList(String token,String json){  
  31.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  32.         JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);  
  33.         return resp;  
  34.     }  
  35.       
  36.       
  37.     //更新黑名單  
  38.     public static JSONObject updateBlackList(String token,String json){  
  39.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController";  
  40.         JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);  
  41.         return resp;  
  42.     }  
  43.       
  44.       
  45.     //刪除黑名單  
  46.     public static JSONObject deleteBlackList(String token,String id){  
  47.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;  
  48.         JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);  
  49.         return resp;  
  50.     }  
  51.       
  52.     //查詢黑名單  
  53.     public static JSONObject getBlackList(String token,String id){  
  54.         String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;  
  55.         JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);  
  56.         return resp;  
  57.     }  
  58.       
  59.       
  60.     public static void main(String[] args) {  
  61.         String token = getToken("interfaceuser","123456");  
  62. //      String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU5NjM2fQ.Emfe8VZKA_L33jaW8ZUtVFVDEin83Np_d3gKlPIZryE";  
  63. //      System.out.println(token);  
  64.           
  65.         //添加黑名單  
  66. //      JSONObject jsonObject=new JSONObject();  
  67. //      jsonObject.put("ip","192.168.1.2");  
  68. //      System.out.println("======添加黑名單======="+createBlackList(token,jsonObject.toJSONString()));  
  69.         //更新黑名單  
  70. //      JSONObject jsonObject=new JSONObject();  
  71. //      jsonObject.put("id","402881ee6001da57016001dc13110001");  
  72. //      jsonObject.put("ip","192.168.0.111");  
  73. //      System.out.println("======更新黑名單======="+updateBlackList(token,jsonObject.toJSONString()));  
  74.         //刪除黑名單  
  75. //      System.out.println("======刪除黑名單======="+deleteBlackList(token,"402881ee6001da57016001dc13110001"));  
  76.         //查詢黑名單  
  77. //      System.out.println("======查詢黑名單======="+getBlackList(token,"402881ee6001e873016001f369f40008"));  
  78.         //獲取黑名單列表  
  79.         System.out.println("======獲取黑名單列表======="+getBlackList(token));  
  80.     }  
  81.   
  82. }  
[java]  view plain  copy
  1. package org.jeecgframework.jwt.util;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.io.OutputStream;  
  7. import java.net.ConnectException;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10. import org.jeecgframework.core.util.LogUtil;  
  11. import com.alibaba.fastjson.JSONObject;  
  12.   
  13. /** 
  14.  * JWT 客戶端 
  15.  * @author qinfeng 
  16.  * 
  17.  */  
  18. public class JwtHttpUtil {  
  19.   
  20.     /** 
  21.      * 發起https請求並獲取結果 
  22.      *  
  23.      * @param requestUrl 
  24.      *            請求地址 
  25.      * @param requestMethod 
  26.      *            請求方式(GET、POST) 
  27.      * @param outputStr 
  28.      *            提交的數據 
  29.      * @return JSONObject(經過JSONObject.get(key)的方式獲取json對象的屬性值) 
  30.      */  
  31.     public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr, String sign) {  
  32.         JSONObject jsonObject = null;  
  33.         StringBuffer buffer = new StringBuffer();  
  34.         HttpURLConnection httpUrlConn = null;  
  35.         try {  
  36.             // 建立SSLContext對象,並使用咱們指定的信任管理器初始化  
  37.             URL url = new URL(requestUrl);  
  38.             httpUrlConn = (HttpURLConnection) url.openConnection();  
  39.             httpUrlConn.setDoOutput(true);  
  40.             httpUrlConn.setDoInput(true);  
  41.             httpUrlConn.setUseCaches(false);  
  42.             httpUrlConn.setRequestProperty("X-AUTH-TOKEN", sign);  
  43.             httpUrlConn.setRequestProperty("Accept", "*/*");  
  44.             httpUrlConn.setRequestProperty("Content-Type", "application/json");  
  45.             // 設置請求方式(GET/POST)  
  46.             httpUrlConn.setRequestMethod(requestMethod);  
  47.             if ("GET".equalsIgnoreCase(requestMethod))  
  48.                 httpUrlConn.connect();  
  49.   
  50.             // 當有數據須要提交時  
  51.             if (null != outputStr) {  
  52.                 OutputStream outputStream = httpUrlConn.getOutputStream();  
  53.                 // 注意編碼格式,防止中文亂碼  
  54.                 outputStream.write(outputStr.getBytes("UTF-8"));  
  55.                 outputStream.close();  
  56.             }  
  57.   
  58.             // 將返回的輸入流轉換成字符串  
  59.             InputStream inputStream = httpUrlConn.getInputStream();  
  60.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  61.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  62.   
  63.             String str = null;  
  64.             while ((str = bufferedReader.readLine()) != null) {  
  65.                 buffer.append(str);  
  66.             }  
  67.             bufferedReader.close();  
  68.             inputStreamReader.close();  
  69.             // 釋放資源  
  70.             inputStream.close();  
  71.             inputStream = null;  
  72.             httpUrlConn.disconnect();  
  73.             System.out.println(buffer.toString());  
  74.             jsonObject = JSONObject.parseObject(buffer.toString());  
  75.             // jsonObject = JSONObject.fromObject(buffer.toString());  
  76.         } catch (ConnectException ce) {  
  77.             LogUtil.info("Weixin server connection timed out.");  
  78.         } catch (Exception e) {  
  79.             e.printStackTrace();  
  80.             org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());  
  81.         } finally {  
  82.             try {  
  83.                 httpUrlConn.disconnect();  
  84.             } catch (Exception e) {  
  85.                 e.printStackTrace();  
  86.                 org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());  
  87.             }  
  88.         }  
  89.         return jsonObject;  
  90.     }  
  91.       
  92.       
  93.     /**  
  94.      * 發起https請求並獲取結果  
  95.      *   
  96.      * @param requestUrl  
  97.      *            請求地址  
  98.      * @param requestMethod  
  99.      *            請求方式(GET、POST)  
  100.      * @param outputStr  
  101.      *            提交的數據  
  102.      * @return JSONObject(經過JSONObject.get(key)的方式獲取json對象的屬性值)  
  103.      */  
  104.     public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {  
  105.         String res = "";  
  106.         StringBuffer buffer = new StringBuffer();  
  107.         HttpURLConnection httpUrlConn = null;  
  108.         try {  
  109.             // 建立SSLContext對象,並使用咱們指定的信任管理器初始化  
  110.             URL url = new URL(requestUrl);  
  111.             httpUrlConn = (HttpURLConnection) url.openConnection();  
  112.             httpUrlConn.setDoOutput(true);  
  113.             httpUrlConn.setDoInput(true);  
  114.             httpUrlConn.setUseCaches(false);  
  115.             httpUrlConn.setRequestProperty("Accept", "text/plain");  
  116.              httpUrlConn.setRequestProperty("Content-Type", "application/json");  
  117.             // 設置請求方式(GET/POST)  
  118.             httpUrlConn.setRequestMethod(requestMethod);  
  119.             if ("GET".equalsIgnoreCase(requestMethod))  
  120.                 httpUrlConn.connect();  
  121.   
  122.             // 當有數據須要提交時  
  123.             if (null != outputStr) {  
  124.                 OutputStream outputStream = httpUrlConn.getOutputStream();  
  125.                 // 注意編碼格式,防止中文亂碼  
  126.                 outputStream.write(outputStr.getBytes("UTF-8"));  
  127.                 outputStream.close();  
  128.             }  
  129.   
  130.             // 將返回的輸入流轉換成字符串  
  131.             InputStream inputStream = httpUrlConn.getInputStream();  
  132.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  133.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  134.   
  135.             String str = null;  
  136.             while ((str = bufferedReader.readLine()) != null) {  
  137.                 buffer.append(str);  
  138.             }  
  139.             bufferedReader.close();  
  140.             inputStreamReader.close();  
  141.             // 釋放資源  
  142.             inputStream.close();  
  143.             inputStream = null;  
  144.             httpUrlConn.disconnect();  
  145.             res = buffer.toString();  
  146.             System.out.println(res);  
  147. //          jsonObject = JSONObject.parseObject(buffer.toString());  
  148.             // jsonObject = JSONObject.fromObject(buffer.toString());  
  149.         } catch (ConnectException ce) {  
  150.             LogUtil.info("Weixin server connection timed out.");  
  151.         } catch (Exception e) {  
  152.             e.printStackTrace();  
  153.             org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());  
  154.         } finally {  
  155.             try {  
  156.                 httpUrlConn.disconnect();  
  157.             } catch (Exception e) {  
  158.                 e.printStackTrace();  
  159.                 org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());  
  160.             }  
  161.         }  
  162.         return res;  
  163.     }  
  164.   
  165. }  
  • 附錄1:接口返回CODE

code

msg

說明

解決方案

0

SUCCESS

成功

 

-1

ERROR

無接口訪問權限

 

1000

VALID_ERROR

驗證失敗

 

r0001

SAVE_SUCCESS

寫入成功

 

r0002

UPDATE_SUCCESS

更新成功

 

r0003

REMOVE_SUCCESS

刪除成功

相關文章
相關標籤/搜索