最终效果体验
点击这个链接:https://uniheart.pa-ca.me/keycloak/login,选择“阿里云”登录。
使用提前创建好的 RAM 用户登录完成后,可以在 Keycloak 控制台看到该用户的 aliuid 已经被同步过来。同时,界面拿到的用户 id_token 里,也有 aliuid 属性。
本篇文章继续以我部署的 Keycloak 实例,详解集成 阿里云登录 的实现步骤。
在阿里云 RAM 访问控制台的 OAuth 应用中创建应用
https://ram.console.aliyun.com/applications 工作台的集成管理里,OAuth 应用进入公测阶段。我们创建一个企业应用。
在创建时,选择 WebApp 类型,并将回调地址留空,给应用起个名字(我叫它 Keycloak)即可保存先。
然后,创建密钥并复制:
在 Keycloak 中添加 Identity Provider
选择“OpenID Connect v1.0”,并给它起个名字。
其中,Discovery endpoint 可以从阿里云官方文档 https://help.aliyun.com/document_detail/93698.html?spm=a2c4g.118590.0.0.3f87352cIIrdG7 处获得。Client ID 是我们在上一步中生成的一串数字,而 Client Secret 是我们上一步复制下来的。
保存应用,可以看到 Redirect URI 中的 broker 后面的路径变成了我们指定的 Alias:
记下这个地址,并且注意到它自动从 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”:
以便在获取阿里云用户信息时能够得到 aliuid。
在阿里云控制台里回填回调地址
在上一步我们得到了新的 Identity Provider 的回调地址是: https://keycloak.jiwai.win/realms/UniHeart/broker/aliyun/endpoint,将其填入前面留空的应用基本信息中:
在阿里云身份管理工作台创建用户
在 Keycloak 中给 Identity Provider 增加 Mappers
在做完上一步后,你已经可以在 Keycloak 中体验阿里云登录了,但是登录成功后,用户的 aliuid 没有同步过来。要同步这样信息,需要增加 Identity Provider Mappers:
再次从阿里云官网文档(https://help.aliyun.com/document_detail/93698.html?spm=a2c4g.118590.0.0.3f87352cIIrdG7)得知,aliuid 在令牌中以 uid 字段出现:
于是,在 Mappers 里我们选择 Attribute Importer 类型,并将 Claim 和 User Attribute Name 填上 uid。
我这里还选择了 Force 的同步模式,从而可以在每一次用户登录时,都更新用户数据。
在 Keycloak 中给 Client scopes 增加 Mappers
在上一步后,用户登录成功后,已经可以拿到 aliuid,如前面的图所示。但是,最终 Keycloak 颁发的身份令牌以及用户信息接口中,不会包含该字段。于是我们去 Client scope 要增加 Mappers:
选择 By configuration,并再次选中 User Attribute:
接着我们勾选上 Add to ID token 和 Add to userinfo:
定制用户完善资料页面
如果阿里云的用户是第一次登录到 Keycloak,那么 Keycloak 会要求该用户完善资料:
以上 Username 是 Keycloak 自动生成的,可以修改。如果不想让用户修改,并且不展示在用户资料确认页,那么可以设置默认邮箱就是用户名,并且不允许用户修改用户名。可以在 Realm 设置里做一些调整,如下图所示。
这样,用户第一次登录到 Keycloak,只需要补充一下 Email:
邮箱验证
注意上一步我们还勾选了“Verify email”,这会让用户在输入 Email 并提交后,进入一个验证邮箱页,不验证就不能进入最终用户登录态。
Keycloak 内置的邮箱验证功能,可以在 Keycloak 的 Realm 设置中启用并配置它。启用邮箱验证后,当用户注册或更新邮箱地址时,Keycloak 将发送一封验证邮件给用户,要求用户验证其邮箱地址。 在 Keycloak 的邮箱验证功能中,你可以配置验证邮件的内容、验证链接的有效期等。Keycloak 会生成一个唯一的验证令牌,并将该令牌包含在验证链接中。当用户点击验证链接时,Keycloak 会验证令牌的有效性,并将用户的邮箱地址标记为已验证。 我的配置和今天试验阿里云登录的邮件如下:
了解更多
欢迎旁听 https://www.zhihu.com/consult/conversation/1664729447017107456/graphic-chat 了解更多细节。