keycloak~关于社区认证的总结
keycloak关于社区认证它有统一的设计,社区认证包括了github,microsoft,wechat,qq,dingtalk等等,当然你还可以扩展很多实现了oauth2协议的第三方社区,将它们对接到keycloak上面来,这变得十分容易;社区认证一般由3个提供者社区,主要如下:
- 社区服务提供者,继承了AbstractOAuth2IdentityProvider抽象类,实现了SocialIdentityProvider接口
- 社区服务First Login Flow,当社区用户与keycloak用户没有建立关联时,会走这个流程
- 社区服务Post Login Flow,当社区用户与keycloak建立关系后,在执行完
社区服务提供者回调方法后,会走这个流程,完成社区认证最后的步骤
社区认证流程
- 用户在keycloak认证平台,点击第三方社区登录链接
- 跳转到第三方之后,用户在第三方完成登录
- 第三方让用户进行确认,是否公开自己的信息,用户同意之后,302重定向到keycloak社区接口
- 社区接口中通过第三方传回的code进行用户token的获取
- 根据用户token,调用第三方用户接口,获取第三方用户公开的信息
- 完成keycloak社区认证
- 根据用户属性信息
- 走post login flow流程
- 走token生成流程,根据client scope的mapper进行token字段的构建
- 完成登录后,302到目标页,带上keycloak颁发的授权码
- 目标网站,根据授权码,获取keycloak的token接口获取token

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

社区认证绑定用户属性的方式
当社区用户绑定keycloak用户后,社区的信息在登录后,可以自动将它们写到用户属性表里,我们可以通过以下方式来实现
- AbstractJsonUserAttributeMapper的实现类,并通过META-INF/services/org.keycloak.broker.provider.IdentityProviderMapper 来注入它
- 直接在SocialIdentityProvider具体社区实现类中,重写
updateBrokeredUser方法,进行两种用户模块的映射
社区认证时的state参数构成
1 社区登录回调state参数,默认由3个参数的拼接而组成,分别是state随机数,tableId和clientId,而如果我们希望扩展它,让它支持4个参数,可以这样操作:
- org.keycloak.broker.provider.util.IdentityBrokerState类中encoded方法

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");
}

3 在认证成功后federatedIdentityContext上下文添加参数
- AbstractOAuth2IdentityProvider类中Endpoint.authResponse方法,再返回之前为federatedIdentity添加groupId参数
// 添加集团代码
String[] decoded = DOT.split(state, 4);
if (decoded.length == 4) {
federatedIdentity.setUserAttribute("g", decoded[3]);
}

