keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程:

  1. 打开社区认证页面,输入账号密码或者扫码,完成社区上的认证
  2. 由社区进行302重定向,回到keycloak页面
  3. keycloak与社区完成一次oauth2授权码认证,通过社区返回的code来获取token,再通过token来获取社区上的用户信息,在这个过程中,社区不需要向keycloak公开用户的密码,这也是oauth2的安全性的表现
  4. keycloak检查用户是否与自己本地用户绑定,如果未绑定,进入第一认证流进行注册或者绑定现在有用户,完成与社区的对应关系,在这个过程中,keycloak对发出FEDERATED_IDENTITY_LINK事件
  5. 用户完成绑定之后,进行后一认证流,完成登录之后再做的事,如果用户已经完成绑定,那么第一认证流就不会进入了

回调地址的扩展

  • 当社区认证成功后,会跳转到keycloak的社区认证流
  • 当keycloak社区认证流完成后,会走到标准认证流
  • 标准认证流完成后,会重写向到来源页,并带上keycloak的code码
  • 这时,来源页上有且只有code码这个参数,如果希望扩展url上的参数,我们需要以下步骤

在社区回调地址上添加loginType参数

  • org.keycloak.services.resources.IdentityBrokerService.finishBrokerAuthentication()方法添加对loginType的操作
private Response finishBrokerAuthentication(BrokeredIdentityContext context, UserModel federatedUser,
AuthenticationSessionModel authSession, String providerId) {
authSession.setAuthNote(AuthenticationProcessor.BROKER_SESSION_ID, context.getBrokerSessionId());
authSession.setAuthNote(AuthenticationProcessor.BROKER_USER_ID, context.getBrokerUserId()); this.event.user(federatedUser); context.getIdp().authenticationFinished(authSession, context);
authSession.setUserSessionNote("loginType", providerId);
...
}
  • org.keycloak.protocol.oidc.OIDCLoginProtocol.authenticated()方法中,获取loginType,并添加到回调路径的URL参数中
  code = OAuth2CodeParser.persistCode(session, clientSession, codeData);
redirectUri.addParam(OAuth2Constants.CODE, code);
// TODO: 登录成功后,将用户登录方式追加到回调页面上
if (authSession.getUserSessionNotes().containsKey("loginType")) {
String loginType = authSession.getUserSessionNotes().get("loginType");
redirectUri.addParam("loginType", loginType);
}

FEDERATED_IDENTITY_LINK的完善

  • 默认的绑定消息,内容比较少,不满足我们的需求
{
"time": 1723099954167,
"type": "FEDERATED_IDENTITY_LINK",
"realmId": "fabao",
"clientId": "pkulaw",
"userId": "e62a4ea6-c1c3-4f10-9136-8ceebba45339",
"sessionId": null,
"ipAddress": "111.198.143.194",
"error": null,
"details": {
"identity_provider": "carsi",
"identity_provider_identity": "student@pku.edu.cn",
"code_id": "6668189e-4cd6-488e-8582-d28b87636b41",
"username": "phone202408081431274571"
}
}

扩展消息,需要按以下步骤操作

  • 在org.keycloak.services.resources.IdentityBrokerService.afterFirstBrokerLogin方法中添加以下代码
  // 社区绑定现在有用户后,发的事件FEDERATED_IDENTITY_LINK,我们需要添加一些扩展信息
event.detail(Details.IDENTITY_PROVIDER, providerId);
event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getBrokerUserId()); //event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
event.detail("identity_provider_username", context.getUsername());
  • 添加之后,我们为FEDERATED_IDENTITY_LINK事件消息添加identity_provider_username
{
"time": 1723101725866,
"type": "FEDERATED_IDENTITY_LINK",
"realmId": "fabao",
"clientId": "pkulaw",
"userId": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"sessionId": null,
"ipAddress": "10.10.80.81",
"error": null,
"details": {
"identity_provider": "carsi",
"identity_provider_username": "student@pku.edu.cn",
"identity_provider_identity": "6zETJRPrWiBi7B85cCHPoVD7dyI\u003d",
"code_id": "c344f279-9786-468b-a67e-fecf39c531b0",
"username": "test"
}
}

