【JavaWeb】 接口鉴权
一年前写过一篇,叫Webservice校验机制,叫法不太对,就是接口鉴权
https://www.cnblogs.com/mindzone/p/15078436.html
这东西就是说,你提供给外部的调用的这个接口,并不是随便一个请求就能访问的,需要增加一个校验的逻辑
只有符合这个逻辑的调用方才可以访问使用你的接口,算是安全性的措施吧:
这篇新增加了一个更为简单一点的,代码量稍微少一点的案例:
首先是SHA256的加密类:
package com.yonyou.dmscloud.interfaceManage.utils; import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; /**
* @Description: 实现Sha256实例
* @author: zkf
* @date 2020年10月13日
*/
public class Sha256 { /**
* @Description:
* @author: zkf
* @date 2020年10月13日
* @param str 加密后的报文
* @param encoder 编码方式(例:UTF-8)
* @return String
*/
public static String getSHA256(String str,String encoder) {
MessageDigest messageDigest;
String encodestr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes(encoder));
encodestr = byte2Hex(messageDigest.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodestr;
} /**
* 将byte转为16进制
*
* @param bytes
* @return
*/
private static String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
// 1得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
} }
然后是接口处理的过程:
package com.yonyou.dmscloud.interfaceManage.utils; import java.io.IOException;
import java.util.Date;
import java.util.Map; import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired; public class HttpClientJsonUtilShuZi { @Autowired
Sha256 sha256 = new Sha256(); /**
* 数字门店鉴权字段 key
*/
private static final String apiKey = "4EA18E9EFB1F0EB645AD17B6BA01BA40"; /**
* @Description: 1.数字门店 Aibee-Auth-Sign=sha256(Method + URL + Date + ApiSecret)
* 编码方式: UTF-8;+表示字符串拼接;Date: 请求的时间戳;Method: GET/POST/PUT/DELETE
* URL: 即本文档提供的接口url,不带域名或ip、端口号(举例:/function/updateCustomerTag)。
* ApiSecret: BABBED1ABEC3277092EE0BEE96A6D740
* apiKey: 4EA18E9EFB1F0EB645AD17B6BA01BA40
* @author: zkf
* @date 2020年10月13日
* @param url
* @param json
* @param map map.get("method");
map.get("url");
* @return String
*/
public static String doPostJson(String url, String json,Map<String,String> map) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url); // 创建请求内容
StringEntity entity = new StringEntity(json, "utf-8");
entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));
httpPost.setEntity(entity);
httpPost.setHeader("Content-type", "application/json");
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //获得时间戳
String timeData = getTime();
httpPost.setHeader("Date", timeData);
//Aibee-Auth-Sign=sha256(Method + URL + Date + ApiSecret)
String method = map.get("method");
String notIpUrl = map.get("url");
String apiSecret = "BABBED1ABEC3277092EE0BEE96A6D740";
String aibeeAuthSign = method+notIpUrl+timeData+apiSecret; //Sha256加密
aibeeAuthSign = Sha256.getSHA256(aibeeAuthSign,"UTF-8");
httpPost.setHeader("Authorization", apiKey+":"+aibeeAuthSign); // 执行http请求
response = httpClient.execute(httpPost); //获取结果实体
HttpEntity entity = response.getEntity(); if (entity != null) {
//按指定编码转换结果实体为String类型
resultString = EntityUtils.toString(htpEnti, "utf-8");
}
EntityUtils.consume(entity);
//释放链接
response.close();
return resultString; } catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
} return resultString;
} /**
* @Description: 返回时间戳
* @author: zkf
* @date 2020年10月13日
* @return String
*/
private static String getTime() {
Date date = new Date();
long time = date.getTime();
return String.valueOf(time);//获得时间戳
} }
【JavaWeb】 接口鉴权的更多相关文章
- EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解
背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...
- laravel JWTAuth实现api接口鉴权(基础篇)
官网:https://jwt-auth.readthedocs.io 参考:https://learnku.com/articles/10885/full-use-of-jwt#99529f 1.to ...
- 项目API接口鉴权流程总结
权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要API使用签名方法(Sign)对接口进行鉴权.每一次请求都需要在请求中包含签名信息, ...
- 接口鉴权之sign签名校验与JWT验证
需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概念,网页里有用户登录的概念,对于调用方来源是小程序的情况下进行放权,其他情况下需要有身份验证. ...
- 接口鉴权,提供给第三方调用的接口,进行sign签名
//场景:公司要跟第三方公司合作,提供接口给对方对接,这样需要对接口进行授权,不然任何人都可以调我们公司的接口,会导致安全隐患: 思路: 在每个接口请求参数都带上ApiKey 和sign签名: 我们在 ...
- HiMall 3接口鉴权参考
签名算法 为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,HOP服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝.TOP目前支持的签名算法只有一种:MD5(s ...
- YAPI接口自动鉴权功能部署详解
安装准备 以下操作,默认要求自己部署过yapi,最好是部署过yapi二次开发环境. 无论是选择在线安装或者是本地安装,都需要安装client工具. 1.yapi-cli:npm install yap ...
- SpringBoot 拦截器妙用,让你一个人开发整个系统的鉴权模块!
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Han ...
- 接口的鉴权&响应数据解密
前言: 1.开放的接口为了避免被别人攻击,频繁刷接口,浪费服务器资源,这就涉及到签名(Signature)加密了 2.API 使用签名方法(Signature)对接口进行鉴权(Authenticati ...
- python接口自动化22-签名(signature)鉴权(authentication)之加密(HEX、MD5、HMAC-SHA256)
前言 开放的接口为了避免被别人乱调用,浪费服务器资源,这就涉及到签名(Signature)加密了 API 使用签名方法(Signature)对接口进行鉴权(Authentication).每一次请求都 ...
随机推荐
- autojs拉人进群
/* 微信 version:8.0.1 语言:AutoJs [https://hyb1996.github.io/AutoJs-Docs/#/] @author:奔跑的前端猿 */ auto.wait ...
- gRPC入门学习之旅(十)
gRPC入门学习之旅目录 gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) gRPC入门学习之旅(七) gRPC入门学习之旅(九) 3. ...
- P7322
P7322 好神仙! \(\color{#5bc9}\text{提醒,本文有大量没有推到过程的式子,所以读者可以自己遮住先推一下}\) Inscription: 有一个长度为 \(k\) 的窗口,在一 ...
- Easysearch 容量规划建议
基于容量估算 主要问题: 每天将索引多少原始数据(GB)?保留数据多少天? 原始数据膨胀率 您将强制执行多少个副本分片? 您将为每个数据节点分配多少内存? 您的内存:数据比例是多少? 原则 保留 +1 ...
- element table根据条件隐藏复选框
在<el-table>标签加 :cell-class-name="cellClass" 在 <el-table-column type="selecti ...
- Java中常见的几种的溢出
引言 在开发过程中,因为编程经验不足,经常会导致各种各样的溢出,今天本文就举例说明几种常见的溢出 堆溢出 堆溢出是最常见的一种溢出. 导致原因:堆中没有足够的空间储存新生成的实例对象 public s ...
- 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码
支付宝签名和验签使用JSONObject是最优解.json字符串顺序和==符号都一致演示代码 支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.c ...
- maven和gradle环境变量配置及idea相关的设置
1.maven 环境变量添加之后,重新打开cmd窗口,验证是否配置成功. idea File >> Settings idea配置之后的验证: 2.gradle 环境变量添加之后,重新 ...
- 认真学习css3--01-全是日志没有技术内容
由于某些原因,还是要写写前端代码. 虽然这不是我的主要责任,但也有表率的必要性. css3这个东西没有什么大难度,难点主要集中在: 1)样式比较多 2)精准定位 3)性能优化 其中第2个是日常经常面对 ...
- python重拾第九天-进程、线程、协程
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...