与第三方接口调用时白名单功能

来源:互联网 发布:服装纸样软件下载 编辑:程序博客网 时间:2024/06/05 01:09
  近一年来一直做与其他方做接口方面的工作。做接口肯定就会涉及到一些白名单、授权、验证方面的问题。这里看一下白名单问题。
       做过一个dll插件的接口,方式是我们把此dll发给第三方,第三方将此dll放到他们的程序中,通过加载此动态库,调用里面的方法完成业务功能。由于是通过此接口的客户端进行收费的,所有必须控制进行一个授权。首先我们把他们需要使用接口的电脑的mac地址拿过来,用我们的加密工具进行一个加密,将加密后加密的串存到我们的数据库授权表中。这要以后他们在调用动态库的时候,会把电脑的nac地址传到后台,用同样的加密方式进行加密,在与数据库中的字段进行对比,如果相同证明没有问题,不相同返回未进行授权提示。
       最近做一个http的第三方接口,使用post请求。但是由于这个接口是发布在外网上的,所以要做一个白名单的验证,不让所有的用户来进行访问。我们将可以访问的ip存到数据库中,当有请求到来时,取出此发送请求的ip地址,让后进行一个匹配。首先我们开发时使用的方法
ip = request.getRemoteAddr();
但是发布到线上后发现不对了,取出的ip不是发送请求的ip,后来发现原来我们线上环境通过一次nginx进行一次负载均衡,做了一次反向代理,导致取出ip不是原始ip了,变成nginx的ip了。后来改为
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
最近一次发布又出现了这个问题,发现取出的ip为多个IP地址用逗号分隔的字符串,经过分析得出这个的服务器部署已经不是一次nginx跳转了,我们部署了两台nginx,进行了两次跳转,他会将原始ip和第一次nginx的ip拼到一起。程序又改为
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip.length() > 15) {
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = (String) ips[index];
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}




0 0
原创粉丝点击