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

sha*_*yne 9 api rest session keycloak

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

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

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

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

小智 4

您想要编辑逻辑并将其添加到 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();
}
Run Code Online (Sandbox Code Playgroud)