首页
编程语言

分类

当前位置: 天天编程网 > 技术新闻 > 编程语言 >正文

keycloak~关于社区认证的总结

更新时间:2025-02-22  作者:佚名   来源: 网络转载

keycloak~关于社区认证的总结

keycloak关于社区认证它有统一的设计,社区认证包括了github,microsoft,wechat,qq,dingtalk等等,当然你还可以扩展很多实现了oauth2协议的第三方社区,将它们对接到keycloak上面来,这变得十分容易;社区认证一般由3个provider(SPI)组成,如下所示:

  1. 社区服务提供者(Identity Provider),继承了AbstractOAuth2IdentityProvider抽象类,实现了SocialIdentityProvider接口
  2. 社区服务第一认证流(First Login Flow),当社区用户与keycloak用户没有建立关联时,会走这个流程
  3. 社区服务后置认证流(Post Login Flow),当社区用户与keycloak建立关系后,在执行完社区服务提供者回调方法后,会走这个流程,完成社区认证最后的步骤

社区认证流程

  1. 用户在keycloak认证平台,点击第三方社区登录链接
  2. 跳转到第三方之后,用户在第三方完成登录
  3. 第三方让用户进行确认,是否公开自己的信息,用户同意之后,302重定向到keycloak社区接口
  4. 社区接口中通过第三方传回的code进行用户token的获取
  5. 根据用户token,调用第三方用户接口,获取第三方用户公开的信息
  6. 完成keycloak社区认证
  7. 填充用户属性信息
  8. 走post login flow流程
  9. 走token生成流程,根据client scope的mapper进行token字段的构建
  10. 完成登录后,302到目标页,带上keycloak颁发的授权码
  11. 目标网站,根据授权码,获取keycloak的token接口获取token

keycloak~关于社区认证的总结

社区绑定事件FEDERATED_IDENTITY_LINK的扩展

  • 具体执行的方法:org.keycloak.services.resources.IdentityBrokerService.afterFirstBrokerLogin方法
  • 添加自定义事件元素:event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getBrokerUserId());

keycloak~关于社区认证的总结

社区认证绑定用户属性的方式

当社区用户绑定keycloak用户后,社区的信息在登录后,可以自动将它们写到用户属性表里,我们可以通过以下方式来实现

  1. AbstractJsonUserAttributeMapper的实现类,并通过META-INF/services/org.keycloak.broker.provider.IdentityProviderMapper 来注入它
  2. 直接在SocialIdentityProvider具体社区实现类中,重写updateBrokeredUser方法,进行两种用户模块的映射

社区认证时的state参数构成

1 社区登录回调state参数,默认由3个参数的拼接而组成,分别是state随机数,tableId和clientId,而如果我们希望扩展它,让它支持4个参数,可以这样操作:

  • org.keycloak.broker.provider.util.IdentityBrokerState类中encoded方法
    keycloak~关于社区认证的总结

2 构建社区登录地址时添加自定义state参数

  • AbstractOAuth2IdentityProvider类中createAuthorizationUrl方法,修改state参数的拼接
String state = request.getState().getEncoded();
if (request.getAuthenticationSession().getAuthNote("g") != null &&
    request.getAuthenticationSession().getAuthNote("g").trim() != "") {
  state = state + "." + request.getAuthenticationSession().getAuthNote("g");
}

keycloak~关于社区认证的总结

3 在认证成功后federatedIdentityContext上下文添加参数

  • AbstractOAuth2IdentityProvider类中Endpoint.authResponse方法,再返回之前为federatedIdentity添加groupId参数
// 添加集团代码
String[] decoded = DOT.split(state, 4);
if (decoded.length == 4) {
federatedIdentity.setUserAttribute("g", decoded[3]);
}

keycloak~关于社区认证的总结

社区认证中用户同步的模式

  1. LEGACY(传统模式):

    • 在传统模式下,Keycloak 会尝试从外部身份提供程序导入用户,但如果在 Keycloak 中找不到匹配的用户,则会创建新用户。
    • 如果在外部提供程序中删除了用户,Keycloak 不会自动删除相应的用户帐户,而是将其标记为禁用状态。
  2. IMPORT(导入模式):

    • 在导入模式下,Keycloak 会从外部身份提供程序导入用户,但不会创建新用户。它只会更新现有用户的属性,确保与外部提供程序同步。
    • 如果在外部提供程序中删除了用户,Keycloak 不会自动删除用户帐户,而是将其标记为禁用状态。
  3. FORCE(强制模式):

    • 在强制模式下,Keycloak 会强制执行与外部身份提供程序的完全同步。这意味着它会创建新用户,更新现有用户的属性,同时还会禁用或删除在 Keycloak 中找不到的用户。
    • 强制模式确保Keycloak中的用户与外部提供程序中的用户保持完全同步。
上一篇:百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide 下一篇:有哪些好用的AI工具?(你想要的AI工具都在这)
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

天天编程网 版权所有

陕ICP备2023002928号-1