【发布时间】:2019-02-19 06:56:23
【问题描述】:
我可以从 keycloak 获取有效的令牌,但是当我尝试使用令牌访问它时,我仍然从使用 keycloak 保护的服务获得 404 not found 响应。我还需要做什么?访问使用 keycloak 保护的服务还需要什么?
我正在取回不记名令牌。
我创建了最简单的服务,并将其作为 WAR 部署到 Wildfly。我将keycloak适配器安装到wildfly中,并在war中添加了一个keycloak.json文件,同时修改了web.xml。
对于 web.xml,我添加了文档中的信息:
<module-name>application</module-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>Resources</web-resource-name>
<url-pattern>/resources/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>KEYCLOAK</auth-method>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
我将用户角色添加到 keycloak
我有一个客户端程序,它接受用户和密码并从 keycloak 安装中获取令牌
AuthzClient authzClient = AuthzClient.create();
AccessTokenResponse response = authzClient.obtainAccessToken(name, password);
String tokenStr = response.getToken();
然后我尝试使用该令牌对使用 keycloak 保护的 WAR 进行 REST 调用:
String urlString = "http://localhost:8080/simple-rest-0.0.1-SNAPSHOT/resources/message";
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
String authString = "Bearer " + tokenStr;
con.setRequestProperty("Authorization", authString);
basicStatus = con.getResponseCode();
basicStatus 返回 404。我只是在这里使用了 keycloak 错误吗?我错过了什么吗?
【问题讨论】:
-
如果 keycloak 不工作,你应该得到一个未经授权的 501。 404 表示找不到页面。你确定页面在那里?另外,您能否提供更多信息,例如您正在使用哪个容器(TomEE、Wildfly 等)以及您如何设置 keycloak(例如,将支持 jar 放入 TomEE)
-
我在帖子中添加了更多信息。
-
如果您删除安全约束,您可以访问端点还是仍然得到 404?如果您在这里查看我的要点gist.github.com/chongma/bc97c30ba1fdcce9d059a506bccba0dc,这就是我从 keycloak 客户端获取访问令牌的方式。我使用 cxf webclient 返回一个 KeycloakToken 对象。我以 KeycloakToken 对象为例。 access_token 是您需要用作不记名令牌的位。我不确定您是否可以使用那里的令牌,因为我觉得我以前尝试过。但也许你可以......
-
从 web.xml 中删除安全约束无效。我仍然得到 404。
-
在添加安全层之前尝试使用 REST 客户端测试与您的 REST 端点的连接。我使用 ARC(高级休息客户端)作为 chrome 插件。在服务器启动时使用 TomEE,它会列出您的端点及其位置,以便您查看它们的部署位置。不确定wildfly
标签: java rest http token keycloak