继上次《<font style=color:rgb(18, 18, 18);>【重磅更新】关注微信公众号即登录插件升级支持 Keycloak 22! - Jeff Tian的文章 - 知乎 》之后,今天继续增加了在 Keycloak 里使用微信开发平台扫码登录的功能。最早基于 Keycloak 实现了关注公众号即登录的场景,一是该方案具有一定的商业价值,二是对于个人来说,可以使用测试公众号,在粉丝数少于 100 人的情况下,实现扫码登录。

最近该 Keycloak 微信插件得到知友的支持,通过提供的企业级微信公众号,打通了 Keycloak 的手机端微信登录。今天增加的使用微信开放平台的桌面网页扫码登录,虽然很常见,但是对企业资质要求更严格了。好在有知友的大力支持,暂时也是打通状态(由于开放平台的限制,只能配置一个回调域名,因此后面可能要被收回)。

1693059764387 8b70e416 d27f 49f2 9e8c 46f01ce547ab

总结一下目前 Keycloak 微信插件的功能:

关注微信公众号即登录

这是最早开发的一个功能,适用于桌面端网页。用户选择微信登录,会展示一个带参二维码(可以展示在非微信的网页里)。用户扫码后,如果是非粉丝,只需要点击关注即登录。而如果是老粉丝,扫完即登录。体验链接: https://keycloak.jiwai.win/realms/UniHeart/account/

有企业认证的服务号,就可以实现该功能。注意上述链接中使用了我个人的测试公众号,只能支持 100 个用户。

手机端微信登录

手机端的微信登录,仍然是使用了公众号的能力。所以只要有一个企业认证的服务号,就可以同时实现桌面端和手机端的微信登录。体验链接:https://keycloak.jiwai.win/realms/UniHeart/account/

利用微信开放平台的桌面网页微信登录

体验链接:https://keycloak.jiwai.win/realms/Brickverse/account/#/,注意,这是另一个域了,因为 UniHeart 域已经配置了关注微信公众号即登录,所以开了一个新域用来展示开放平台的微信登录功能。要使用这个功能,需要企业在微信开放平台里注册网站应用,这是除了公众号认证之外,又需要额外维护的一个微信资源,尽管每年额外的 300 元的认证费并不贵,但是一年一次,挺烦的。

1693059552043 bd5e0caa a8f6 4943 b42c 0fb4a7233737

要使用微信登录的能力,还得确保接口状态是已获得。总之,比开发关注公众号即登录的前置条件更繁琐,但是具体到写代码时,由于是标准的 OIDC 协议,可以无脑对接,相对关注公众号即登录少一些挑战。

1693059650745 63430ddd 2e2c 482e bf71 57011a55f619

配置项

一共有 4 个配置项,小程序的留待以后再说。前 3 个配置分别对应上面的 3 个功能。

1693059222226 197c85c1 3c64 44a1 ace4 13548a9861c1

温馨提示

对于第一次使用微信登录 Keycloak 的用户,会被要求补充邮箱,这是由于 Keycloak 的默认设置,对用户都会要求有 Email 字段。如果希望不要用户补充邮箱,可以从域配置中禁用,具体的做法是在 Authentication 的 first broker login 里 Disable Review Profile 选项。

1693059443816 5ea0ba68 36cf 44e9 adf8 5a16da3c9fee

之所以是从 first broker login 里改,而不是从 registration 里改,是因为 Keycloak 在配置第三方 identity provider 时,First Login flow 默认选的是 first broker login。如果改成了 registration,应该就是要在注册那里改。关于 first broker login,可以从《<font style=color:rgb(18, 18, 18);>首次代理登录流程 - Jeff Tian的文章 - 知乎 》了解更多详情。

如何保证不同端的同一账号被正确识别?

如果同一个用户分别使用桌面端网页微信登录和手机端网页登录,在 Keycloak 里会分别创建出两个不同的用户吗?

这取决于是否能够拿到该用户在同一个开放平台下的 unionid。微信开放平台的 unionid 对于公众号和网站应用,对同一人分配的都是同一个。但是公众号下的 openid 和网站应用下的 openid,肯定是不同的。

对于企业来说,可以将公众号和网站应用绑定在同一个开放平台账号下,从而保证它们的 unionid 是和用户一一对应的。

1693059998487 75fc55d0 d228 47ea bf00 26c5fefe520c

对于我的 Keycloak 实例,https://keycloak.jiwai.win 来说,则不能保证。原因是混用了个人,以及不同的企业(甚至会随时变化)的微信资源。

最新版本

目前的最新版本链接:https://github.com/Jeff-Tian/keycloak-services-social-weixin/releases/tag/0.4.4

源代码,以及 jar 文件,都可以从上面的链接里找到。如果要通过 maven 的方式引用,可以添加如下内容到 pom.xml 的依赖项里:

xml org.keycloak keycloak-services-social-weixin 0.4.4

然后执行 mvn install即可。

使用方法

将 jar 文件复制到 Keycloak 的 /opt/keycloak/providers/目录里即可。 https://keycloak.jiwai.win 就是这样用的,源代码见: https://github.com/jeff-tian/keycloak-heroku