如何在本地开发环境调试微信 JS-SDK

以下篇幅将会描述不同前提下对应的调试策略,当然也有可能不是最优解,望斧正 →_→


前言

何谓「安全域名限制」?

以微信 JS-SDK 的使用为例,每个公众号被限制最多可设置三个安全域名,且必须能被腾讯服务器所验证(这意味着域名必须绑定在一台可被外网访问的服务器上);然后只允许在这几个域名下才能使用 JS-SDK,这就是安全域名限制。

这种策略应用还相对比较广泛,大概可以等同于三方提供的 API 需要让你配置 IP 白名单。

下图大致描述了 JS-SDK 域名验证的过程,其中

  • WeixinWebview 为微信客户端内的浏览器;
  • BuServer 为我们自己的业务服务器;
  • WeixinClient 为微信 App;

以下流程的前提是 BuServer 已经具有签名所需的 access_token、jsapi_ticket 等信息

建立在这个基础上,我们想绕过这个安全策略,大概有两种方案:

  1. 常规操作,将一个固定的域名作为测试专用,填入安全域名列表里,占掉一个坑「这边当然可以专门申请个测试账号」,然后通过解决内网穿透「ngrok、花生壳之流」便可以实现;
  2. 非常规操作,通过修改 DNS 解析实现,将特定资源「或所有资源」的请求重写到本地开发服务上;

常规操作

  1. 通过 ngrok / 花生壳内网穿透,一般工具都会给你临时域名,固定的域名需要付费;
  2. 将域名填入微信安全域名列表中,并将验证文件放入 Web 容器里进行验证;
  3. 完成了上面两步,你就可以愉快的调试啦;

非常规操作

从上文流程图中可以看到 JS-SDK config 信息是通过当前请求页面的 URL jsapi_ticket appid ...... 按照一定规则进行签名得到的,然后将这个 config 传入微信客户端进行校验是否合法。

整个验证过程中,我们能 hack 的是将请求的资源转发到开发服务器上,从而能调试本地的代码。

围绕「将请求的资源转发到开发服务器」,可以想到下面两个方案:

  1. 将请求拦截,转发到开发服务器上;
  2. 利用 DNS 解析,将安全域名解析到开发服务器上「俗称 DNS 劫持」;

方案一 抓包工具转发

本文不过多赘述,可以通过 Charles,Fiddler 这些抓包工具对指定的请求进行转发,从而达到目的。

方案二 DNS 劫持

可以先看下图 DNS 解析过程:

要实现 DNS 劫持,最现实的是通过修改开发机的 hosts 文件将安全域名解析到本地开发环境 ip 上。

HTTP 请求的劫持

如果你的网站提供的是 HTTP 服务,只需要修改开发机中 hosts 文件,将安全域名指向开发服务。看到这里就差不多了,可以自己去实践了。

HTTPs 请求的劫持

但是目前大多数商业网站都 HTTPs 化了,因此并不能简单的通过 DNS 劫持,把请求转发到本地的 HTTP 服务上。

如果你的安全域名是一个 HTTPs 服务,那可能有点麻烦。首先我们来看看一次像 HTTPs Server 请求的时间线:

如上图可以看到当像 HTTPs Server 发起一个 HTTP 请求时,将会被永久重定向成 HTTPs 请求,然后响应头中会有一个特殊的头「strict-transport-security」,这个头是告知浏览器该域下的所有请求都将使用 HTTPs 访问。因此接下来如果再发起一个 HTTP 的请求,浏览器将会内部重定向至 HTTPs 请求。

上文对 HTTPs 请求的描述是为了引出当你安全域名对应的是 HTTPs 服务时,会遇到如下问题:

  1. 将安全域名 DNS 劫持到本地 HTTP 服务后,在浏览器中访问仍旧是 HTTPs 请求;
  2. 基于 1 ,我们想到清浏览器缓存,但是微信开发者工具无法进入 chrome://net-internals/#hsts 清理;

Q1:以 Chrome 为例,进入 chrome://net-internals/#hsts,清除安全策略。

Q2:在微信开发者工具中,我们并不能进入这个页面,也就意味着如果安全域名在该工具中有安全策略缓存,则你无法将它劫持到一个 HTTP 服务,「这边如果有什么方案,可以告诉我」。

为了解决这个问题,我们只能引入终极解决方案,通过一个 HTTPs Server 对请求做一个转发,具体流程如下:

ProxyServer 做了两件事:

  • 配置了安全域名对应的 SSL 证书,支持了 HTTPs 请求;
  • 将安全域名下的请求转发到对应开发服务上;

