【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2

摘要:
因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。如果可以,请使用https协议三、缓存配置JWT验证token采用redis进行缓存,redis配置文件:src/main/resources/redis.properties修改redis对应的IP和端口。","data":null,"ok":false,"respCode":"-1"}1.鉴权TOKEN接口■描述根据用户名和密码获取TOKEN。■校验规则无■请求示例请求地址:http://域名/rest/tokens[java]viewplaincopy{"username":"admin","password":"123456"}■返回示例成功案例:[java]viewplaincopyeyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4YThhYjBiMjQ2ZGM4MTEyMDE0NmRjODE4MTk1MDA1MiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU0NDE4fQ.tnILZEivS-6YOX9uqsnCHygh7-XrG_-Sj8vLslNGkdQ失败案例:用户账号密码错误!

转载:https://www.cnblogs.com/jeecg158/p/8427208.html

一、接口方式

接口调用采用http协议,rest请求方式;

二、接口安全

接口安全采用Json web token (JWT)机制,基于token的鉴权机制.

1.机制说明

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

2.基本流程

流程上是这样的:

(1)用户使用用户名密码来请求服务器

(2)服务器进行验证用户的信息

(3)服务器通过验证发送给用户一个token

(4)客户端存储token,并在每次请求时附送上这个token值(存在head里的参数X-AUTH-TOKEN)

(5)服务端验证token值,并返回数据

【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2第1张

3.优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

4.安全相关

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 保护好secret私钥,该私钥非常重要。
  • 如果可以,请使用https协议

三、缓存配置

JWT 验证token采用redis进行缓存,

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

修改redis对应的IP和端口。

  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

四、接口说明

注意:访问除【鉴权TOKEN接口】以外的接口时,都需要访问用户拥有对接口的访问权限,如无权限,将直接返回如下信息:

  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

  1. {
  2. "username":"admin",
  3. "password":"123456"
  4. }

返回示例

成功案例:

  1. eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4YThhYjBiMjQ2ZGM4MTEyMDE0NmRjODE4MTk1MDA1MiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU0NDE4fQ.tnILZEivS-6YOX9uqsnCHygh7-XrG_-Sj8vLslNGkdQ
  2. 失败案例:
  3. 用户账号密码错误!

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和来源表。

  1. {
  2. "ip":"192.1.1.1",
  3. ……(省略信息其他字段)
  4. }

返回示例

  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://域名

  1. /rest/tsBlackListController/get/297e7ae15f7f7f7e015f7fb0f57e0040

返回示例

  1. 成功案例:
  2. {
  3. "message":"成功",
  4. "data":{
  5. "id":"402881f15e751d2a015e75212c570005",
  6. "createBy":"admin",
  7. "updateBy":"",
  8. "bpmStatus":"1",
  9. "ip":"111.193.210.4",
  10. "createName":"管理员",
  11. "createDate":"2017-09-1216:07:41",
  12. "updateName":"",
  13. "updateDate":null,
  14. "sysOrgCode":"A03",
  15. "sysCompanyCode":"A03"
  16. },
  17. "respCode":"0",
  18. "ok":true
  19. }
  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

参数如下:

  1. {
  2. "id":"402881e75f94878e015f94896bb80002",
  3. "ip":"1.1.1.1"
  4. }

返回示例

  1. 成功案例:
  2. {
  3. "respCode":"0",
  4. "respMsg":"成功"
  5. }
  6. 失败案例:
  7. {
  8. "respCode":"-1",
  9. "respMsg":"输入ID无效,重复输入"
  10. }

5.删除黑名单接口

描述

根据id删除

访问地址

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

访问方式

DELETE

参数

返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

校验规则

请求示例

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

返回示例

  1. 成功案例:
  2. {
  3. "respCode":"0",
  4. "respMsg":"成功"
  5. }
  6. 失败案例:
  7. {
  8. "respCode":"-1",
  9. "respMsg":"输入ID无效,重复输入"
  10. }

五、客户端测试代码

