keycloak - 如何在 Keycloak SPI 中获取访问令牌?
问题描述
用例:
从事件的 EventListenerProvider 内部,我想对我们的 keycloak 安全服务之一进行经过身份验证的 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。
所有数据都是正确的,网址,领域..等。否则我们会知道的。Keycloak 不会记录任何内容,只是默默地返回 null。
最重要的是,我可以在其他任何地方使用上面的代码并且它可以工作!我可以从普通的 java main() 方法中使用它并且仍然可以使用。通过邮递员手动获取令牌也可以。
Keycloak 提供程序有什么问题?如何获取特定用户的访问令牌?
解决方案
您可以使用以下示例创建 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));
}
请注意,您还需要<module name="org.keycloak.keycloak-services"/>
在 jboss-deployment-structure 中指定。
推荐阅读
- reactjs - 将 ReactApp 变成另一个 ReactApp 的可嵌入组件的最佳方法是什么?
- javascript - 如何从天气 api 中提取此数字以将其转换为华氏温度?
- java - Spring Tools Suite 4 没有 MVC 项目模板
- segmentation-fault - 是什么导致 gfortran 9.3.0 出现此 SEGMENTATION FAULT?
- bootstrap-modal - 在模态 .row 中引导 5 个不同的填充
- firebase - 如何强制测试 Firestore 并行事务?
- python-3.x - 如何使 Tkinter 文本框的高度为 2 但垂直居中文本?
- xslt - XSLT:在循环中交替填充字段
- mysql - mysql中的except关键字抛出EOF
- python - 如何在文件中查找和检查特定单词然后将其删除