社区认证中用户同步的模式
LEGACY(传统模式):
- 在传统模式下,Keycloak 会尝试从外部身份提供程序导入用户,但如果在 Keycloak 中找不到匹配的用户,则会创建新用户。
- 如果在外部提供程序中删除了用户,Keycloak 不会自动删除相应的用户帐户,而是将其标记为禁用状态。
IMPORT(导入模式):
- 在导入模式下,Keycloak 会从外部身份提供程序导入用户,但不会创建新用户。它只会更新现有用户的属性,确保与外部提供程序同步。
- 如果在外部提供程序中删除了用户,Keycloak 不会自动删除用户帐户,而是将其标记为禁用状态。
FORCE(强制模式):
- 在强制模式下,Keycloak 会强制执行与外部身份提供程序的完全同步。这意味着它会创建新用户,更新现有用户的属性,同时还会禁用或删除在 Keycloak 中找不到的用户。
- 强制模式确保Keycloak中的用户与外部提供程序中的用户保持完全同步。
keycloak~关于社区认证的总结的更多相关文章
- keycloak~账号密码认证和授权码认证
用户名密码登录 POST /auth/realms/demo/protocol/openid-connect/token 请求体 x-www-form-urlencoded grant_type:pa ...
- ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码
概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...
- keycloak文章汇总
keycloak文章汇总 Keycloak是一个致力于解决应用和服务身份验证与访问管理的开源工具.可以通过简单的配置达到保护应用和服务的目的. 用户管理 你的应用不需要开发登录模块,验证用户和保存用户 ...
- sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证
一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...
- jenkins 集成 keycloak 认证
keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...
- ParrotSec 中文社区 QQ群认证 Openssl解密
ParrotSec 中文社区 QQ群认证 Openssl解密 下载Key.txt 打开parrot 系统,复制文件到系统.打开命令行输入 openssl enc -aes-256-cfb -d -in ...
- 开源认证和访问控制的利器keycloak使用简介
目录 简介 安装keycloak 创建admin用户 创建realm和普通用户 使用keycloak来保护你的应用程序 安装WildFly client adapter 注册WildFly应用程序 安 ...
- Keycloak 13 自定义用户身份认证流程(User Storage SPI)
Keycloak 版本:13.0.0 介绍 Keycloak 是为现代应用程序和服务提供的一个开源的身份和访问管理的解决方案. Keycloak 在测试环境可以使用内嵌数据库,生产环境需要重新配置数据 ...
- Laravel 5.2 使用 JWT 完成多用户认证 | Laravel China 社区 - 高品质的 Laravel 开发者社区 - Powered by PHPHub
Json Web Token# JWT代表Json Web Token.JWT能有效地进行身份验证并连接前后端. 降地耦合性,取代session,进一步实现前后端分离 减少服务器的压力 可以很简单的实 ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
随机推荐
- ProWindow的控制按钮状态
在使用ArcGIS.Desktop.Framework.Controls.ProWindow时,有网友发现,设置窗口调整模式后,窗口的控制按钮是不全的. ProWindow win = new Pro ...
- window.open打开网址被拦截
window.open打开网址被拦截 标签: js 坑位 通过window.open打开一个网址,在火狐和IE系列浏览器下会拦截掉,除非用户主动点击允许才会成功,这样用户体验基本是恶心到产品的,而产品 ...
- 如何使用图片压缩降低COS流量成本?
导语 本文将介绍如何通过[图片压缩]能力,让您降本增效的使用 COS ,文章将写得浅显易懂,旨在快速带领用户了解图片压缩的用法及带来的收益. **** 图片压缩为什么会让您降本增效?******** ...
- Hive数据库【操作】+ 【分区】+【分桶】+【查询】+【运算】+【函数】
目录 键值对信息 数据库表操作 内部表操作 外部表操作 分区表的操作 分桶表操作 数据查询 关系运算 数学运算 逻辑运算 数值计算 日期函数 键值对信息 添加数据库的描述信息(添加键值对信息) cre ...
- liquibase maven
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- python 根据中文表头标题抓取动态(表格)文档数据
思路 如图左侧表头标题,要获得右侧数据.网页数据提取成汉字,表格数据间会有空格,用split()分隔成list.用index()查找某个汉字表头位置,输出list下一个位置既是要得到值 text2 = ...
- Qt数据库应用1-数据导入导出csv
一.前言 在经历过大大小小十几个甚至几十个纯QtWidget项目后,涉及到数据库相关的项目,几乎都有一个需求,将少量的信息数据比如设备信息.防区信息等,导出到文件保存好,然后用户可以打开该表格进行编辑 ...
- Qt编写安防视频监控系统23-图片地图
一.前言 图片地图这个模块是后面新增加进去的,主要是安防领域还有很多应用场景是一个区域比如就一个学校,提供一个学校的平面图或者鸟瞰图,然后在该地图上放置对应的摄像机,双击该摄像机图标可以查看对应的实时 ...
- vue 控件的淡入淡出
页面代码. 1.首先要用transition 包裹一下,设置name或者不设置都可以,其次transition 下面要有一个div设置v-if来触发移入移出 <transition name=& ...
- 在Win7 x64环境中将World Wind Java SDK 2.1.0嵌入到Eclipse中的方法
1.解压worldwind-2.1.0.zip. 2.打开Eclipse,依次点击New–>Java project ,输入project的名称WorldWind,一路直到finish.然后就可 ...