Spring Boot集成Keycloak JWT认证返回401 提示iss claim无效
问题根因
返回Bearer error="invalid_token", error_description="The iss claim is not valid"是典型的JWT签发方校验不通过错误,核心原因是Spring Boot资源服务器配置的issuer-uri值,和Keycloak实际签发到JWT里的iss字段值不匹配,和接口权限逻辑、Token获取流程无关。
你当前配置存在两处明确错误:
spring.security.oauth2.resourceserver.jwt.issuer-uri配置值末尾多了一个斜杠,Keycloak为demo领域签发的JWT中,iss字段固定值为http://localhost:8080/realms/demo,不带末尾斜杠,多一个字符就会触发严格字符串匹配校验失败。- 自定义的
keycloak.auth-server-url配置值错误,填成了领域账户控制台的地址http://localhost:8080/realms/demo/account,该配置项的正确值为Keycloak服务的根访问地址。
修复步骤
- 修正
application.yaml配置项,调整后内容如下:
keycloak: realm: demo resource: spa-demo # 修正为Keycloak服务根地址,移除错误的路径后缀 auth-server-url: http://localhost:8080 spring: security: oauth2: resourceserver: jwt: jwk-set-uri: http://localhost:8080/realms/demo/protocol/openid-connect/certs # 移除issuer-uri末尾的斜杠,和JWT实际iss值完全匹配 issuer-uri: http://localhost:8080/realms/demo
- 重启Spring Boot服务后,重新从Keycloak获取Token再发起请求即可。
- 若修改后仍报错,可将Postman获取到的Bearer Token做Base64解码,查看Payload段的
iss字段实际值,保证配置的issuer-uri和该值完全一致(无端口、域名、路径字符差异)即可。你当前用kc.bat start-dev本地开发模式启动Keycloak,默认签发的Token iss值就是上述修正后的值,不需要额外调整Keycloak启动参数。
其他配置提示
- 你当前在SecurityConfiguration中将
/genere/**、/valutazione/**、/users/**、/carrello/**、/film/**路径全部设置为permitAll,访问根路径/会走JWT认证逻辑,符合当前报错触发场景,路径权限规则不需要额外调整。 - 等iss校验问题修复后,如果访问接口提示权限不足,注意Spring Security默认解析Keycloak JWT时,会给realm角色自动添加
ROLE_前缀、给Scope自动添加SCOPE_前缀,你当前@PreAuthorize("hasAuthority('user')")的写法需要配合自定义权限映射才能生效,和当前iss报错无关。
内容的提问来源于stack exchange,提问作者programmerconsociatio
相关产品推荐
相关产品推荐

