Angular - Spring Boot - Keycloak - 401错误

Posted

技术标签:

【中文标题】Angular - Spring Boot - Keycloak - 401错误【英文标题】:Angular - Spring Boot - Keycloak - 401 Error 【发布时间】:2020-07-18 07:11:41 【问题描述】:

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

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

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

这是我在 Spring Boot 调试日志中得到的:

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

我的 Spring Boot application.properties 的 Keycloak-Part:

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 被禁用,也可以在服务器上,但所有三个一起都不起作用。

【问题讨论】:

【参考方案1】:

好的,我发现了问题。可能有点傻。

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

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

【讨论】:

以上是关于Angular - Spring Boot - Keycloak - 401错误的主要内容,如果未能解决你的问题,请参考以下文章

Angular 基本身份验证 Spring Boot

Angular集成Spring Boot,Spring Security,JWT和CORS

在 Spring Boot 中将 Angular 环境变量传递给编译的静态 Angular 文件

Spring Boot + Angular 2 结构

Angular - Spring Boot - Keycloak - 401错误

Angular 4.0 + Spring boot + Spring Security:TemplateInputException:解析模板“登录”时出错