本文已经改版重发,请直接访问新链接:
https://developers.weixin.qq.com/community/develop/article/doc/000a8cfb3a85f8e57bc026f2a66013
一、写到前面
上周Donut安全网关推出一键接入的新功能,当你之前有使用过安全网关,再体验这个新功能,就会发现其严格意义上是重塑了整个产品形态。
去年我写过一篇关于安全网关的指南文章,其中有讲过安全网关的作用和特点,在这里重新提一下:
Donut安全网关提供了一个安全的接入链路,从调用端(小程序、公众号H5、APP、WEB)发起的请求直接进入微信环境接入层,微信接入层通过中转域名将请求转发至后端服务网络的「网关实例」中,在「网关实例」中通过路由配置将请求转发到开发者自己的上游业务服务,完成整个请求。
上面这个图是去年的时候的网关的架构图,初始形态下我们必须要自己部署一个网关实例,在部署的网关实例中包含对上游业务和路由转发的配置。
在2023年年中时候,又推出了「极简直连模式」。在安全网关看来,针对业务端的网关实例可以由安全网关自己接管,不需要开发者介入安装。直连模式下开发者只需要配置源站域名或IP地址,微信会自己分配相对应的微信接入域名。
比如源站域名https://weixin.qq.com,分配接入域名https://a1a48fdaf-wxa174c2e9b3e2ec50.preview.wxcloudrun.com/。只需要访问接入域名就可以经过安全网关直达源站业务端。
但接入域名需要配置在前端应用(小程序、WEB、APP)中才可以正常接入。整个架构图中,从调用端到业务后台,每个链路都需要完成改造,安全网关才算正常接入完成。
即使到极简直连模式下,在调用端方面仍然需要开发者进行改造。那么如何才可以让开发者不用对调用端进行改造呢?
这就引出了史诗级新功能:一键接入。
二、功能介绍
在微信小程序中,如果要向外发送请求,必须要用wx.request,这是微信小程序在网络请求中的封装。
一旦封装就可以做很多事情,比如微信小程序提供的请求缓存管理器,就是在封装下的其中一种功能体现。另外wx.request还会拉取开发者的服务端配置,来判断经过其的请求域名符不符合要求…
那么安全网关的使用中,在wx.request中直接转发需要安全接入的源站域名请求,让它们直接走网关链路就可以了,其余的还是正常走源站链路。
当这个能力实现支持之后,开发者接入安全网关的所有改造工作都已经消失,开发者只需要一系列配置就可以完成小程序端的安全链路改造。
接下来详细介绍一下使用细节。需要注意,之前使用原来形态的安全网关的开发者,需要新建一个空间才会有这个能力。
三、使用过程
- 需要微信扫码登录 Donut 安全网关控制台,同意安全网关服务协议并同意即完成开通。
- 如果账号没有创建过任何空间,会自动引导开通空间;根据自己的情况选择个人或企业主体,并给空间起一个名字。一般建议一个空间对应一个业务集群。
- 在空间里创建安全网关,如果没有任何网关,则会直接进入一键接入页面
在一键接入这里选择小程序,将会拉取此空间下授权的小程序,如果空间里没有任何小程序授权,则可以根据指引新增授权,需要小程序管理员(注意不是开发者和运营者之类的)扫码确认。
- 选择小程序并点击「开始接入」按钮后,将会直接默认转发该小程序所有服务端配置域名,并且只在该小程序体验版生效,不会影响线上。
-
后续可以在控制台随时更改链路接入覆盖范围,包括小程序的范围和域名范围。
这里主要解释一下接入域名,接入域名其实对应的是一个个的网关域名(在前期安全网关产品功能中有直观体现),在后面的接入多端中会应用到。小程序一键接入可以直接忽略掉。你可以将其理解成一个链路方案,该方案下可以有多个小程序或者一个小程序不同版本的不同域名配置。(比如我希望开发者版A域名走安全链路,体验版B域名走安全链路)
-
点击接入域名中的修改按钮,可以针对该接入情况做修改,详情如下图
接下来介绍一下每一个配置项作用:
- 选择小程序:该接入域名所应用到的小程序。
- 接入版本:小程序的哪个版本要安全链路接管。全部版本就是线上版、体验版、开发版均接管。
- 小程序URL:从小程序管理后台开发配置中读取服务端配置,可以选择所有或者针对部分链路做匹配。
- 比如/api/,则匹配/api/前缀下所有的路径,如果下面又有同域名的/test/,则同时匹配/api/前缀和/test/前缀的所有域名请求。
- 如果填空,则匹配所有域名请求。
- 添加小程序:你可以最多添加两个小程序(小程序可以相同)
- 你可以新增接入域名,选择不同的小程序。(需要注意的是一个小程序只能被一个网关的一个接入域名绑定)
- 在监控视图中可以查看网关下的小程序端链路调用情况,可以通过观察请求成功率来验证安全链路的兼容稳定与否,结合自己的测试来判断是否应该继续接入。
- 如果你发现一键接入后,有异常请求且持续发生,则可以直接操作一键断联。
四、常见情况
1. 一键接入后,是否还需要小程序改造发版?
不需要,微信小程序底层将直接根据你的接入配置在网络层完成安全链路转换。
2. 如何判断是否经过了网关链路?
网关链路的errmsg值为gateway.call:ok, 另外在返回体根级会有callid,建议在小程序端记录并上报该callid,链路出现问题可以凭此callid反馈给安全网关团队精确定位。
服务端会收到安全链路的特定header:
- x-request-id:请求ID,
- x-wx-call-id:链路请求ID,和前端响应的一致,可以通过其来联系前后端日志。反馈问题也首选这个。
- x-wx-route-tag:接入域名标记,可以根据此判断不同的接入域名转发的流量,用来区别对待
- x-wx-source:请求客户端,比如微信客户端是wx_client,开发者工具是wx_devtools
- x-wx-appid:请求小程序,标记请求的小程序appid
- x-envoy-expected-rq-timeout-ms:网关参数,响应超时时间,一般是15秒
根据自身安全要求,可以通过x-wx-appid、x-wx-route-tag来设立一个白名单,只接受来自白名单接入域名或白名单小程序的请求。
3. 在使用过程中出现问题或者不想再使用安全链路,需要怎么操作?
参照上面使用过程最后一条,直接断联就可以,不需要再次接入则可以直接删除接入域名。(需要注意删除之后,接入域名就没法复原了)
4. 为什么接入配置后,小程序对应的版本访问还是原生链路,没有走安全链路?
链路生效一般在1分钟之内,如果用户正在访问该小程序,则需要等待下一次启动打开才可以。如果开发者测试验证,则建议退出微信后台,重新进入再试,如果仍然不可以,则删除掉小程序然后重新加载尝试(删除掉小程序主要是清除缓存)
5. 为什么接入配置后,微信开发者工具没有走安全链路?
开发者工具对应的是「开发版」,需要保证接入配置到「开发版」上,配置之后仍然不可以则等待一分钟再试。一般清除缓存+重启开发者工具都可以搞定。基础库版本需要在3.1.5及以上,开发者工具版本需要在1.06.2310312及以上。
function test(){
}
第三方平台服务商可以接入吗