如果这个 ProxyServer 是作为一个通用服务存在,则需要考虑如何代理到不同开发者启动的开发服务上。

最开始我们计划通过 querystring 来制定需要代理到的开发服务的地址,实际情况是一个页面中所有依赖该域下的请求都得转发,因此 querystring 的方法不能很方便的实现这个功能。

因此最后通过 cookie 来实现这个需求,通过 cookie 指定开发服务器地址,这样该域下的所有资源请求都会带上该 cookie,就能实现自定义转发到上游服务了。

最终使用该方案调试微信 JS-SDK 需要做如下两步:

  1. 更改 hosts 文件,将安全域名劫持到代理服务上;
  2. 设置 cookie ,指定需要代理到的上游服务;

这样一来,该代理服务就可以作为通用服务所存在,任何开发者有绕过安全域名限制做一些调试,都可以使用这个服务。

FAQ

Q1. 常规操作的优劣?

Pros:

  1. 步骤比较少,容易搞,适合偶尔需要调试;

Cons:

  1. 固定域名要钱?啊,不固定域名又要经常改,但是一个月又只有三次修改机会啊;
  2. 微信安全域名池子没坑怎么办啊。。。「申请个测试账号也不是不行,但是这样后端 access_token、jsapi_ticket 相关接口都得修改」;
  3. 不够通用,其他三方登录有安全域名设置,并不能复用;

针对 Cons 1 有更优解,可以结合 DNS 劫持,在微信后台绑定安全域名时使用花生壳验证域名,然后其实不需要再使用花生壳了,可以修改 hosts,将验证的域名劫持到本地开发服务,这样既不用操心 HTTPs 也不用付费要固定域名。有兴趣的小伙伴可以尝试尝试。

Q2. 非常规操作又有什么优势?

Pros:

  1. 不需要额外的域名,意味着不用改安全域名配置,服务端代码也不用动;
  2. 通用,有类似安全域名策略的三方服务通杀;
  3. 对于普通开发者来说日常开发调试成本很低,也不需要什么特殊权限;

Cons:

  1. 搭建流程相对复杂点,需要服务器资源;

Q3. 真机微信里怎么调试啊?

祭出 Charles,Mac 用 Charles,Win 用 fiddler 开代理,如果是 HTTPs 则还需要配置证书信任,这个步骤本文不再赘述,可自行 Google。

Q4. 怎么申请测试账号?

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

小结

解决方案上,常规方案的额外成本较低,但是在多个开发者协同开发公众号的情况下,综合成本较高;非常规方案比较适合多个开发者需要调试微信 JS-SDK,一劳永逸。

在整个过程中,其实可以了解到 DNS 劫持的概念、实际应用,以及对 HTTPs 的进一步了解。

最后,如果喜欢可以关注公众号「茶杯盖」


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云南省农村信用社计算机岗位待遇如何,云南农村信用社薪资待遇如何?

在云南如果去存钱,相信大多数人都会把自己的小钱钱存在农村信用社而不是XX银行。在这一块风景秀丽,人美山美水美的地方,就金融行业来说云南农村信用社要是说自己差,那基本没有谁敢说自己做的好。所以在云南农信社这家企业里做一名…

小票上为啥指甲能划出印_指甲上出现竖纹,除遗传问题,或是身体在向你拉警报了,别忽视...

生活中常见女生给指甲抹上各种不同的颜色来让它变得美美的,指甲起着修饰人的形象的作用。而指甲的状况也能折射出身体的健康状态如何。每个人的指甲形态不一,有的润滑饱满,光滑平整,有月牙;有的坑坑洼洼,凸…

require.context

带表达式的 require 语句 如果你的 require参数含有表达式(expressions),会创建一个上下文(context),因为在编译时(compile time)并不清楚具体是哪一个模块被导入 require("./template/" name ".ejs");webpack 解析 require() 的…

使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表

这次,我想与您分享我最近从JSF 2.2功能中学到的知识。 为此,我决定创建一个简单的ajax,可滚动的延迟加载数据表。 请注意, 绝不这是相当大的库如Primefaces , RichFaces的或ICEFaces的 。 这只是为了告诉您我学到了什…

如何监视ps/查询的性能和使用

可以使用“查询管理”页面监视查询性能和使用情况。您可以获得的一些统计信息包括平均运行时、运行次数和上次运行日期。使用预定义的搜索,还可以选择要检查和报告的查询。查询管理还允许您取消当前在查询管理器和查询查看器中运行的查询,以及启用和禁用…

