记录以便使用 KeyCloak REST API 创建浏览器会话

Posted

技术标签:

【中文标题】记录以便使用 KeyCloak REST API 创建浏览器会话【英文标题】:Logging so as to create a browser session using KeyCloak REST API 【发布时间】:2021-01-25 23:09:14 【问题描述】:

KeyCloak 通过 KeyCloak 登录页面支持 SAML SSO。在此处登录后,将创建一个浏览器会话,该会话允许重定向到客户端应用程序网页而无需进一步登录。这行得通。 但是,在将用户重定向到客户端应用程序网页之前,我想使用自己的登录页面和脚本。

我已经能够使用用户的登录凭据(具有管理员权限)成功地从 Keycloak 服务器请求不记名访问令牌。但这不会创建浏览器会话。

我在文档中没有找到任何看起来像是创建会话的登录端点的调用 (https://documenter.getpostman.com/view/7294517 或 https://documenter.getpostman.com/view/7294517)。

任何方向或建议将不胜感激。 到目前为止,我在 php 中工作,并且一直将我的 API 调用作为来自 PHP 的 cURL 请求提交,有时使用 Postman 进行测试。

【问题讨论】:

【参考方案1】:

您想要编辑和添加逻辑到 keycloak 页面,或者使用另一个。

第一个选项是要走的路,keycloak 允许您自定义登录页面

查看https://www.baeldung.com/keycloak-custom-login-page

如果您仍想从现有令牌创建用户会话,则需要创建一个新端点来获取它。

这里有一个关于如何使用 keycloak spi 创建自定义端点的有用指南 https://medium.com/@gauravwadhone/keycloak-create-custom-rest-api-86e24bff4c1e

这里有我用来获取 cookie 的代码:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response get() 
    final HttpHeaders headers = session.getContext().getRequestHeaders();
    final String authorization = headers.getHeaderString(HttpHeaders.AUTHORIZATION);
    if(authorization == null) 
        throw new ErrorResponseException(Errors.INVALID_TOKEN, "Null authorization header",
                Response.Status.UNAUTHORIZED);
    
    final String[] value = authorization.split(" ");
    final String accessToken = value[1];
    final AccessToken token = Tokens.getAccessToken(accessToken, session);
    if (token == null) 
        throw new ErrorResponseException(Errors.INVALID_TOKEN, "Invalid access token", Response.Status.UNAUTHORIZED);
    
    final RealmModel realm = session.getContext().getRealm();
    final UriInfo uriInfo = session.getContext().getUri();
    final ClientConnection clientConnection = session.getContext().getConnection();
    final UserModel user = session.users().getUserById(token.getSubject(), realm);
    final UserSessionModel userSession = session.sessions().getUserSession(realm, token.getSessionState());
    AuthenticationManager.createLoginCookie(session, realm, user, userSession, uriInfo, clientConnection);
    return Response.noContent().build();

【讨论】:

以上是关于记录以便使用 KeyCloak REST API 创建浏览器会话的主要内容,如果未能解决你的问题,请参考以下文章

如何通过执行操作电子邮件通过 keycloak admin rest api 更新密码

如何使用 REST API 在 keycloak 中重置用户密码

如何使用 httppost/rest-api 从 keycloak 获取用户列表

Keycloak - 使用 Rest API 验证用户的电子邮件

使用 cUrl 通过其 REST API 配置 Keycloak

哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?