除了 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 都没有)。

在我的例子中,我以为我得到了不记名令牌,但我实际得到的字符串是另一回事。不记名令牌应该很长(并且可以通过其他方法进行验证/比较)。

要对令牌进行邮递员调用: 发帖到:&lt;host&gt;/auth/realms/&lt;realm&gt;/protocol/openid-connect/token 添加标题 Content-Type : application/x-www-form-urlencoded 在正文中,选择 x-www-form-urlencoded 并确保包含:

grant_type client_id 用户名 密码

我正在运行的代码正在检索 session_state(要短得多,而不是像我认为的那样检索不记名令牌)。出于某种原因,当提供不正确的承载令牌(甚至是过期的令牌)时,我的所有端点都解析为 404(而不是任何其他远程有用的代码)。

【讨论】:

以上是关于除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak :REST API 调用通过管理员用户名和密码获取用户的访问令牌

除了在hadoop集群中设置的时间之外,如何为长时间运行的应用程序更新委托令牌

Keycloak:访问令牌验证端点

有没有人为 Keycloak 制作了导入功能?

除了静态库之外,我还可以使用“gcc -llibnamehere”绑定共享库吗?

Keycloak:从内部 docker 容器运行时令牌颁发者无效