如何在密钥罩SPI中获取访问令牌? [英] How to obtain an access token within a Keycloak SPI?

查看:23
本文介绍了如何在密钥罩SPI中获取访问令牌?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用案例:
在一个事件中,我想从EventListenerProvider内部对我们的一个受密钥罩保护的服务进行经过身份验证的睡觉调用。为此,我需要一个令牌。

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

  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和内标识都为NULL。

所有数据、url、域等都是正确的。否则我们就会知道那件事了。Keycloak不记录任何内容,只是静默返回NULL。
最重要的是,我可以从其他任何地方使用上面的代码,而且它起作用了!我可以从普通的java main()方法中使用它,并且仍然可以工作。通过邮递员手工领取代币也很管用。

密钥罩提供程序有什么问题?如何获取特定用户的访问令牌?

推荐答案

您可以使用以下示例创建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"/>

这篇关于如何在密钥罩SPI中获取访问令牌?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