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 错误并且不知道为什么,请检查您的服务器时间!
我正在尝试使用由 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 错误并且不知道为什么,请检查您的服务器时间!