除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?
Posted
技术标签:
【中文标题】除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?【英文标题】:Do I need anything else besides a keycloak token to access a service secured with keycloak? 【发布时间】: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 【参考方案1】:我遇到了类似的问题,到处都是 404(最初很奇怪,因为我的浏览器可以验证端点,但我的代码/curl/postman 都没有)。
在我的例子中,我以为我得到了不记名令牌,但我实际得到的字符串是另一回事。不记名令牌应该很长(并且可以通过其他方法进行验证/比较)。
要对令牌进行邮递员调用:
发帖到:<host>/auth/realms/<realm>/protocol/openid-connect/token
添加标题 Content-Type : application/x-www-form-urlencoded
在正文中,选择 x-www-form-urlencoded 并确保包含:
我正在运行的代码正在检索 session_state(要短得多,而不是像我认为的那样检索不记名令牌)。出于某种原因,当提供不正确的承载令牌(甚至是过期的令牌)时,我的所有端点都解析为 404(而不是任何其他远程有用的代码)。
【讨论】:
以上是关于除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak :REST API 调用通过管理员用户名和密码获取用户的访问令牌
除了在hadoop集群中设置的时间之外,如何为长时间运行的应用程序更新委托令牌