首页 > 其他分享 >keycloak~自定义登出接口

keycloak~自定义登出接口

时间:2023-05-31 09:02:39浏览次数:37  
标签:自定义 登出 getRealm getContext TokenUtils session null keycloak

keycloak提供了登出的接口,不过它是一个post方法,需要你根据client_id,client_secret及refresh_token进行登出操作的,有时不太灵活,所以我又自己封装了一下,通过客户端浏览器上存储的session_id进行会话登出。

kc提供的logout

  • api:{{host}}/auth/realms/fabao/protocol/openid-connect/logout
  • 请求方法:POST
  • 请求类型:x-www-form-urlencoded
  • 参数:
refresh_token:xxx
client_id:xxx
client_secret:xxx

对remove-sessions登出的封装

  // keycloak会话登出逻辑
  @GET
  @NoCache
  @Path("remove-sessions")
  public Response deleteSession(@Context HttpRequest request,
                                @QueryParam("redirect_uri") String redirectUri) {
    return removeSession(TokenUtils.getKeycloakSessionIdFromCookies(request), redirectUri);
  }
private Response removeSession(String sessionId, String redirectUri) {
    if (redirectUri == null || redirectUri.trim().length() == 0) {
      log.info("redirect_uri不正确");
      return Response.status(400).entity("redirect_uri不正确").type(MediaType.TEXT_HTML).build();
    }

    TokenUtils.removeSession(session, sessionId);//清除会话
    return Response.status(302)
        .location(HttpUtils.formatUrl(HttpUtils.removeUrlSpaceParams(redirectUri)))
        .cookie(CookieUtils.addCookie(TokenUtils.KC_EXIT_LEGACY, "1"))
        .header(HttpHeaders.SET_COOKIE,
            CookieUtils.cookieString(TokenUtils.KC_EXIT, "1", "/", null, null, -1, true, true,
                ServerCookie.SameSiteAttributeValue.NONE))
        .build();
}
public static void removeSession(KeycloakSession session, String sessionId) {
    try {
      if (sessionId != null) {
        RealmModel realmModel = session.getContext().getRealm();
        log.debugf("will remove sessionId:%s", sessionId);
        UserSessionModel userSession = session.sessions().getUserSession(session.getContext().getRealm(), sessionId);
        if (userSession != null) {
          String path = String.format("/auth/realms/%s/", session.getContext().getRealm().getId());
          CookieUtils.expireCookie(session.getContext().getRealm(), TokenUtils.KEYCLOAK_SESSION,
              path, null, false,
              session.getContext().getConnection(), ServerCookie.SameSiteAttributeValue.NONE);
          CookieUtils.expireCookie(session.getContext().getRealm(), TokenUtils.KEYCLOAK_SESSION_LEGACY, path, null,
              false,
              session.getContext().getConnection(), null);
          CookieUtils.expireCookie(session.getContext().getRealm(), TokenUtils.AUTH_SESSION_ID,
              path, null, false,
              session.getContext().getConnection(), ServerCookie.SameSiteAttributeValue.NONE);
          CookieUtils.expireCookie(session.getContext().getRealm(), TokenUtils.AUTH_SESSION_ID_LEGACY, path, null,
              false,
              session.getContext().getConnection(), null);

          AuthenticationManager.backchannelLogout(session,
              realmModel,
              userSession,
              session.getContext().getUri(),
              session.getContext().getConnection(),
              session.getContext().getRequestHeaders(),
              true);

        }
      }
    } catch (Exception ex) {
      log.error(ex);
    }

  }

通过上面的封装,我们在其它对应到keycloak的客户端,直接在浏览器上输入/auth/realms/fabao/sms/remove-sessions?redirect_uri=your-site,就可以把keycloak在当前浏览器里的会话登出了,并重定向到自己的you-site网站。

标签:自定义,登出,getRealm,getContext,TokenUtils,session,null,keycloak
From: https://www.cnblogs.com/lori/p/17445039.html

相关文章

  • 【Unity】记录一下:自定义组件的InspectorGUI面板,修改数据不保存问题
    使用target修改之后需要使用EditorUtility.SetDirty设置为脏,但是要注意的是应该设置target所指代的组件,而非是对.gameObject设置为脏,这是没有用的。[CustomEditor(typeof(MerryGoRound))]publicclassMerryGoRoundEditor:Editor{publicoverridevoidOnInspectorGUI(......
  • NavigationTabBar 自定义底部导航栏
    先来页面效果导入依赖implementation'devlight.io:navigationtabbar:1.2.5'先创建三个Fragment,贴出其中一个Fragment的代码 fragment_home.xml<?xmlversion="1.0"encoding="utf-8"?><android.support.constraint.ConstraintLayoutxmlns:android="......
  • 记录--Vue3自定义一个Hooks,实现一键换肤
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助核心使用CSS变量,准备两套CSS颜色,一套是在light模式下的颜色,一套是在dark模式下的颜色dark模式下的CSS权重要比light模式下的权重高,不然当我们给html添加自定义属性[data-theme='dark']的时候,dark......
  • 自定义方法,实现按指定属性进行去重
    实例:根据age、sex、name对user对象集合进行去重//构建user对象publicclassUser{privateintid;privateStringname;privateintage;privateStringsex;privatedoubleheight;//构造方法、getter和setter略}//创建对象集合List<User......
  • priority_queue自定义比较函数的两种方法
    1#include<iostream>2#include<vector>3#include<queue>4usingnamespacestd;5intmain(){6structListNode{7intval;8ListNode*next;9ListNode():val(0),next(nullptr){}10L......
  • vscode 自定义代码字体颜色,局部变量、全局变量、函数、宏、属性
    vscode自定义代码字体与颜色风格在setting.json中修改即可:在这里插入图片描述"editor.semanticTokenColorCustomizations":{       "enabled":true,//enableforallthemes       "rules":{           "*.static":{             ......
  • 自定义表单设计器助您随心所欲定制专属表格!
    在新的发展时代,传统的表格设计器已经无法满足日愈繁杂的办公需求。那么,如何来定制专属的办公表格?其实,这也不是一件难事,只需要了解自定义表单设计器就行。在快速发展的现代化社会中,低代码开发平台也迎来了蓬勃的发展商机,它的灵活、简便和易操作等优势在无数行业办公领域深受喜爱,也......
  • 12)自定义函数
     1、创建自定义函数语法:createfunction函数名(参数1,参数2,...)returns返回值数据类型begin函数体return语句;end;要注意:1)、自定义函数是数据库的对象,创建时,需要指定该函数属于哪个数据库;2)、同一个数据库内,自定义函数不能和已有的函数名重名;3)、函数必须......
  • jwt原理,jwt开发流程,drf-jwt快速使用,drf-jwt定制返回格式,drf-jwt自定义用户表签发,drf-j
    jwt原理:  JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串1headerjwt的头部承载两部分信息:声明类型,这里是jwt声明加密的算法通常直接使用HMACSHA256公司信息......
  • jwt原理开发,drf-jwt快速使用和自定义使用,jwt签发认证源码分析
    一眼弄懂cookieSeesiontoken区别彻底弄懂cookie,session和token区别1jwt原理1.1使用jwt认证和使用session认证的区别1.2三段式eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEf......