使用keycloak Java API获取有效令牌,然后使用该令牌尝试访问已通过keycloak保护但没有404错误(未找到)的rest服务。
似乎令牌不起作用?
这是我的Java代码,用于从keycloak获取令牌。看来可行:
AuthzClient authzClient = AuthzClient.create();
AccessTokenResponse response = authzClient.obtainAccessToken(user, password);
我在响应中得到一个有效的令牌。然后,我尝试使用此令牌访问通过密钥斗篷保护的REST服务:
String urlString = "http://localhost:3333/appname-1.0.0-SNAPSHOT/project/0.1/device/return/all";
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
我通过添加web.xml文件和keycloak.json文件来使用REST服务保护war文件。如果我从战争中删除了web.xml和keycloak.json文件,那么上面的代码将返回200。但是该服务并不安全。
web.xml:
<module-name>application</module-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>Device</web-resource-name>
<url-pattern>/device/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>device</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>KEYCLOAK</auth-method>
<realm-name>this is ignored currently</realm-name>
</login-config>
<security-role>
<role-name>device</role-name>
</security-role>
用户在密钥隐藏中具有设备角色。
有什么想法吗?
答案 0 :(得分:0)
首先,请从您的“ http://localhost:3333/ .......”资源服务器根目录URL中删除“ http://”,然后重试。如果那不能解决您的问题,我建议您使用邮递员之类的工具,以便您可以更快地测试/制作原型。
1-使用此endponit获取令牌(以x-www-form-urlencoded发送):HOST:PORT / auth / realms / YOUR_REALM / protocol / openid-connect / token
2个参数是:grant_type(值:密码),client_id,usernmae和密码(如果您的客户端的访问类型是“机密”或“仅承载者”,则还需要使client_secret私有)
3完成这项工作后,只需检查Java客户端中是否使用了相同的值即可。
希望有帮助。
编辑:好,这是XD的11个月大了...。没关系