首页 > 解决方案 > Keycloak mysql Standalone 使用 JHipster/Angular 生成的应用程序出错

问题描述

我正在使用 JHipster 生成(在线)Angular 和 Spring Boot 项目。当我使用 Keycloak 作为带有 H2 内存数据库的 docker 映像时,我可以让所有东西运行(这是默认的 hello world 示例)。我已经下载并将 Keycloak 设置为连接到 MySQL 的独立应用程序。我相信它工作正常,因为我可以看到我的 Keycloak 数据库正在 MySQL 中更新。

在 Keycloak 中,我添加了一个新领域“Acme”。我创建了一个名为“web_app”的新客户端。我不确定您需要哪些信息来帮助我理解我的错误。我在 Keycloak 中创建了一个用户,myname@acme.com(我为这篇 Stackoverflow 帖子伪装了这个),并使用了一个简单的密码。

当我以电子邮件/密码用户身份登录我的客户端应用程序时,它会将我重定向到 Keycloak,或者当我以 Google/Facebook 用户身份登录时,我会收到如下所示的相同错误。

登录错误

我在 Keycloak 中找到的带有此错误消息的代码如下:“[not_allowed] 用户或客户端不允许脱机令牌。”

public AccessTokenResponseBuilder generateRefreshToken() {
    if (accessToken == null) {
        throw new IllegalStateException("accessToken not set");
    }

    ClientScopeModel offlineAccessScope = KeycloakModelUtils.getClientScopeByName(realm, OAuth2Constants.OFFLINE_ACCESS);
    boolean offlineTokenRequested = offlineAccessScope==null ? false : clientSessionCtx.getClientScopeIds().contains(offlineAccessScope.getId());
    if (offlineTokenRequested) {
        UserSessionManager sessionManager = new UserSessionManager(session);
        if (!sessionManager.isOfflineTokenAllowed(clientSessionCtx)) {
            event.error(Errors.NOT_ALLOWED);
            throw new ErrorResponseException("not_allowed", "Offline tokens not allowed for the user or client", Response.Status.BAD_REQUEST);
        }

        refreshToken = new RefreshToken(accessToken);
        refreshToken.type(TokenUtil.TOKEN_TYPE_OFFLINE);
        sessionManager.createOrUpdateOfflineSession(clientSessionCtx.getClientSession(), userSession);
    } else {
        refreshToken = new RefreshToken(accessToken);
        refreshToken.expiration(getRefreshExpiration());
    }
    refreshToken.id(KeycloakModelUtils.generateId());
    refreshToken.issuedNow();
    return this;
}

当我以电子邮件/密码登录时,我通过 Keycloak 日志收到此错误。

21:11:55,478 WARN  [org.keycloak.events] (default task-1) type=CODE_TO_TOKEN_ERROR, realmId=acme, clientId=web_app, userId=7e361802-83ac-4441-8e8e-a2c431b3d542, ipAddress=127.0.0.1, error=not_allowed, grant_type=authorization_code, code_id=930ce6f2-4324-40d6-9ba1-de36a93d30c4, client_auth_method=client-secret

当我以 Google 提供商身份登录时,我通过 Keycloak 日志收到此错误。

21:20:20,574 WARN  [org.keycloak.connections.httpclient.DefaultHttpClientFactory] (default task-4) Truststore is disabled
21:20:44,307 WARN  [org.keycloak.events] (default task-4) type=CODE_TO_TOKEN_ERROR, realmId=acme, clientId=web_app, userId=9dd5c436-299a-409c-9232-442218f9f41b, ipAddress=127.0.0.1, error=not_allowed, grant_type=authorization_code, code_id=6847b494-86b6-4046-a81f-bb40c911e1e9, client_auth_method=client-secret

以下是我正在使用的 URL 和端口。

Angular Client: http://localhost:9000
Spring Boot Server: http://localhost:8081
Keycloak: http://localhost:8080

下面是我的 Keycloak、客户端、web_app 设置。让我知道还有什么可以分享来帮助调试。

Keycloak -> 客户端 -> Web_app 客户端设置

我希望这个 JHipster(Angular/Spring Boot)能够与 Keycloak 一起作为独立环境使用,因为带有内存 H2 数据库的示例 docker 映像无法满足我在生产中的需求。docker 镜像非常适合作为沙箱或概念证明,但我需要让这个独立的 MySQL 环境正常工作。我可能必须使用 Okta,但它们不支持 Twitter 登录,所以我试图让 Keycloak 工作。

谢谢您的帮助。

标签: jhipsteropenidkeycloak

解决方案


推荐阅读