代码示例

  1. publicstaticStringgetToken(StringuserName,Stringpassword){
  2. Stringurl="http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;
  3. Stringtoken=JwtHttpUtil.httpRequest(url,"POST",null);
  4. returntoken;
  5. }
  6. //获取黑名单列表
  7. publicstaticJSONObjectgetBlackList(Stringtoken){
  8. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  9. JSONObjectresp=JwtHttpUtil.httpRequest(url,"GET",null,token);
  10. returnresp;
  11. }
  12. //创建黑名单
  13. publicstaticJSONObjectcreateBlackList(Stringtoken,Stringjson){
  14. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  15. JSONObjectresp=JwtHttpUtil.httpRequest(url,"POST",json,token);
  16. returnresp;
  17. }
  18. //更新黑名单
  19. publicstaticJSONObjectupdateBlackList(Stringtoken,Stringjson){
  20. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  21. JSONObjectresp=JwtHttpUtil.httpRequest(url,"PUT",json,token);
  22. returnresp;
  23. }
  24. //删除黑名单
  25. publicstaticJSONObjectdeleteBlackList(Stringtoken,Stringid){
  26. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  27. JSONObjectresp=JwtHttpUtil.httpRequest(url,"DELETE",null,token);
  28. returnresp;
  29. }
  30. //查询黑名单
  31. publicstaticJSONObjectgetBlackList(Stringtoken,Stringid){
  32. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  33. JSONObjectresp=JwtHttpUtil.httpRequest(url,"GET",null,token);
  34. returnresp;
  35. }
  • 参考源码:
  1. packageorg.jeecgframework.test.demo;
  2. importorg.jeecgframework.jwt.util.JwtHttpUtil;
  3. importcom.alibaba.fastjson.JSONObject;
  4. /**
  5. *jeecgjwt
  6. *接口客户端调用demo
  7. *@authorqinfeng
  8. *
  9. */
  10. publicclassJwtRestfulClientDemo{
  11. publicstaticStringgetToken(StringuserName,Stringpassword){
  12. Stringurl="http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;
  13. Stringtoken=JwtHttpUtil.httpRequest(url,"POST",null);
  14. returntoken;
  15. }
  16. //获取黑名单列表
  17. publicstaticJSONObjectgetBlackList(Stringtoken){
  18. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  19. JSONObjectresp=JwtHttpUtil.httpRequest(url,"GET",null,token);
  20. returnresp;
  21. }
  22. //创建黑名单
  23. publicstaticJSONObjectcreateBlackList(Stringtoken,Stringjson){
  24. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  25. JSONObjectresp=JwtHttpUtil.httpRequest(url,"POST",json,token);
  26. returnresp;
  27. }
  28. //更新黑名单
  29. publicstaticJSONObjectupdateBlackList(Stringtoken,Stringjson){
  30. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController";
  31. JSONObjectresp=JwtHttpUtil.httpRequest(url,"PUT",json,token);
  32. returnresp;
  33. }
  34. //删除黑名单
  35. publicstaticJSONObjectdeleteBlackList(Stringtoken,Stringid){
  36. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  37. JSONObjectresp=JwtHttpUtil.httpRequest(url,"DELETE",null,token);
  38. returnresp;
  39. }
  40. //查询黑名单
  41. publicstaticJSONObjectgetBlackList(Stringtoken,Stringid){
  42. Stringurl="http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  43. JSONObjectresp=JwtHttpUtil.httpRequest(url,"GET",null,token);
  44. returnresp;
  45. }
  46. publicstaticvoidmain(String[]args){
  47. Stringtoken=getToken("interfaceuser","123456");
  48. //Stringtoken="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU5NjM2fQ.Emfe8VZKA_L33jaW8ZUtVFVDEin83Np_d3gKlPIZryE";
  49. //System.out.println(token);
  50. //添加黑名单
  51. //JSONObjectjsonObject=newJSONObject();
  52. //jsonObject.put("ip","192.168.1.2");
  53. //System.out.println("======添加黑名单======="+createBlackList(token,jsonObject.toJSONString()));
  54. //更新黑名单
  55. //JSONObjectjsonObject=newJSONObject();
  56. //jsonObject.put("id","402881ee6001da57016001dc13110001");
  57. //jsonObject.put("ip","192.168.0.111");
  58. //System.out.println("======更新黑名单======="+updateBlackList(token,jsonObject.toJSONString()));
  59. //删除黑名单
  60. //System.out.println("======删除黑名单======="+deleteBlackList(token,"402881ee6001da57016001dc13110001"));
  61. //查询黑名单
  62. //System.out.println("======查询黑名单======="+getBlackList(token,"402881ee6001e873016001f369f40008"));
  63. //获取黑名单列表
  64. System.out.println("======获取黑名单列表======="+getBlackList(token));
  65. }
  66. }
  1. packageorg.jeecgframework.jwt.util;
  2. importjava.io.BufferedReader;
  3. importjava.io.InputStream;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStream;
  6. importjava.net.ConnectException;
  7. importjava.net.HttpURLConnection;
  8. importjava.net.URL;
  9. importorg.jeecgframework.core.util.LogUtil;
  10. importcom.alibaba.fastjson.JSONObject;
  11. /**
  12. *JWT客户端
  13. *@authorqinfeng
  14. *
  15. */
  16. publicclassJwtHttpUtil{
  17. /**
  18. *发起https请求并获取结果
  19. *
  20. *@paramrequestUrl
  21. *请求地址
  22. *@paramrequestMethod
  23. *请求方式(GET、POST)
  24. *@paramoutputStr
  25. *提交的数据
  26. *@returnJSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  27. */
  28. publicstaticJSONObjecthttpRequest(StringrequestUrl,StringrequestMethod,StringoutputStr,Stringsign){
  29. JSONObjectjsonObject=null;
  30. StringBufferbuffer=newStringBuffer();
  31. HttpURLConnectionhttpUrlConn=null;
  32. try{
  33. //创建SSLContext对象,并使用我们指定的信任管理器初始化
  34. URLurl=newURL(requestUrl);
  35. httpUrlConn=(HttpURLConnection)url.openConnection();
  36. httpUrlConn.setDoOutput(true);
  37. httpUrlConn.setDoInput(true);
  38. httpUrlConn.setUseCaches(false);
  39. httpUrlConn.setRequestProperty("X-AUTH-TOKEN",sign);
  40. httpUrlConn.setRequestProperty("Accept","*/*");
  41. httpUrlConn.setRequestProperty("Content-Type","application/json");
  42. //设置请求方式(GET/POST)
  43. httpUrlConn.setRequestMethod(requestMethod);
  44. if("GET".equalsIgnoreCase(requestMethod))
  45. httpUrlConn.connect();
  46. //当有数据需要提交时
  47. if(null!=outputStr){
  48. OutputStreamoutputStream=httpUrlConn.getOutputStream();
  49. //注意编码格式,防止中文乱码
  50. outputStream.write(outputStr.getBytes("UTF-8"));
  51. outputStream.close();
  52. }
  53. //将返回的输入流转换成字符串
  54. InputStreaminputStream=httpUrlConn.getInputStream();
  55. InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8");
  56. BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);
  57. Stringstr=null;
  58. while((str=bufferedReader.readLine())!=null){
  59. buffer.append(str);
  60. }
  61. bufferedReader.close();
  62. inputStreamReader.close();
  63. //释放资源
  64. inputStream.close();
  65. inputStream=null;
  66. httpUrlConn.disconnect();
  67. System.out.println(buffer.toString());
  68. jsonObject=JSONObject.parseObject(buffer.toString());
  69. //jsonObject=JSONObject.fromObject(buffer.toString());
  70. }catch(ConnectExceptionce){
  71. LogUtil.info("Weixinserverconnectiontimedout.");
  72. }catch(Exceptione){
  73. e.printStackTrace();
  74. org.jeecgframework.core.util.LogUtil.info("httpsrequesterror:{}"+e.getMessage());
  75. }finally{
  76. try{
  77. httpUrlConn.disconnect();
  78. }catch(Exceptione){
  79. e.printStackTrace();
  80. org.jeecgframework.core.util.LogUtil.info("httpcloseerror:{}"+e.getMessage());
  81. }
  82. }
  83. returnjsonObject;
  84. }
  85. /**
  86. *发起https请求并获取结果
  87. *
  88. *@paramrequestUrl
  89. *请求地址
  90. *@paramrequestMethod
  91. *请求方式(GET、POST)
  92. *@paramoutputStr
  93. *提交的数据
  94. *@returnJSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  95. */
  96. publicstaticStringhttpRequest(StringrequestUrl,StringrequestMethod,StringoutputStr){
  97. Stringres="";
  98. StringBufferbuffer=newStringBuffer();
  99. HttpURLConnectionhttpUrlConn=null;
  100. try{
  101. //创建SSLContext对象,并使用我们指定的信任管理器初始化
  102. URLurl=newURL(requestUrl);
  103. httpUrlConn=(HttpURLConnection)url.openConnection();
  104. httpUrlConn.setDoOutput(true);
  105. httpUrlConn.setDoInput(true);
  106. httpUrlConn.setUseCaches(false);
  107. httpUrlConn.setRequestProperty("Accept","text/plain");
  108. httpUrlConn.setRequestProperty("Content-Type","application/json");
  109. //设置请求方式(GET/POST)
  110. httpUrlConn.setRequestMethod(requestMethod);
  111. if("GET".equalsIgnoreCase(requestMethod))
  112. httpUrlConn.connect();
  113. //当有数据需要提交时
  114. if(null!=outputStr){
  115. OutputStreamoutputStream=httpUrlConn.getOutputStream();
  116. //注意编码格式,防止中文乱码
  117. outputStream.write(outputStr.getBytes("UTF-8"));
  118. outputStream.close();
  119. }
  120. //将返回的输入流转换成字符串
  121. InputStreaminputStream=httpUrlConn.getInputStream();
  122. InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8");
  123. BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);
  124. Stringstr=null;
  125. while((str=bufferedReader.readLine())!=null){
  126. buffer.append(str);
  127. }
  128. bufferedReader.close();
  129. inputStreamReader.close();
  130. //释放资源
  131. inputStream.close();
  132. inputStream=null;
  133. httpUrlConn.disconnect();
  134. res=buffer.toString();
  135. System.out.println(res);
  136. //jsonObject=JSONObject.parseObject(buffer.toString());
  137. //jsonObject=JSONObject.fromObject(buffer.toString());
  138. }catch(ConnectExceptionce){
  139. LogUtil.info("Weixinserverconnectiontimedout.");
  140. }catch(Exceptione){
  141. e.printStackTrace();
  142. org.jeecgframework.core.util.LogUtil.info("httpsrequesterror:{}"+e.getMessage());
  143. }finally{
  144. try{
  145. httpUrlConn.disconnect();
  146. }catch(Exceptione){
  147. e.printStackTrace();
  148. org.jeecgframework.core.util.LogUtil.info("httpcloseerror:{}"+e.getMessage());
  149. }
  150. }
  151. returnres;
  152. }
  153. }
  • 附录1:接口返回CODE

