Angular - Spring 启动 - Keycloak - 401 错误

Angular - Spring Boot - Keycloak - 401 Error

我正在尝试使用由 Keycloak 保护的 Spring Boot Restservice 来实现 Angular 应用程序。

在我的本地计算机上找到一切正常。 Angular 应用程序由 Keycloak(使用 keycloak-angular)引导,所以我必须登录才能看到该应用程序。应用程序将 Restcalls 与令牌一起发送到 Spring Boot。 Restservice keycloak.bearer-仅接收令牌并使用令牌中的角色进行过滤。

这在本地运行得非常好,但是从我在服务器上部署它的那一刻起,每次我尝试使用启用的 keycloak 访问我的 Restservice 时,我都会收到 401 错误。 (我在 Keycloak 上登录并拥有有效令牌)。

这是我在 Spring 启动调试日志上得到的:

2020-04-06 12:28:54.854 DEBUG 1962 --- [nio-2001-exec-2] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}
2020-04-06 12:28:54.875 DEBUG 1962 --- [nio-2001-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2020-04-06 12:28:54.970 DEBUG 1962 --- [nio-2001-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [application/json, text/plain, */*] and supported [application/json, application/*+json, application/json, application/*+json]
2020-04-06 12:28:54.971 DEBUG 1962 --- [nio-2001-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Mon Apr 06 12:28:54 CEST 2020, status=401, error=Unauthorized, message=No message availab (truncated)...]
2020-04-06 12:28:55.051 DEBUG 1962 --- [nio-2001-exec-2] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 401

Keycloak-我的 Spring 启动的一部分 application.properties:

keycloak.enabled=true
keycloak.auth-server-url=http://172.16.1.20:8180/auth
keycloak.realm=Immodat
keycloak.resource=login-app
keycloak.bearer-only=true
keycloak.cors=true
keycloak.security-constraints[0].authRoles[0]=aa.intern.write
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/

有一个用 CrossOrigin 注释的 RestController。而且里面的所有方法都有GetMapping, PostMapping,...

@RestController
@CrossOrigin
public class FormController {

    @PostMapping("/forms")
    Form createForm(@RequestBody Form form) {
        /* ... */
    }

    @GetMapping("/forms/{name}")
    Form getForm(@PathVariable String name) {
        /* ... */
    }

    .
    .
    .
}

在 Keycloak-Client-Settings Return-Url 和 Web-Origin 中都设置为“*”以允许从任何地方访问。

有什么我遗漏的吗?在本地一切正常。在服务器上,如果 Keycloak 被禁用,但所有三个都不起作用。

好的,我找到问题了。可能有点傻。

三台服务器中的一台时间错误,因此 Keycloak-Token 对这台服务器无效。

如果您遇到 401 错误并且不知道为什么,请检查您的服务器时间!