keycloak~关于社区登录的过程说明的更多相关文章

  1. keycloak && docker安装 &&spring boot 集成使用

    1. 基础依赖 a. docker mysql b. dokcer keycloak-mysql   2. 安装     mysql (注意实际使用最好使用本地数据卷) docker run --na ...

  2. 在wildfly中使用SAML协议连接keycloak

    目录 简介 OpenID Connect和SAML SAML的工作流程 在keycloak中使用SAML 准备wildfy和应用程序 简介 我们知道SSO的两个常用的协议分别是SAML和OpenID ...

  3. keycloak~自定义redirect_uri的方法

    在使用keycloak集成springboot的过程中,对于需要授权访问的接口,它会跳到keycloak里进行登录,之前有个redirect_uri,登录成功后会跳回本客户端,而这个地址默认没有修改的 ...

  4. 组队项目,Main队伍

    本小组经过讨论,决定做的项目为----厨娘 分组情况: 1.界面设计:胡骏 2.前段,界面代码实现:梅庆 3.后台.逻辑处理:唐正奎.张军洪.袁成杰 4.数据库的建立与存写:张军洪.蒋利平 厨娘——需 ...

  5. selenium+python之自动换测试用例执行

    1.一个用例为一个完整的场景,从用户登陆系统到最终退出并关闭浏览器. 2.一个用例只验证一个功能点,不要试图在用户登陆系统后把所有的功能都验证一遍. 3.尽可能少的编写逆向逻辑用例.一方面因为逆向逻辑 ...

  6. sau交流学习社区第三方登陆github--oauth来实现用户登录

    sau交流学习社区第三方登陆github--oauth来实现用户登录 最近在丰富nodejsBlog开发的“交流学习社区”(https://www.mwcxs.top)的其他功能以及修复一些bug. ...

  7. Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  8. VS2019 Community社区版登录提示:我们无法刷新此账户的凭证 解决方法

    最正确的方式: 1.点击 帮助-->发送反馈-->报告问题 2.点击 检查新的许可证 ,即可登陆成功 3.如果提示:无法下载或者下载失败. 4.那么就需要在左边 账户选项 中将 嵌入式We ...

  9. aspnetcore 应用 接入Keycloak快速上手指南

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  10. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣的,于是来一篇详解登录原理的文章.本文会涉及到Claims-based(基于声明)的认证,我们会详细 ...

随机推荐

  1. SQLite vs MySQL vs PostgreSQL对比总结

    开发业务系统时,是绕不开RDBMS(关系型数据库)的.虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代. 近几年大大小小的项目中,常用的三种RDBMS(SQLite ...

  2. python UI自动化,怎么在控制台调试代码?

    Chrom 控制台调试脚本 http://testingpai.com/article/1606720137383 可以在任意网页按 F12 进入开发者工具,选择 console 输入 JS 代码: ...

  3. Mysql 使用(一)

    一.数据库的种类 关系型数据库 非关系型数据库 二.常见关系型数据库 oracle:在以前的大型项目中使用,银行,电信等项目 mysql:web时代使用最广泛的关系型数据库 ms sql server ...

  4. vs code 设置中文

    1.安装 下载地址:官网   打开 安装后打开默认显示英文界面. 2.修改 使用快捷键 ctrl+shift+p, 输入configure display language 下拉框选择 install ...

  5. 松灵机器人scout mini小车 自主导航(3)——建图导航仿真

    松灵机器人Scout mini小车建图导航仿真 在之前的文章中,我们已经介绍了如何在gazebo和rviz对scout mini小车进行仿真,并且测试了添加自定义的传感器,在本文章中将进一步介绍如何利 ...

  6. 背景色透明度兼容IE8的写法

    本文为Echoyya.所创,转载请带上原文链接,感谢 https://www.cnblogs.com/echoyya/p/14236242.html 通常的做法 目前大多数浏览器都支持 CSS3,只需 ...

  7. [oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc

    个人计算机浪潮 回忆上次内容 个人电脑(PC) 在爱好者之间疯传 人人都有一台计算机 从attair-8800到apple-1 个人电脑 离普通人 更近了 如果 人人都有 自己的电脑 谁还去 用终端连 ...

  8. [oeasy]python0041_ 转义字符_转义序列_escape_序列_sequence

    转义序列 回忆上次内容 上次回顾了5bit-Baudot博多码的来历 从 莫尔斯码 到 博多码 原来 人 来 收发电报 现在 机器 来 收发电报 输入方式 从 电键 改成 键盘 输出方式 从 纸带 变 ...

  9. oeasy教您玩转vim - 24 - 自定颜色

    自定颜色 回忆上节课内容 这次我们研究了配色方案 找到了 colors 的位置 下载并应用了颜色方案 制作了自己的配色方案 下面我想修改配色方案的颜色 是否能成功??? 首先得有自己的颜色方案 #找到 ...

  10. AT_arc113_c 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 现在有一个字符串 \(S\),每一次你可以选择一个 \(i(1 \le i \le | ...