几年前出于个人兴趣,基于 Keycloak 做了一个关注微信公众号即登录的方案,见《基于 keycloak 的关注公众号即登录功能的设计与实现 - Jeff Tian的文章 - 知乎 》,它是基于一个大佬写的 https://github.com/jyqq163/keycloak-services-social-weixin Keycloak 插件,进行了一番魔改而成的。日子一天一天过去,没想到,我的这个魔改版本,star 数量居然开始超过原版了。
star-history-2024129.png

由于自己主要使用语言是 nodejs,对于 Java 并不太熟悉,所以原版对我帮助很大,不然,我根本不知道如何下手开始为 Keycloak 写插件。虽然写得很烂,但的确有一定的商业价值,因为通过关注公众号登录,比起普通的扫码登录,无论是对用户,还是对开发,都更友好。
我想就是因为这个小小的商业价值,导致这个小插件,被越来越多的人关注,并被多家公司正式商用(比如“答疑家”)。由于有用户,所以我也陆续不断对它进行迭代升级,并在这个过程中,不断学习 Java 以及微信生态,这是一个有趣的成长过程
更有趣的是,我最近尝试在自己的应用中加入 GenAI,其中之一就是在微信公众号中,利用 GenAI 进行自动回复(《欢迎来调戏我:在公众号里对接 AWS Bedrock 服务 - Jeff Tian的文章 - 知乎 》),因此稍稍学习了一下微信的消息接口,最终发现又可以将这个学习成果应用在本 Keycloak 微信插件当中,进一步提升开发者体验,这就是更加有趣的一点了

体验

可以通过这个链接 https://keycloak.jiwai.win/realms/Brickverse/account/#/ 进行体验,在 PC Web 端选择微信登录方式即可。注意上述链接中使用了我个人的测试公众号,只能支持 100 个用户。

现状

在《【继续更新】尝试在 Keycloak 里打通整个微信生态 - Jeff Tian的文章 - 知乎 》里,介绍了该 Keycloak 微信登录插件,支持三种登录方式,分别是 ① 关注公众号即登录;② 基于开放平台的 OAuth 2.0 扫码登录;③ 手机端基于公众号的 OAuth 2.0 方式登录。但是,对于第 ① 种方式,配置方式其实是很麻烦的,这是因为需要开发者自己去将微信服务器发送过来的带参二维码扫描或者关注的 xml 消息,转发给 keycloak 服务器。也就是说需要开发者自己实现和微信服务器的对接。
具体来说,需要开发者在接收到微信服务器发来的 xml 消息后,将消息原封不动地转发给 Keycloak 服务器的 /realms//QrCodeResourceProviderFactory/mp-qr-scan-status接口,比如这样完整 URL:https://keycloak.jiwai.win/realms/Brickverse/QrCodeResourceProviderFactory/mp-qr-scan-status。要注意的是,需要在微信公众号后台配置自己的消息处理服务接口,直接配置 Keycloak 的是不行的。因为以上 Keycloak 接口只用来接收微信扫码事件,并没有实现微信消息接口协议,直接配置上去微信是不认的,会报错:
image.png
所以这就要求开发者自己实现和微信的消息对接,这可能需要一定的开发,所以是高级用法。当然,自己和微信消息对接也是有好处的,比如可以针对消息做更多的业务逻辑处理,只是同时需要将它转发给 Keycloak 而已。
但如果并没有高级需求,那么如果可以直接将 Keycloak 的 URL 配置上去,显然会更加方便,省去了自己的开发步骤。

改进

因为自己对微信的消息机制又了解得更多了,所以直接在 Keycloak 里对接了微信的消息接口,这样就可以进一步简化开发者的接入了。但同时,老的转发方式也还在,也就是变成了高级接入方式。通过高级接入,开发者可以基于微信的消息做更多的事情。
通过使用新版本 0.5.13 中,就可以省去自己开发微信消息接口的步骤,直接配置 Keycloak 插件里自带的,即:/realms//QrCodeResourceProviderFactory/message接口。比如我在体验链接实例里,就是这样配置的:
image.png

待办事项

不过,这个关注公众号即登录,还有更多值得优化的地方,比如需要支持分布式缓存等。现在这个插件,只能用在单个 Keycloak 实例中,如果要横向扩展,就需要引入 Redis 或者其他数据库来对扫码状态做存储。