spring-boot - 我应该明确验证 Keycloak token 还是由 Keycloak 适配器完成?

标签 spring-boot spring-security oauth-2.0 keycloak bearer-token

有一个 Spring-boot REST API,需要通过 Keycloak 保护,该应用程序使用 Keycloak-Spring-Security 适配器 (6.0.1)。

对 API 端点的调用,携带从 Keycloak(目前通过 postman )获得的不记名 token 。

我能够执行成功的 REST 端点调用,但其他事情让我感到困扰 - 我是否应该根据公钥显式验证 token ?

1 - 适配器是否根据公钥执行 token 验证,还是我应该实现它?

2 - 如果适配器正在执行此操作 - 你能指出这是在哪些类中完成的吗?

3 - 如果 - 不是 - 应如何实现此验证?是否有任何 Keycloak 库可用于验证 token ?

最佳答案

好吧,在网上搜索了几天答案后 - 我找到了。 我查看了 Keycloak-spring-security-adapter 的代码并找到了它。

首先,我得到了用于 DEBUG 的 keycloak 的日志记录杆:

logging.level.org.keycloak=DEBUG

然后我尝试使用错误的 token 访问我的端点(我预计这会产生异常,即更明显的跟踪;它确实发生了):

    2019-10-17 10:18:57,905 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.PreAuthActionsHandler | adminRequest http://localhost:8081/error 
    2019-10-17 10:18:57,906 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter | Request is to process authentication 
    2019-10-17 10:18:57,906 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter | Attempting Keycloak authentication 
    2019-10-17 10:18:57,906 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.BearerTokenRequestAuthenticator | Found [1] values in authorization header, selecting the first value for Bearer. 
    2019-10-17 10:18:57,906 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.BearerTokenRequestAuthenticator | Verifying access_token 
    2019-10-17 10:18:57,908 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.BearerTokenRequestAuthenticator | Failed to verify token 
    2019-10-17 10:18:57,908 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.RequestAuthenticator | Bearer FAILED 
    2019-10-17 10:18:57,908 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter | Auth outcome: FAILED 
    2019-10-17 10:18:57,925 | 30860 | http-nio-8081-exec-2 |  |  |  |  | DEBUG |  | org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter | Authentication request failed: org.keycloak.adapters.springsecurity.KeycloakAuthenticationException: Invalid authorization header, see WWW-Authenticate header for details org.keycloak.adapters.springsecurity.KeycloakAuthenticationException: Invalid authorization header, see WWW-Authenticate header for details
        at org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter.attemptAuthentication(KeycloakAuthenticationProcessingFilter.java:158)
        at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    .....

从那时起,很明显 token 正在被验证,如果您查看参与的类,您会发现它在某些情况下正在根据公钥进行验证。

参与此身份验证和验证的类是,在我的例子中(bearer-only)是:

org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter
org.keycloak.adapters.BearerTokenRequestAuthenticator

希望这可以帮助其他像我一样的人在 Keycloak 中找到自己的出路。

关于spring-boot - 我应该明确验证 Keycloak token 还是由 Keycloak 适配器完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58389882/

相关文章:

spring-boot - 如何使用 spring boot 2.0 配置 redis ttl

java - 从 PostgreSQL 流式传输行(带获取大小)

oauth - OAuth 2.0 中公共(public)客户端有哪些限制

javascript - 快速响应未在 Sequelize catch 处理程序中执行

java - Spring 启动 : Unable to start embedded Tomcat servlet container

java - Tomcat 7 中部署的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找

spring-mvc - 使用 Spring Security 登录错误时如何获取用户?

spring - 匹配任何路径开头的 antMatchers

grails - Groovy下的Acegi用户类约束

swift - 列表需要 3 个元素,但我不知道第三个元素从哪里来