• 【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);//获得时间戳
        }
    
    }
  • 相关阅读:
    jQuery cookie记住用户名密码自动登录
    MySQL解决8小时内没有进行数据库操作, mysql自动断开连接, 需要重启tomcat的问题
    JavaWeb项目设置Session失效时长,失效后自动跳转页面
    JS通过id获取表格内容,并循环添加到数据库
    JS实现表格Table动态添加删除行
    使用easyUI框架实现select下拉框动态加载option
    MySQL数据库出现Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...this is incompatible with sql_mode=only_full_group_by的问题
    JS获取系统当前时间
    同一机器不同数据库间关联查询
    Fiddler各模块使用说明
  • 原文地址:https://www.cnblogs.com/mindzone/p/16036864.html
Copyright © 2020-2023  润新知