code

msg

说明

解决方案

0

SUCCESS

成功

-1

ERROR

无接口访问权限

1000

VALID_ERROR

验证失败

r0001

SAVE_SUCCESS

写入成功

r0002

UPDATE_SUCCESS

更新成功

r0003

REMOVE_SUCCESS

免责声明:文章转载自《【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序如何动态增删class类名MySQL使用分区时出现的若干问题 规格严格下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Boot中微信全局token的缓存实现

  为什么要缓存token? 这里的token指的是微信JSAPI中基础支持的ACCESS_TOKEN,并非网页授权ACCESS_TOKEN。网页授权Token每天的调用次数没有限制,不需要缓存。 接口 每日限额 获取access_token 2000 自定义菜单创建 1000 自定义菜单查询 10000 获取用户基本信息 5...

微信开放平台注册 步骤

1.在https://open.weixin.qq.com 注册账号登录, 2.在管理中心/ 创建移动应用 中添加信息。 3.28x28的用PS做一个。 4. 应用签名用 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&v...

面试官一上来就问我Chrome底层原理和HTTP协议(万字长文)

此文转载自:https://blog.csdn.net/qq_36232611/article/details/110367883 已发布到 程序员小灰 公号 前言有人说,如果你懂得浏览器的工作原理,你就能解决80%的前端难题。 是的,了解浏览器的工作原理,有助于你的工作;而了解TCP/IP 、HTTP等网络协议,更是对你未来的职业发展大有裨益。 下面,...

.NET微信公众号开发-5.0微信支付

一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请的接 口什么的都有没有。 经过自己的一些探索,在老板的催促下终于硬着头皮做完了这个,很坑很坑的微信支付,在此做一些总结,希望对你们有所帮助,本人能力有限,如果...

python 钉钉 消息推送 文件传输

1、消息推送 钉钉群添加机器人 方式一:钉钉 群设置添加 群设置 -> 智能群助手 -> 添加机器人 -- 自定义机器人 设置如下: 这里选择 自定义关键字 填写"消息推送" ,只有发送的消息包含了 这个关键字,才会推送这个消息 复制webhook,代码需要用到 defsend_massage(message): webhook =...

双token刷新、续期,access_token和refresh_token实效如何设置

原文链接:https://blog.csdn.net/a704397849/article/details/90216739 token认证,生成的token 过一段时间就会失效(不要故意把时间设的很长,这样不安全,token变得毫无意义!),用户需要重新登录获取token。用户经常使用客户端,使用过程中 由于token到期 客户端跳转到登录界面要求登录,...