最终效果体验

点击这个链接:https://uniheart.pa-ca.me/keycloak/login,选择“阿里云”登录。

1689763297152 2ecbec74 4d24 4ed7 ac60 2e3d6b32857d

使用提前创建好的 RAM 用户登录完成后,可以在 Keycloak 控制台看到该用户的 aliuid 已经被同步过来。同时,界面拿到的用户 id_token 里,也有 aliuid 属性。

1689763454526 85855ba1 0fa8 4609 a23f cca26011e2bf 1689763472522 3965dfb8 ed5d 46cf 9d44 555c5a0bc4ef 1689763501422 04ca330a 263e 4288 b800 ac3ba2d11115

本篇文章继续以我部署的 Keycloak 实例,详解集成 阿里云登录 的实现步骤。

在阿里云 RAM 访问控制台的 OAuth 应用中创建应用

https://ram.console.aliyun.com/applications 工作台的集成管理里,OAuth 应用进入公测阶段。我们创建一个企业应用。 1689763605150 6e884961 3446 4ed0 8722 ade6c07fa6a3

在创建时,选择 WebApp 类型,并将回调地址留空,给应用起个名字(我叫它 Keycloak)即可保存先。 1689763779391 abaddc96 b963 4b64 a81c b1cf6d9cdf2c

然后,创建密钥并复制:

1689763911861 59f9dab7 04af 4580 aa11 6315c7b51ff3

在 Keycloak 中添加 Identity Provider

1689764008243 d293e11b 739d 429d 97e5 390a17f1e024

选择“OpenID Connect v1.0”,并给它起个名字。

1689764231531 159978a1 bd4c 4156 9a39 c495c5854cd4

其中,Discovery endpoint 可以从阿里云官方文档 https://help.aliyun.com/document_detail/93698.html?spm=a2c4g.118590.0.0.3f87352cIIrdG7 处获得。Client ID 是我们在上一步中生成的一串数字,而 Client Secret 是我们上一步复制下来的。

1689764355506 b5c4477e c4c7 45ed ba28 43c5bf329747

保存应用,可以看到 Redirect URI 中的 broker 后面的路径变成了我们指定的 Alias:

1689764577759 9ea13735 1805 4548 a49f 83db64b8c638

记下这个地址,并且注意到它自动从 Discovery Endpoint 解析出了 Authorization URL 和 Token URL 以及 User Info URL。我们删除 Issuer,并且反勾选 Validate Signatures,以避免 Keycloak 在用户登录交互中对阿里云颁发的令牌进行校验。

如果不这样做,在用户登录过程中会碰到 token signature validation failed 这样的错误:

shell 2023-07-19T02:43:28.955269+00:00 app[web.1]: 2023-07-19 02:43:28,954 ERROR [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (executor-thread-39) Failed to make identity provider oauth callback: org.keycloak.broker.provider.IdentityBrokerException: token signature validation failed

接着,展开“Advanced”选项,在 Scopes 中输入“openid aliuid profile”:

1689764864091 4738eb42 1877 48a5 a41a e013f6accc6a

以便在获取阿里云用户信息时能够得到 aliuid。

在阿里云控制台里回填回调地址

在上一步我们得到了新的 Identity Provider 的回调地址是: https://keycloak.jiwai.win/realms/UniHeart/broker/aliyun/endpoint,将其填入前面留空的应用基本信息中:

1689765027284 e0eec221 306a 49c0 835c a7067fe1ac9b

在阿里云身份管理工作台创建用户

1689765990527 9b917c17 5c17 4af6 bc44 842b78bc0c24

1689766038612 1ba99f94 e263 46c4 aaec d8daf073d03b

在 Keycloak 中给 Identity Provider 增加 Mappers

在做完上一步后,你已经可以在 Keycloak 中体验阿里云登录了,但是登录成功后,用户的 aliuid 没有同步过来。要同步这样信息,需要增加 Identity Provider Mappers:

1689765129166 4be17893 efb9 48f3 b8be 142b8d26217b

再次从阿里云官网文档(https://help.aliyun.com/document_detail/93698.html?spm=a2c4g.118590.0.0.3f87352cIIrdG7)得知,aliuid 在令牌中以 uid 字段出现:

1689765201195 7e4b6947 a1dd 45be b365 d1e9671eea9c

于是,在 Mappers 里我们选择 Attribute Importer 类型,并将 Claim 和 User Attribute Name 填上 uid。 1689765292296 4eafebbe b352 4755 b6a7 8598fbb9fdaf

我这里还选择了 Force 的同步模式,从而可以在每一次用户登录时,都更新用户数据。

在 Keycloak 中给 Client scopes 增加 Mappers

在上一步后,用户登录成功后,已经可以拿到 aliuid,如前面的图所示。但是,最终 Keycloak 颁发的身份令牌以及用户信息接口中,不会包含该字段。于是我们去 Client scope 要增加 Mappers:

1689765456525 2f3b37b9 3793 4f6a a1ff 7d25da0e1aec

选择 By configuration,并再次选中 User Attribute:

1689765500882 a75afd79 b453 4922 bd98 d215f6b09bf2

接着我们勾选上 Add to ID token 和 Add to userinfo:

1689765543403 1163d4fe 0d68 4881 9813 d2ccbc5a5a01

定制用户完善资料页面

如果阿里云的用户是第一次登录到 Keycloak,那么 Keycloak 会要求该用户完善资料:

1689767283441 12f04f99 f154 4a48 ab4a f02985669dd7

以上 Username 是 Keycloak 自动生成的,可以修改。如果不想让用户修改,并且不展示在用户资料确认页,那么可以设置默认邮箱就是用户名,并且不允许用户修改用户名。可以在 Realm 设置里做一些调整,如下图所示。

1689765733870 7e7fe57a 1186 4a6b b861 4a819a0047d6

这样,用户第一次登录到 Keycloak,只需要补充一下 Email:

1689766596652 ba73f3aa ad77 4bca b7a6 b949fabb7be3 1689767145198 c9fa89e6 4568 4485 9793 ff43f32ff74a

1689765776430 c57ea6db c83a 43da bc93 aa0a9a349dca

邮箱验证

注意上一步我们还勾选了“Verify email”,这会让用户在输入 Email 并提交后,进入一个验证邮箱页,不验证就不能进入最终用户登录态。

1689766179330 6c904ac0 0346 4e6e 8405 ec542128f6a9

Keycloak 内置的邮箱验证功能,可以在 Keycloak 的 Realm 设置中启用并配置它。启用邮箱验证后,当用户注册或更新邮箱地址时,Keycloak 将发送一封验证邮件给用户,要求用户验证其邮箱地址。 在 Keycloak 的邮箱验证功能中,你可以配置验证邮件的内容、验证链接的有效期等。Keycloak 会生成一个唯一的验证令牌,并将该令牌包含在验证链接中。当用户点击验证链接时,Keycloak 会验证令牌的有效性,并将用户的邮箱地址标记为已验证。 我的配置和今天试验阿里云登录的邮件如下:

1689766422855 5584d9a8 b6b8 4179 ab22 98ec0328f373

1689766253208 acbc4396 7953 4ae1 b1ca c03d99a6b695

了解更多

欢迎旁听 https://www.zhihu.com/consult/conversation/1664729447017107456/graphic-chat 了解更多细节。