我正在使用Maximo 7.5 REST API,并希望在java中编写REST客户端以使用此RESTful服务。我在Maximo 7.5端启用了Maximo安全性,以保持Maximo用户访问自己的REST服务。下面是我的Maximo RESTful服务的web.xml。
<security-constraint>
<web-resource-collection>
<web-resource-name>REST Servlet for Web App</web-resource-name>
<description>Object Structure Service Servlet (HTTP POST) accessible by authorized users</description>
<url-pattern>/rest/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Roles that have access to Object Structure Service Servlet (HTTP POST)</description>
<role-name>maximouser</role-name>
</auth-constraint>
<user-data-constraint>
<description>data transmission gaurantee</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>REST Web Application Realm</realm-name>
</login-config>
我已成功使用Chrome的Postman插件查询Maximo REST服务。 2以下是我的邮递员(REST客户端)标题。 1. MAXAUTH - bWF4YWRtaW46bWF4YWRtaW4 = 2.接受--Application / xml
虽然我已在头文件中给出了授权(MAXAUTH),但我曾经在弹出窗口中输入用户名和密码来查询Maximo REST服务。一旦我提供凭据,我得到响应(如下所示)
以下是我使用相同RESTful服务的Java代码。我不断收到401错误,虽然我作为财产提供凭据,但它没有授权。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class RESTConsume {
// http://localhost:8080/RESTfulExample/json/product/get
public static void main(String[] args) {
try {
URL url = new URL("HOSTNAME/maxrest/rest/os/mxperson?personid=maxadmin");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "Application/xml");
connection.setRequestProperty("MAXAUTH", "bWF4YWRtaW46bWF4YWRtaW4=");
System.out.println("Output from Server ....1 \n");
/*
* if (conn.getResponseCode() != 200) {
* System.out.println("Output from Server ....2 \n");
*
* throw new RuntimeException("Failed : HTTP error code : "+
* conn.getResponseCode()); }
*/
System.out.println("Output from Server ....3 \n");
BufferedReader br = new BufferedReader(new InputStreamReader(
(connection.getInputStream())));
System.out.println("Output from Server ....4 \n");
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下是我的输出:
Output from Server ....1
Output from Server ....3
java.io.IOException: Server returned HTTP response code: 401 for URL: http://vhost0043.dc1.co.us.compute.ihost.com/maxrest/rest/os/mxperson?personid=maxadmin
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at RESTConsume.main(RESTConsume.java:35)
它适用于不同的RESTful服务(不是Maximo RESTful服务),并且没有启用我们没有任何安全性的预期响应。如果我需要做一些额外的事情来消费Maximo RESTful服务,请告诉我。
答案 0 :(得分:1)
如果user:password是您的用户名和密码,则编码64“user:password”(例如使用此工具:https://www.base64encode.org/)。然后如果“imimastrangestring”是encode64的输出设置为请求属性“MAXAUTH”:connection.setRequestProperty(“MAXAUTH”,“iamastrangestring”);
答案 1 :(得分:0)
服务正在使用用户名和密码,或者maxauth无效,因此在浏览器的情况下,它会提示您明确输入,但如果是maximo,则会获得401.请尝试提供用户名和密码标题。请求。
答案 2 :(得分:0)
您需要使用基本的http:
添加用户名和密码参数.../os/mxperson?_lid=username&_lpwd=password&_format=xml&personid=MAXADMIN
我认为您在使用LDAP时只能使用AUTH标头。
答案 3 :(得分:0)
在这里挖掘一个旧问题,但是当“我”遇到同样的问题时,我被Google引导回答,所以这可能对其他人有所帮助。
我在看这篇IBM文章:https://www.ibm.com/support/knowledgecenter/en/SSLKT6_7.6.0/com.ibm.mif.doc/gp_intfrmwk/rest_api/c_rest_security.html 其中,它列出了两种不同的身份验证选项。现在对我来说似乎很明显,但本文第一部分建议更改(并在帖子中显示为已更改)的XML块打开了 HTTP基本身份验证。如果没有这些设置,您需要使用本机身份验证。这让我有点意识到,也似乎是你混乱的根源。
这意味着,使用标准Maximo设置,它被配置为使用本机身份验证。您需要提供MAXAUTH标头属性,其值为“<username>:<password>
”base64编码。 Maximo将对其进行解码并获取用户名和密码,并将其与内部数据库进行比较。如果它们匹配,则认为该请求已通过身份验证,并且该服务将返回其结果。如果它们不匹配,您将被视为未经身份验证,并且您收到401错误。这意味着 Maximo 正在对其数据库进行身份验证。
如果您更改了链接文章中描述的设置,并且正如您所做并在问题中显示的那样,那么您说您不想使用该表单身份验证(我认为它实际上关闭了这种身份验证形式)。然后,您要说应用程序服务器对应用程序服务器的“数据库”而不是的Maximo进行身份验证。如果您想要针对LDAP(Active Directory)或类似的东西进行验证,这就是您想要的。
在这种情况下,需要使用HTTP基本身份验证标准发送用户名和密码。请参阅:https://en.wikipedia.org/wiki/Basic_access_authentication
这意味着你需要提供一个名为“Authorization”而不是“MAXAUTH”的头,并且该头的值必须是字符串“Basic”(注意大小写和空格)加上base64编码的字符串“<username>:<password>
”。例如,对于密码为“maxadmin”的用户“maxadmin”,“授权”标题的值为“Basic bWF4YWRtaW46bWF4YWRtaW4 =”。应用程序服务器获取该信息并解码用户名和密码。然后,它会检查那些配置为授权用户的内容(自己的数据库,LDAP,其他内容,某些组合)。如果它们不匹配(如果您甚至不提供此信息,则不会匹配),则该请求将被视为未经身份验证,您将收到401响应。如果它们匹配,则认为请求/用户已经过身份验证,然后应用服务器会将此请求/用户映射到角色(或多个角色),具体取决于已部署应用程序的应用服务器设置(进入不同的LDAP配置)讨论我不想在这里切入;这已经太久了。)然后将该角色传递给Maximo以获取请求。 Maximo接受该角色并检查它是否与其XML配置中配置的内容匹配(您在问题中引用的内容以及之前链接的IBM文章中显示的内容)。如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。如果它们匹配,则该请求被视为已授权,允许通过并且服务返回其响应。