系统集群验证签名

更新时间:

本文介绍如何进行系统集群验证签名。

说明

网关提供服务端 Demo 代码供用户下载测试,下载 API 提供者 Demo 后,Demo 接口位置为:com.alipay.gateway.common.GatewayFilter。

操作步骤如下:

  1. 引入网关 SDK

  2. 配置 API 服务密钥

  3. 配置 Filter

引入网关 SDK

API 网关的客户端依赖 gateway-sdk。对服务端而言主要是配置 spring 拦截器,对请求进行验签以及对响应进行加签。您需要在本地工程 pom.xml 中添加如下 SDK。

说明
  • 如网关和服务端之间不需要双向认证,则无需引入 gateway-sdk,直接编写 HTTP API 服务即可。

  • 网关 SDK 新增了数据加密的功能,请参见 数据加密

<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>gateway-sdk</artifactId>
<version>2.5.0</version>
</dependency>

配置密钥

如果 API 服务发布的系统集群配置了 密钥 的认证方式,您还需要在工程中配置相应的 Access Key 和 Secret Key,推荐使用启动参数和环境变量的形式。

# 服务发布方的ak、sk,也就是系统集群的密钥信息
pub.app.accessKey=<yourAccessKeyId>
pub.app.secretKey=<yourAccessKeySecret>

配置 Filter

您需要为服务添加验签 filter。HTTP API 服务支持 REST 及 Spring MVC 框架。

Spring MVC 服务

    @Bean
    public FilterRegistrationBean filterRegistrationBean(@Value("${pub.app.accessKey}") String keyId,
                                                         @Value("${pub.app.secretKey}") String secretKey) {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(apiServletSignFilter(keyId, secretKey));
        registration.addUrlPatterns("/sign"); // filter生效的uri路径,表示对 /sign 开头的路径生效
        registration.setName("apiServletSignFilter");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
    }

    @Bean
    public ApiServletSignFilter apiServletSignFilter(@Value("${pub.app.accessKey}") String keyId,
                                                     @Value("${pub.app.secretKey}") String secretKey
    ) {
        ApiSecretKey apiSecretKey = new ApiSecretKey(keyId, secretKey);
        ApiServletSignFilter filter = new ApiServletSignFilter();
        List<ApiSecretKey> secretKeys = new ArrayList<>();
        secretKeys.add(apiSecretKey);
        filter.setApiSecretKeys(secretKeys);
        filter.setCheckSign(true);
        filter.setSignUriRegex("/j"); // 开启验签加签的uri路径,表示对 /j 开头的路径做加签验签,其他路径则不验签
        return filter;
    }

REST 服务

说明

当系统集群需要密钥认证时,需要开启响应验签,并在方法中加上 @NeedSign

1


    // 给 rest 服务添加filter,请求验签
    @Bean
    public ApiRestSignFilter apiRestSignFilter(@Value("${pub.app.accessKey}") String keyId,
                                               @Value("${pub.app.secretKey}") String secretKey) {
       ApiSecretKey apiSecretKey = new ApiSecretKey(keyId, secretKey);
        List<ApiSecretKey> secretKeys = new ArrayList<>();
        secretKeys.add(apiSecretKey);
        ApiRestSignFilter filter = new ApiRestSignFilter();
        filter.setApiSecretKeys(secretKeys);
        filter.setCheckSign(false);//请求验签开关
        //
        JAXRSProviderManager.registerCustomProviderInstance(filter);

        return filter;
    }