金融计算机怎么调成链式,FRM金融计算器使用方法

2020FRM考试计算器:想一想FRM一级考试基本上按计算器停不下来,我们就一定要买一个简单易操作的计算器,但是GARP对于FRM考生所使用的计算器是有规定的:所有参加FRM考试的考生必须使用GARP指定的计算器,如果考生在考试期…

参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解。让我们回想一下,曾经作为编程新手的我们是如何调优程序的?通常是在没有数据的情况下依靠主…

我是这么理解Vue中的响应式系统的

遇到知识,尤其是复杂的概念,我不能类比的话,我很难接收(所以学习很差...)。在看了大神染陌同学的Vue源码解析后,我想分享一下我所类比的Vue响应式系统,您得先看他的文章(至少看他写的…

图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】

图是表达多对多关系的一种数据结构,组成要素为顶点和连接顶点的边。 根据边有无方向可分为有向图和无向图 当边有权重时,升级为有向网和无向网 图在存储时,可采用邻接矩阵,比如下面的无向图(A)和&#xff0…

Neo4j:使隐式关系成为显式和双向关系

最近,我阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它。 他使用以下示例显示了Neo Technology和GraphAware之间的合作关系: 两家公…

复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...

计算机科学技术学院发布时间:2017-01-04 小字体 中字体 大字体2016年12月22日,历时七个月选拔的2016年度百度奖学金获奖者揭晓,复旦大学计算机科学技术学院2014级博士生刘鹏飞以其在“自然语言处理与深度学习”上取得的突出成绩,从国内外近百所著名高校数百位竞争者中脱颖而出,…

Deno 兼容浏览器具体指的是什么?

Deno 里面有一句描述:"Aims to be browser compatible",可以看到 Deno 的目标是兼容浏览器。那么这里的兼容浏览器到底如何是什么意思呢? 我简单谈谈我的理解吧。 首先这里的兼容性肯定不是 Deno 直接在浏览器端运行。因为 Deno …

判断按键值_「正点原子NANO STM32开发板资料连载」第十六章电容触摸按键实验...

1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子第十六章电容触摸按键实验上一章,我们介绍了 STM32F4 的…

将社交登录添加到Spring MVC Web应用程序:注册和登录

本教程的第一部分描述了如何配置Spring Social 1.1.0和Spring Security 3.2.0,但它留下了两个非常重要的问题尚未解答。 这些问题是: 用户如何创建新用户帐户? 用户如何登录? 现在该弄脏我们的手并回答这些问题了。 我们的示例…

实验五 编写、调试具有多个段的程序

(1)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。 ①CPU执行程序,程序返回前,data段的数据为多少? 见下图d 0770:0000 000f结果。 ②CPU执行程序,程序返回前&#xff0c…

手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...

工商银行信用卡一直是卡友们热议的对象,也有不少卡友问过小白:工商银行信用卡怎么办理?要哪些条件?要等多长时间?那么今天小白就为大家详细的讲解一下工商银行信用卡申请的各种方法和技巧,希望对大家有帮助…

数据可视化的基本原理——视觉通道

数据可视化为了达到增强人脑认知的目的,会利用不同的视觉通道对冰冷的数据进行视觉编码。 我们在数据可视化的时候,一方面,展现可视化对象本身的位置、特性,对应的视觉通道类型是定性或者分类,比如汽车在什么地方、汽…

linux测试地址是否能访问_一个小测试能看出孩子注意力是否集中,提前弥补,上小学会很轻松...

文|秘籍君不少家长虽然重视孩子的教育,却总是习惯“临阵磨枪”,具体体现在:孩子在上幼儿园的前一两个月才开始着急,害怕孩子适应不了幼儿园;孩子上了大班才开始重视“幼小衔接”,却不知道,从孩子…

服务器怎么禁止iis静态文件,如何禁止IIS缓存静态文件

禁止IIS缓存静态文件(png、js、html等)背景:IIS为了提高性能,默认情况下会对静态文件js、html、gif、png等做内部缓存,这个缓存是在服务器iis进程的内存中的。IIS这么做在很大程度上可以提高静态文件的访问性能,在正常情况下只要静…

汇编实验五

一、 二、 三、 四、 第一个 反汇编后发现不行 第二个 发现也不行 第三个 发现代码正确 五、 编写代码如下 调试后查看内存,发现数据相加了 六、 编写代码如下 发现逆序存储成功 七、实验总结 对于代码段的使用有了更加深入的了解。 但是对于代码段内存这块还是不懂…