淘東電商項目(71) -互聯網安全架構設計(網關驗證AccessToken)

引言

本文代碼已提交至Github(版本號:626d01d9557e8989e6faf4522fa276a3bcc823c3),有興趣的同學可以下載來看看:https://github.com/ylw-github/taodong-shop

在之前博客《淘東電商項目(67) -互聯網安全架構設計(方法論)》,主要講解了互聯網安全架構設計的方法,主要介紹瞭如下幾種:

  • 基於網關實現IP黑名單與名單攔截
  • API接口實現Token授權認證
  • 使用MD5實現API接口驗證簽名,防止抓包篡改數據
  • 實現API接口安全加密傳輸(公鑰和私鑰互換機制)
  • 基於Oauth2.0 實現API接口開放平臺
  • 接口參數使用網關實現防止XSS、SQL注入
  • 定期工具實現代碼健康掃描

上面的打勾代碼實現在前面博客已經講解完,本文繼續講解網關驗證上一篇博客OAuth授權驗證成功後返回的AccessToken。

本文目錄結構:
l____引言
l____ 1.代碼實現
l____ 2.測試

1.代碼實現

①application.yml配置網關(url 地址後面以public開始的爲提供給第三方接口,比如下面的/public/api-pay/**):

### 配置網關反向代理
zuul:
  routes:
    api-a:
      ### 以 /api-weixin/訪問轉發到會員服務
      path: /api-weixin/**
      serviceId: taodong-shop-service-weixin
    api-b:
      ### 以 /api-member/訪問轉發到訂單服務
      path: /api-member/**
      serviceId: taodong-shop-service-member
    api-c:
      ### 以 /api-member/訪問轉發到訂單服務
      path: /api-pay/**
      serviceId: taodong-shop-service-pay
    api-d:
      ### 以 /api-pay/訪問轉發到訂單服務
      path: /public/api-pay/**
      serviceId: taodong-shop-service-pay

②增加AccessToken驗證接口(GatewayBuild類):

/**
* api權限控制
*
*/
Boolean apiAuthority(RequestContext ctx, HttpServletRequest request);

③接口實現(VerificationBuild類):

@Override
public Boolean apiAuthority(RequestContext ctx, HttpServletRequest request) {
    String servletPath = request.getServletPath();
    log.info(">>>>>servletPath:" + servletPath + ",servletPath.substring(0, 5):" + servletPath.substring(0, 5));
    if (!servletPath.substring(0, 7).equals("/public")) {
        return true;
    }
    String accessToken = request.getParameter("accessToken");
    log.info(">>>>>accessToken驗證:" + accessToken);
    if (StringUtils.isEmpty(accessToken)) {
        resultError(ctx, "AccessToken cannot be empty");
        return false;
    }
    // 調用接口驗證accessToken是否失效
    BaseResponse<JSONObject> appInfo = verificaCodeServiceFeign.getAppInfo(accessToken);
    log.info(">>>>>>data:" + appInfo.toString());
    if (!isSuccess(appInfo)) {
        resultError(ctx, appInfo.getMsg());
        return false;
    }
    return true;
}

④構建者:

@Component
public class GatewayDirector {
    @Resource(name = "verificationBuild")
    private GatewayBuild gatewayBuild;

    public void direcot(RequestContext ctx, String ipAddres, HttpServletResponse response, HttpServletRequest request) {
        /**
         * 黑名單攔截
         */
        Boolean blackBlock = gatewayBuild.blackBlock(ctx, ipAddres, response);
        if (!blackBlock) {
            return;
        }
        /**
         * 參數驗證
         */
        Boolean verifyMap = gatewayBuild.toVerifyMap(ctx, ipAddres, request);
        if (!verifyMap) {
            return;
        }

        /**
         * XSS攻擊處理
         */
        Map<String, List<String>> filterParameters = gatewayBuild.filterParameters(request, ctx);
        if (filterParameters != null && filterParameters.size() > 0) {
            ctx.setRequestQueryParams(filterParameters);
        }

        // 3.驗證accessToken
        Boolean apiAuthority = gatewayBuild.apiAuthority(ctx, request);
        if (!apiAuthority) {
            return;
        }
    }

}

2.測試

1.模擬合作伙伴提交個人信息,申請appIdappSecret,瀏覽器訪問:http://localhost:9500/applyAppInfo?appName=騰訊小馬
在這裏插入圖片描述
2.獲取AccessToken令牌,瀏覽器訪問:http://localhost:9500/getAccessToken?appId=7f38d645-032a-43e7-9f08-b7740288836d&appSecret=BF81CD9C70B597F88CF7794A7961F7FD
在這裏插入圖片描述
3.通過令牌去提交訂單,首先使用錯誤的令牌訪問:
http://localhost/public/api-pay/cratePayToken?payAmount=9999&orderId=20200513141452&userId=27&productName=apple&accessToken=123,可以看到令牌無效。

在這裏插入圖片描述
再使用正確的令牌訪問http://localhost/public/api-pay/cratePayToken?payAmount=9999&orderId=20200513141452&userId=27&productName=apple&accessToken=authfdc563ec2ec049ea8fc66ab777215bb5,可以看到訪問成功:
在這裏插入圖片描述

本文完!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章