如何在Keycloak SPI中获取访问令牌?

时间:2020-09-04 13:32:24

标签: keycloak

用例:
从事件的EventListenerProvider内部,我想对我们的密钥斗篷安全服务之一进行经过身份验证的REST调用。为此,我需要一个令牌。

首先,我只是测试打印令牌以检查它是否成功。

  public void onEvent(final Event event) {
        Keycloak k = Keycloak.getInstance("http://localhost:8080/auth", "myrealm", "myemail@gmail.com", "password", "myclient");
        AccessTokenResponse t = k.tokenManager().getAccessToken();
        logger.info(t.getSessionState());
        logger.info(t.getToken());
   }

不幸的是,session_state和token均为NULL。

所有数据都是正确的,URL,领域等等。否则我们会知道的。 Keycloak不会记录任何内容,只是默默地返回null。
最重要的是,我可以在其他任何地方使用上述代码,并且可以正常工作!我可以通过简单的java main()方法使用它,但仍然可以使用。通过邮递员手动获取令牌也可以。

Keycloak提供程序有什么问题?如何获得特定用户的访问令牌?

1 个答案:

答案 0 :(得分:1)

您可以使用以下示例来创建 AccessToken:

public String getAccessToken(UserModel userModel, KeycloakSession keycloakSession) {
    KeycloakContext keycloakContext = keycloakSession.getContext();

    AccessToken token = new AccessToken();
    token.subject(userModel.getId());
    token.issuer(Urls.realmIssuer(keycloakContext.getUri().getBaseUri(), keycloakContext.getRealm().getName()));
    token.issuedNow();
    token.expiration((int) (token.getIat() + 60L)); //Lifetime of 60 seconds

    KeyWrapper key = keycloakSession.keys().getActiveKey(keycloakContext.getRealm(), KeyUse.SIG, "RS256");

    return new JWSBuilder().kid(key.getKid()).type("JWT").jsonContent(token).sign(new AsymmetricSignatureSignerContext(key));
  }

请注意,您还需要在 jboss-deployment-structure 中指定 <module name="org.keycloak.keycloak-services"/>