我想使用Keycloak和Bearer令牌在我的
Java REST端点中对用户进行身份验证.
我想要实现的工作流程如下:
>客户端使用用户名和密码登录Keycloak.
> Keycloak返回一个Bearer令牌(JWT,如果我没错,我该怎么检查?).
>客户端使用’授权’执行Http请求:’承载‘头.
> REST端点(用Java编写)检查收到的令牌是否正确,并验证从Keycloak接收Principal的用户(如果我理解正确的话).
>经过身份验证后,端点将检查用户是否有权访问该REST api并发回响应.
1,2,3和5已经实现并正常工作但我找不到实现方法4.
我已经尝试过不同的方法:
>我的Java端点在WildFly 10.x上发布的EAR中运行,因此我在web.xml中使用了安全约束,并通过keycloak.json配置了Keycloak.
这工作正常,但我需要在同一个Web上下文中保留一些REST端点公开(即使没有’授权’标题也可访问),据我所知,我无法过滤安全约束中的某些请求.
>我尝试实现BearerTokenRequestAuthenticator绝对没有成功,即使我不能认为我会因为我的身份验证请求而收到Principal.
现在我已经实现了一种过滤请求的方法,那些需要身份验证的方法被我实现的ServiceSecurityInterceptor类拦截.
在该类中的某个时刻,我检查’Authorization’标头是否包含Basic或Bearer:
User loggedUser = null;
if (authorizationType.equals("Basic")) {
// ... decode Base64 username and password ...
loggedUser = userManagerBean.login(username, password);
} else if (authorizationType.equals("Bearer")) {
String token = ...; // Get token from header
// ... Here is where I need to send the token to Keycloak and receive a Principal with the username ...
loggedUser = userManagerBean.login(username):
}
我在一些地方读到我可能需要一个来自我的Keycloak领域的公钥但是一旦我拥有它,我该怎么办?