之前因为不同的目的,做了几个示例程序。今天,把它们串起来,以实例的方式,展示一下如何用 Keycloak 来打造单点登录体验。

问题

有两个系统,分别由不同的团队开发,技术栈也完全不同。在交付时,发现其用户群体是一样的,用户希望能够拥有单点登录体验。在这里,虽然是一个假想问题,但是在实际工作中可能会经常碰到。比如,A 系统由外包团队开发,B 系统由公司 in house 开发。或者 A 系统由一个外包公司开发,而 B 系统由另一个外包公司开发。但是它们都是整个公司数字化中的一小块儿,在实际上线后,属于同一个整体。在这种场景下,启用单点登录体验,不仅方便用户,也方便公司的管理。

要启用单点登录,用任何一种身份认证服务都行,之前也举过基于 Duende IdentityServer、authing.cn 等的例子,今天再拿 Keycloak 举一个例子。

流程图

不同的具体情况有不同的集成方式,但是以下流程图是一个最基本的并且可行的集成方式,即将 Keycloak 做为一个独立的服务,不同的系统和它进行对接即可。这种方式,会导致页面之间存在跳转,但是对于用户来说,不需要二次登录,因此体验上还是可以接受的。

举例

Keycloak 仍然拿我的 https://keycloak.jiwai.win 做为实例,A 系统是 https://umi-ckeditor5.brickverse.dev/,而 B 系统是 https://uniheart.pa-ca.me/keycloak/login 。你可以先点击 A 系统中的登录按钮:

image.png

它会跳转到 Keycloak 登录页:
image.png

推荐使用邮箱密码登录(没有账号的话可以先注册),或者使用 GitHub 登录(其他的登录方式还在开发中……)。

登录完成后(跳回了系统 A),可以看到 token 信息:
image.png

这时,打开系统 B: https://uniheart.pa-ca.me/keycloak/login ,你会看到页面一闪而过,但是不需要你输入登录凭据,它会自动进入登录态,即展示 token 信息:
image.png

具体配置

一般来说,要将多个不同的系统中联系起来,实现单点登录,并不需要太多编码,只需要配置即可。实现上,以上两个项目,在开发时是出于完全不同的目的,但通过配置同一个 keycloak 实例,它们就联在一起了。

A 系统的配置

源码见:https://github.com/Jeff-Tian/umi-ckeditor5/blob/main/.umirc.js

image.png

B 系统的配置

源码见: https://github.com/Jeff-Tian/alpha/blob/master/keycloak.json
image.png

java 项目

以上两个示例,都是 node 应用。如果是 java 项目,1) 如果引用 keycloak-spring-boot-starter,可以参考 https://zhuanlan.zhihu.com/p/480816990 ;2) 如果使用 spring-boot-starter-oauth2-resource-server,可以参考 https://zhuanlan.zhihu.com/p/623303771

彩蛋

关于 Keycloak 的部署,欢迎参考 https://github.com/Jeff-Tian/keycloak-heroku。也欢迎提出意见和直接贡献代码!另外,附一张 Keycloak 的数据库模型图:

graphviz (1).svg