基于 Authing.cn 的关注微信公众号登录的实现方案,以及和其他方案的对比
为什么会有关注微信公众号登录的需求?
在如今的互联网时代,微信公众号被越来越多的企业用于与用户之间的交流和沟通,其中包括用户的登录认证。通过关注公众号登录,不仅可以给公众号引流,而且能够将用户与公众号粉丝一一对应。最后,这种方式对于用户来说,也更加方便快捷。对于已经关注过公众号的用户来说,扫码后就直接进入登录状态了;对于新用户来说,仅需要多点一次关注的操作。
本文内容
本文将介绍如何使用 Authing.cn 来实现关注微信公众号登录的方案,并和我自己之前的几个实现方案做一个对比。
最终方案展示
可以访问: https://taro.jefftian.dev/pages/subpages/auth/authing(或者 https://taro.pa-ca.me/pages/subpages/auth/authing ),在登录框中选择“微信公众号关注”:
使用微信扫描二维码后,会发现这是我的测试公众号。选择关注,网页就会自动登录;而如果之前已经关注过,在扫码后,网页会直接进入登录状态。如果是第一次扫码登录本网站(哈德韦的个人小程序),那么会出现如下的页面,允许你创建一个新账号,或者绑定到已有账号。
同时,手机可以收到微信公众号发来的欢迎信息。这一块儿可以做更多事情,目前我的示例程序写得很简单,会发一条简单的欢迎信息:
但是,由于测试公众号的限制,只能有100个粉丝。因此本演示只对前100名新用户有效。注意,如果是真正的服务号,就不用担心粉丝数量的限制了,但是申请微信的服务号,需要企业资质,个人开发者暂时没有办法申请。
关注公众号登录的核心要件
带参二维码
这是服务号才有的能力,由微信提供。带参二维码本质上是一个动态生成的随机信息,用来标识当前会话。一旦有用户扫码,那么,该会话就和一个身份绑定起来了。
这些都是微信服务和开发者服务之间进行的后端信息交换。首先,开发者服务需要通过凭据获取带参二维码;其次,在用户扫码后,开发者服务会接收到微信的消息通知。
扫码状态的维护
开发者服务需要对扫码状态进行维护,其键值是带参二维码对应的临时票据,其值可能是待扫码、已扫码和超时等。一旦某个临时会话收到了微信发来的有用户扫码的消息通知,就应将该会话转为已登录状态,而一个超时没有收到用户扫码消息通知的会话,应该通过某种方式标记出来。
因为这个关注公众号登录的场景,一般用在 Web 端。所以常见的对扫码状态的更新查询,都是使用了定时轮询的方式。一旦扫码完成,就会在下一次轮询时得到状态更新,这个 HTTP 的响应,不仅在负载中携带了已扫码的状态,而且往往通过 HTTP 标头带上了 set-cookie 来将已验证的会话标识传给客户端。客户端(即 Web UI)会更新页面。
对于多次轮询后,碰到超时的情况,页面往往更新为“请刷新二维码”之类的提示。
其他方案及其与 Authing.cn 方案的对比
先说结论,采用 Authing.cn 开发量最少,仅需要做一些配置即可。以上对核心要件的分析截图中,都没有任何自己的代码,全是 Authing.cn 实现的。尽管看不到 Authing.cn 的源码,但是从表现上看,却能够完全推测出其大致思路,这是由于无论采用具体方案去实现,只要是对接微信公众号关注登录,其核心要件是没有区别的。
当然也可以看出,所谓低代码,甚至无代码,其实是在另外的地方产生了更多的代码。复杂性无法凭空消失,但是可以转移或者隐藏。在掌握了微信公众号关注登录的核心要件后,至于是自己写,还是用别人写的,都不会再有神秘感了。
基于 Keycloak 的微信公众号关注即登录方案实现
详见《基于 keycloak 的关注公众号即登录功能的设计与实现》,该方案基于开源的身份认证系统 Keycloak,魔改了一个微信 OAuth 2.0 的登录插件而实现,它将关注公众号插件作为 Keycloak 的一个身份提供者程序。
当时写这个方案前,Authing.cn 还没有正式推出微信公众号关注登录的方案(也许内部已经实现了,但文档中没有体现)。后来我在一篇对比 Keycloak 和 Authing.cn 的文章中指出了这一点,他们立即就更新了文档,正式推出了微信公众号关注登录的方案,反应十分迅速,必须点赞。
这个方案的难点是必须学习一下 Keycloak,并且基于其提供的接口做二次开发。我的实现基于另一个开源插件进行了魔改,其中扫码状态维护在了内存中,因此只适合于一个服务器实例的 Keycloak。
基于 Keycloak 做开发也有好处,那就是登录 UI 等等已经有现成的可以直接利用,账号绑定等等也有系统中现有的整套流程。
基于 Java Spring Security 的微信公众号关注即登录方案实现
详见《基于 Java Spring Security 的关注微信公众号即登录的设计与实现》。该方案需要结合 Spring Security,通过自定义的方式实现登录态。
之所以做这个方案,是由于收到了一些知乎上的咨询。给我的感觉,国内用 Java、或者说 Spring 框架非常多,有一个团队使用了 Spring Security,希望能加入微信公众号关注即登录的功能,于是我做了一个最小的示例。同时,为了避免单实例服务的限制,将扫码状态维护到了外部存储。这个工程会依赖 Apache Pulsar。
这个方案的难点在于一切从 0 开始,所以 UI 上特别简陋,另外还需要学习一下 Spring Security。
以上是对自己在微信公众号关注即登录做的一个简要回顾,下面详述如何使用 Authing.cn 来实现它。
什么是 Authing.cn?
Authing.cn 是一家提供身份认证与授权服务的云平台,拥有完善的身份认证、授权管理等功能。通过 Authing.cn,您可以快速搭建安全可靠的用户认证和授权系统。
实现方案
步骤一:注册 Authing.cn 账号
首先,我们需要在 Authing.cn 上注册账号,步骤非常简单,只需要填写一些基本的信息即可。
步骤二:创建应用
在注册成功后,我们需要创建一个应用,应用是一个集成了身份认证、授权管理等功能的单元。在创建应用时,需要填写应用名称、应用回调地址等信息。
步骤三:配置微信公众号登录
接下来,我们需要在 Authing.cn 上配置微信公众号登录,具体操作如下:
在社会化身份源中添加一个微信身份源。
在这个身份源中添加微信公众号关注:
填写相应的 AppID 和 AppSecret,并保存。这个 ID 和 Secret 以及令牌,都要和微信公众号后台配置一一对应。由于我没有公司,申请不了服务号。但是好在微信提供了测试公众号,拥有和服务号相同的能力,只是有 100 个粉丝的上限。以下截图中的 appID、appsecret 以及 Token 对应上图中框出来的值。另外,接口配置信息里,有一个 URL,这个后面我们进行详解。这个接口,是用来接收微信发来的消息的。
步骤四:集成登录功能
在完成上述步骤后,我们需要在应用中集成登录功能。具体集成方式可以参考 Authing.cn 提供的文档。
如果仔细查看 Authing.cn 的文档,已经 GitHub 上的代码示例,会发现,他们提供了两种集成的方式。第一种方式,是在上图中的 URL 直接填入 Authing.cn 提供的接口地址。这样有一些弊端,一是只能使用 Authing.cn 来进行微信公众号关注登录了;二是,微信发送的其他消息也都会被该接口接收,如果还有其他业务需求,就不太好做了。
第二种方式,就是在上图中的 URL 填入自己的接口地址,而在自己的接口中,将收到的扫码信息,转发给 Authing 的服务器即可。非常推荐这个方式,而如上图所示,我填入的也是自己的服务接口,采用的就是这个转发的方案。所以,除了最开头的效果展示中的集成了 Authing.cn 的微信公众号关注登录可以正常运行外,几年前实现的基于 Keycloak 的微信公众号关注登录以及基于 Spring Security 的微信公众号关注登录,都能继续工作。
采用第二种方式,最关键的是要将微信发来的消息,原封不动地转发给 Authing,这个转发目的地址,官方文档也有说明,对于我来说,这个地址就是: https://core.authing.cn/connections/social/brickverse-public/620097b69a9dab5e967d0c44/events 。
总结
通过上述步骤,我们可以快速实现关注微信公众号登录的功能,而且不需要过多的开发工作。借助 Authing.cn,我们可以快速搭建安全可靠的用户认证和授权系统,为企业的用户管理提供了有力的支持。