使用收到的访问令牌检索Keycloak用户数据

时间:2018-09-10 10:02:56

标签: java authentication wildfly keycloak

我正在开发一个WildFly-Backend(以Java语言编写),它可以接受HTTP请求(来自自定义前端),该请求是通过“授权” HTTP标头使用用户的Keycloak承载访问令牌签名的。

后端连接本身已经通过WildFly的Keycloak适配器进行了安全保护,但是在内部,我想检查用户是谁(用户组,名称等)并返回非常大的响应。

我认为可以只从Frontend发送此数据,但是一旦有了访问令牌,人们就可以轻松伪造该请求。有没有办法只拥有访问令牌就可以检索用户数据之类的东西?

1 个答案:

答案 0 :(得分:2)

此后我就想出了解决问题的方法!

首先,您在课程顶部附近添加以下内容:

@Context
SecurityContext securityContext;

这将注入服务器安全性的上下文。为了与Keycloak配合使用,WildFly将需要安装Wildfly适配器,并且必须将web.xml配置为使用Keycloak。

在继续之前,我们需要Keycloak-Core库,例如每个Maven:

<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-core -->
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-core</artifactId>
    <version>4.4.0.Final</version>
</dependency>

4.4.0.Final是撰写此答案时的最新版本;建议使用最新版本或与Keycloak服务器匹配的版本。

接下来,在要检索用户信息的位置,检索UserPrincipal:

if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
    KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());

其他检查是failaves,因此可以分别处理非Keycloak配置。

从强制转换的KeycloakPrinciple中,检索KeycloakSecurityContext,然后从中获取用户的令牌:

AccessToken token = principal.getKeycloakSecurityContext().getToken();

在某些情况下(取决于Keycloak和/或WildFly的版本),getToken()可能返回null。在这种情况下,请使用getIdToken():

IDToken token = principal.getKeycloakSecurityContext().getIdToken();

AccessToken扩展了IDToken,因此在这两种情况下,您都具有完整的功能(在这种情况下)。

可以从令牌中提取所有用户数据。例如,我们获取用户的用户名。在Keycloak中,此属性称为“首选用户名”。

String user = token.getPreferredUsername();

您完成了!您的完整代码现在看起来像这样:

if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
    KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
    AccessToken token = principal.getKeycloakSecurityContext().getToken();
    // IDToken token = principal.getKeycloakSecurityContext().getIdToken();

    System.out.println("User logged in: " + token.getPreferredUsername());
} else {
    System.out.println("SecurityContext could not provide a Keycloak context.");
}