【问题标题】:Authorization header on Axis 1.4 ServiceAxis 1.4 服务上的授权标头
【发布时间】:2016-12-09 16:43:46
【问题描述】:

我有一个使用 Axis 1.4 创建的旧 Web 服务,我需要使用它。要使其工作,必须在请求标头中添加以下令牌

授权:基本 {codifiedUsername}

使用soapui我没有任何问题,但是当我尝试将授权令牌添加到轴服务调用中时,服务响应错误,就像我没有在soapui上将codifiedUsername设置到请求标头中时一样

我正在使用以下代码尝试将令牌 Authorization: Basic {codifiedUsername} 添加到标头

String targetNamespace = "http://www.mysrevice/services/MyService";
String serviceName = "MyService";
String portName = "MyService";
String wsdlURL = "http://xxx.xx.xx.x:8080/idws2/services/MyService?wsdl";
QName qnameService = new QName(targetNamespace, serviceName);
QName qnamePort = new QName(targetNamespace, portName);
ServiceFactory factory = (ServiceFactory) ServiceFactory.newInstance();        
Service service = (Service)factory.createService(new URL(wsdlURL),qnameService);      
QName qnameOperation = new QName(targetNamespace, "validate");        
Call call = (Call)service.createCall(qnamePort, qnameOperation);           
String user="235654321";
byte[] bUser=usuario.getBytes();
String encoded=Base64.encode(bUser);
System.out.println("encoded user: "+encoded);                    
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement("http://myservice.com","MyServiceHeade r");
SOAPElement node = header.addChildElement("Authorization:");
node.addTextNode("Basic "+encoded);
call.addHeader(header);
Object[] params = {"6677","6778","001","trrtr"};
call.addHeader(header);
String response = (String)call.invoke(params);   

我还创建了 web 服务存根,以查看存根是否有任何方法来传递带有授权信息的标头,但我对轴知之甚少。这是我必须调用相同方法的代码

MyService myService = new MyServiceLocator();
MyServiceSoapBindingStub stub;              
stub = new MyServiceSoapBindingStub(new     URL(myService.getMyServiceAddress()),myService);               
String result=stub.validate("6677","6778","001","trrtr");     

所以我需要知道如何使用 java Axis 1.4 在服务调用或服务存根上正确设置授权令牌

谢谢

【问题讨论】:

  • usuario.getBytes() 应该是user.getBytes() 吗?另外,根据我的经验,Basic auth 的预期是 username:password 的 Base64 编码字符串,而不是 username;但我只看到传递给编码的用户名。
  • 用户已提供,但我忽略了简单性,还有命名空间和服务真实名称。用户编码对于 java 代码和soapui 请求是相同的。在soap ui标头上,请求使用授权发送:基本XXXXXXX
  • 我绝不是要居高临下,但我不确定这是否能回答我的问题或解决我的以下观点;我不明白你说的什么意思。如果您说您发布的代码不一定反映实际应用程序中发生的情况,那么很难帮助您找出问题所在。如果可以,请发布 MCVE(最小、完整和可验证的示例)。
  • 代码使用 wsdl 创建轴调用,在 base64 上编写用户名,创建参数,尝试创建标头以添加“授权:基本 {codedUsername}”,将标头添加到服务调用,然后调用一种服务方式。我省略了真实姓名,因为是机密信息,我只需要知道如何正确设置带有授权令牌的标头
  • 感谢您的澄清。我会指出我的原始评论,据我所知,REST Authorization: Basic 标头的形成如下:Authorization: Basic {codedUsernamePassword} 其中{codedUsernamePassword}Base64 编码String 遵循以下格式:username:password。我建议尝试一下。

标签: java web-services call axis stub


【解决方案1】:

为 Axis 1.4 设置 Auth 标头元素应如下所示:

SOAPHeaderElement auth = new SOAPHeaderElement(url,"Authentication");
SOAPHeaderElement user = new SOAPHeaderElement(url,"User", "string");
SOAPHeaderElement pass = new SOAPHeaderElement(url,"Password", "string");
auth.addChild(user);
auth.addChild(pass);
// add to Call object ...

这应该可以工作...然后就像使用现有的SOAPHeaderElement 一样添加到调用对象。

【讨论】:

  • 谢谢苏珊娜,所以你告诉我这样的事情应该可以工作 SOAPHeaderElement auth = new SOAPHeaderElement(url,"Authentication"); SOAPHeaderElement user = new SOAPHeaderElement(url,"Authorization", "Basic "+encoded); auth.addChild(用户); call.addHeader(auth);字符串响应 = (String)call.invoke(params); url 在哪里 服务命名空间 url 代码就可以了?
  • 是的,据我了解,这应该可以解决问题。如果解决了,请记得接受我的回答! :D
  • 遗憾的是我没有用,当我没有设置带有“授权”令牌的标头时,根据您的建议调用服务与使用 soapui 相同,也尝试只设置带有“授权”的令牌调用对象,结果相同。谢谢
  • 鉴于这是您的网络服务,您是否有办法在收到此请求时查看其结束时发生的情况?查看它所看到的内容可能会有所帮助,以便可以将其与 SoapUI 发送的内容进行比较。
  • 今天我要寻找一种方法来做到这一点,但我在soap ui中看到的是http标头是发送授权令牌的地方,昨天我发现了一个使用Axis 1.4授权令牌发送的例子使用 mimeheaders,但没有测试
猜你喜欢
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2010-10-28
相关资源
最近更新 更多