首页 > 其他分享 >keycloak~关于社区登录的过程说明

keycloak~关于社区登录的过程说明

时间:2024-08-08 15:39:15浏览次数:8  
标签:社区 登录 loginType identity context IDENTITY keycloak

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": "[email protected]",
    "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": "[email protected]",
    "identity_provider_identity": "6zETJRPrWiBi7B85cCHPoVD7dyI\u003d",
    "code_id": "c344f279-9786-468b-a67e-fecf39c531b0",
    "username": "test"
  }
}

标签:社区,登录,loginType,identity,context,IDENTITY,keycloak
From: https://www.cnblogs.com/lori/p/18349064

相关文章

  • 详细分析帆软后台单点登录的配置事项(图文分析)
    目录前言1.插件安装2.模版认证3.单点登录以及加密4.测试前言帆软的文档,推荐阅读:帆软官网文档-单点阅读更多的知识点从帆软学习,以下文章只是做一个踩坑排查,以图文更好的展示为了保证安全,后端做用户的加密是最好的方式,从而实现无感登录与自身第三方平台......
  • uniapp | vue2 实现用户登录 记住账号密码 功能(附Demo)
    目录前言1.uniapp2.vue2前言文中分为两个方面,一个是uniapp小程序,一个是vue2前端(vue3其实同理,只不过格式稍有不同而已)初始界面(以vue2的界面为例)加入按钮之后,界面如下:1.uniapp整一个按钮框:<!-- 记住账号密码--><viewclass="remember-psw-container">......
  • 登录优化------修改密码后,旧的令牌应该失效
    我们以前使用的令牌,修改密码后,旧的令牌仍然可以使用,相当于仍然可以使用旧密码“登录”这很危险。这时候需要使用redis让旧令牌主动失效。实现思路:借助redis,当用户登录成功之后,依然需要生成令牌,但这个令牌它在响应给浏览器的同时也需要往redis中存储一份。当浏览器携带着令......
  • python+flask计算机毕业设计社区居民信息管理系统 (程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快,社区居民信息管理成为社区管理的重要组成部分。传统的社区管理方式存在信息更新不及时、管理效率低下等问题,难以满足......
  • 微信小程序-手机验证码短信登录接口(防薅方法)
    前言开发的小程序手机号短信验证码登录这一个功能,入参只有手机号。结局盗刷、恶意刷。解决方案1.nginx只允许referer是小程序来源的请求#你的接口location^~/api/{if($http_referer!~*"^https://servicewechat.com/【你的小程序appid】/\d+/page-fram......
  • ssh 远程登录报错:Unable to negotiate with IP port 22: no matching host key type f
    最近在Mac上想要远程一台Linux服务器,结果不知怎么的就不能使用以前的ssh登录了iot@ios-iMac~%[email protected]:nomatchinghostkeytypefound.Theiroffer:ssh-rsa,ssh-dss ......
  • Linux服务器SSH远程密钥免密登录
    说明业务场景中经常需要进行跨服务器的操作,即从一台服务器上登录到另外一台服务器,默认情况下,SSH远程登录时需要输入远程服务器密码。当需要在可信任的服务器之间进行频繁或自动化的操作时,输入密码就会带来不便。本文介绍如何实现SSH远程免密登录。服务器信息假设有2台服......
  • 【验证码逆向专栏】某安登录流程详解与验证码逆向分析与识别
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • CVE-2023-0562银行储物柜管理系统登录页面sql注入漏洞靶场复现
    在PHPGurukul银行储物柜管理系统1.0中发现了一个漏洞。它被评定为临界状态。受此问题影响的是组件登录的文件index.php的一些未知功能。对参数username的操作会导致sql注入。攻击可能是远程发起的。该漏洞已被公开,并可能被利用。此漏洞的标识符是VDB-219716。抓登录包放salmap......
  • pbootcms网站后台关闭验证码后, 无法登录问题解决方法
    最近闲来无事,在后台将pbootcms的登录验证码关闭了(全局配置-配置参数-安全配置-后台验证码)结果问题来了,第二天登录后台一直提示验证码不能为空。 这不是自己给自己找事吗!现在想输入验证码,也没有地方输入。 从程序上解决吧 apps\admin\controller\IndexController.ph......